ใช้งานจริงของ TCP_DEFER_ACCEPT หรือไม่


15

ฉันอ่านคู่มือ httpd ของ Apache ออนไลน์และพบกับคำสั่งสำหรับการเปิดใช้งานนี้ พบคำอธิบายในหน้าคนสำหรับtcp:

   TCP_DEFER_ACCEPT (since Linux 2.4)
          Allow a listener to be awakened only when data arrives on the
          socket.  Takes an integer value (seconds), this can bound the
          maximum number of attempts TCP will make to complete the
          connection.  This option should not be used in code intended
          to be portable.

จากนั้นฉันได้พบบทความนี้แต่ฉันก็ยังไม่ชัดเจนว่าภาระงานประเภทใดที่จะเป็นประโยชน์ ฉันสมมติว่าหากhttpdมีตัวเลือกเฉพาะสำหรับสิ่งนี้มันจะต้องมีความเกี่ยวข้องกับเว็บเซิร์ฟเวอร์ ฉันยังสมมติว่ามันเป็นตัวเลือกและไม่ใช่แค่การhttpdเชื่อมต่อเครือข่ายที่มีกรณีการใช้งานที่คุณต้องการและอื่น ๆ ที่คุณไม่ต้องการ

แม้หลังจากอ่านบทความแล้วฉันยังไม่แน่ใจว่าจะได้ประโยชน์จากการจับมือทั้งสามแบบนี้อย่างไร ดูเหมือนว่าจะมีประโยชน์เพื่อให้แน่ใจว่าไม่จำเป็นต้องสลับในhttpdอินสแตนซ์ที่เกี่ยวข้องด้วยการทำเช่นนั้นในขณะที่การจับมือยังดำเนินต่อไปแทนที่จะทำให้เกิดความล่าช้าหลังจากการเชื่อมต่อเกิดขึ้น

สำหรับบทความดูเหมือนว่าสำหรับฉันแล้วไม่ว่าTCP_DEFER_ACCEPTสถานะของซ็อกเก็ตจะเป็นอย่างไรคุณยังต้องใช้แพ็กเก็ตสี่ชุด (การจับมือกันตามด้วยข้อมูลในแต่ละกรณี) ฉันไม่ทราบว่าพวกเขาจะนับได้ถึงสามครั้งได้อย่างไร

ดังนั้นคำถามของฉันก็คือ: นี่เป็นเพียงตัวเลือกที่ล้าสมัยหรือมีกรณีการใช้งานจริงสำหรับตัวเลือกนี้หรือไม่?


ฉันไม่ชัดเจนในสิ่งที่คุณหมายถึงโดย "รับนับถึงสาม" ซึ่งทำให้ฉันสงสัยว่าคุณเข้าใจผิดจับมือสามทาง นี่เป็นธุรกรรม TCP "การเชื่อมต่อแบบเปิด" และประกอบด้วย 3 แพ็กเก็ตทั้งหมดที่ส่ง จนกว่าทั้งสามนี้จะเสร็จสมบูรณ์ไม่มีข้อมูลและไม่มีการเชื่อมต่อที่ถูกต้อง เนื่องจากข้อมูลดังกล่าวไม่ได้รวมอยู่ในค่าใช้จ่ายของการจับมือกัน การเพิ่มประสิทธิภาพในการที่จะได้รับจากการ TCP_DEFER_ACCEPT จะเป็นช่องว่างระหว่างความสำเร็จของ 'ยอมรับ' TCP 3 วิธีการจับมือกันและส่งข้อมูลครั้งแรก (ผมถือว่าส่วนใหญ่ที่นี่เพื่อแสดงความคิดเห็นในการจับมือ 3 เทียบกับวิธีที่ 4)
Iain

นอกจากนี้มันไม่เกี่ยวกับการหลีกเลี่ยง 'การสลับใน' มันไม่เกี่ยวกับการสูญเสียทรัพยากร หากการสลับเปลี่ยนเป็นปัจจัยในการเปิดใช้งานผู้ปฏิบัติงาน HTTP คุณจะบังคับให้ผู้ปฏิบัติงานของคุณสลับก่อนกำหนดที่จุดรับข้อมูลก่อนที่ข้อมูลจะพร้อม ... และหากการแลกเปลี่ยนเกิดขึ้นนั่นหมายความว่าคุณกำลังบังคับบางอย่าง หน่วยความจำ ... บางสิ่งบางอย่างที่อาจทำบางสิ่งบางอย่างและได้รับการสลับกลับไปมาระหว่างส่วนที่ยอมรับ / ข้อมูลของคุณ ... ทรัพยากรใดก็ตาม - CPU, diskIO, หน้า in-ram หากไม่มีข้อมูลก็ไม่มีประโยชน์
Iain

หากกระบวนการของผู้ปฏิบัติงานอยู่ในหน่วยความจำแล้วความล่าช้าในการตอบสนองค่อนข้างต่ำเมื่อเทียบกับการไปที่ดิสก์ "ถึงสาม" คือการอ้างอิงถึงบทความที่ระบุว่าอย่างใดสิ่งนี้จะทำให้มันเพื่อให้แพ็กเก็ตแรกของข้อมูลจากลูกค้าจะอยู่ในแพ็คเก็ตที่สาม
Bratchley

นอกจากนี้การแลกเปลี่ยนทางทฤษฎีจะเกิดขึ้นต่อไปสิ่งนี้จะไม่เปลี่ยนแปลงกับตัวเลือก TCP นี้ ฉันไม่เห็นว่าการลดช่องว่างในการสร้างการเชื่อมต่อ TCP และการใช้การถ่ายโอนข้อมูลนั้นมีประโยชน์อย่างไร อย่างน้อยเมื่อคุณทำในระหว่างการเชื่อมต่อ TCP มีความเป็นไปได้ของทั้งสองเกิดขึ้นในแบบคู่ขนาน (ลดระยะเวลา)
Bratchley

ควรเขียนเพียงคำตอบ ... ในเรื่องของตัวเลือกมันไม่ใช่วิธีการทำงานปกติของยูนิกซ์ "ปกติ" ... โดยเฉพาะเกี่ยวกับ HTTP ประเด็นสำคัญคือไคลเอนต์ (เว็บเบราว์เซอร์) เริ่มการสนทนากับ รับบรรทัด ... ดังนั้นเซิร์ฟเวอร์ไม่สนใจการเชื่อมต่อจริงเพียงข้อมูลแรก ซึ่งตรงกันข้ามกับที่บอกว่า SMTP ซึ่งลูกค้าต้องการให้รอจนกว่าเซิร์ฟเวอร์จะออกข้อความ "แบนเนอร์ต้อนรับ 220" นั่นคือเซิร์ฟเวอร์นั้นจำเป็นต้องรู้ในการเชื่อมต่อไม่ใช่ในข้อมูล
Iain

คำตอบ:


14

(เพื่อสรุปความคิดเห็นของฉันเกี่ยวกับ OP)

การจับมือสามทางที่พวกเขาอ้างถึงเป็นส่วนหนึ่งของการจัดตั้งการเชื่อมต่อ TCP ตัวเลือกในคำถามไม่เกี่ยวข้องกับเรื่องนี้โดยเฉพาะ นอกจากนี้โปรดทราบว่าการแลกเปลี่ยนข้อมูลไม่ได้เป็นส่วนหนึ่งของการจับมือสามทางนี่เป็นเพียงการสร้างการเชื่อมต่อ TCP ในสถานะเปิด / กำหนด

เกี่ยวกับการดำรงอยู่ของตัวเลือกนี้นี่ไม่ใช่พฤติกรรมดั้งเดิมของซ็อกเก็ตโดยปกติเธรดของตัวจัดการซ็อกเก็ตจะตื่นขึ้นเมื่อการเชื่อมต่อได้รับการยอมรับ (ซึ่งยังคงอยู่หลังจากการจับมือทั้งสามทางเสร็จสมบูรณ์) เช่นเซิร์ฟเวอร์ SMTP ส่งข้อความทักทาย 220 บรรทัด แต่สำหรับ HTTP ข้อความแรกในการสนทนาคือเว็บเบราว์เซอร์ส่งบรรทัด GET / POST / etc และจนกระทั่งเกิดเหตุการณ์นี้เซิร์ฟเวอร์ HTTP จะไม่สนใจการเชื่อมต่อ (นอกเหนือจากเวลา) ออก) ดังนั้นการปลุกกระบวนการ HTTP เมื่อซ็อกเก็ตยอมรับเสร็จสมบูรณ์เป็นกิจกรรมที่สิ้นเปลืองเนื่องจากกระบวนการจะเผลอหลับอีกครั้งโดยทันทีเพื่อรอข้อมูลที่จำเป็น

ในขณะที่มีข้อโต้แย้งว่าการตื่นขึ้นกระบวนการว่างสามารถทำให้พวกเขา 'พร้อม' สำหรับการประมวลผลเพิ่มเติม (ฉันจำได้โดยเฉพาะการตื่นขึ้นมาเข้าสู่ระบบเทอร์มินัลบนเครื่องเก่ามากและมีพวกเขามาจากสลับ) การสลับกระบวนการดังกล่าวได้ทำให้เกิดความต้องการทรัพยากรและความต้องการที่ไม่จำเป็นเพิ่มเติมอาจลดประสิทธิภาพของระบบโดยรวม - แม้ว่าประสิทธิภาพของเธรดของคุณจะดีขึ้น (ซึ่งอาจไม่ได้เครื่องที่ยุ่งมากจะมีปัญหาคอขวดบนดิสก์ IO) ชะลอสิ่งอื่น ๆ ลงถ้าคุณสลับและถ้าไม่ว่างการนอนทันทีอาจสลับกลับทันที) ดูเหมือนว่าจะเป็นการเดิมพันและในที่สุดการเดิมพัน 'โลภ' ก็ไม่จำเป็นว่าจะต้องจ่ายให้กับเครื่องที่ไม่ว่าง

คำแนะนำทั่วไปของฉันเกี่ยวกับการปรับแต่งระดับนั้นจะไม่ทำการตัดสินใจเชิงโปรแกรมเกี่ยวกับสิ่งที่ดีที่สุดอยู่แล้ว แต่เพื่ออนุญาตให้ผู้ดูแลระบบและระบบปฏิบัติการทำงานร่วมกันเพื่อจัดการกับปัญหาการจัดการทรัพยากร - นั่นคืองานของพวกเขา เหมาะสำหรับการทำความเข้าใจปริมาณงานของทั้งระบบและอื่น ๆ ให้ตัวเลือกและตัวเลือกการกำหนดค่า

ในการตอบคำถามโดยเฉพาะตัวเลือกนี้มีประโยชน์สำหรับการกำหนดค่าทั้งหมดไม่ใช่ระดับที่คุณอาจสังเกตเห็นยกเว้นภายใต้ปริมาณการรับส่งข้อมูล HTTP จำนวนมาก แต่เป็นวิธีที่ "ถูกต้อง" ในทางทฤษฎี มันเป็นตัวเลือกเพราะไม่ใช่ทุก Unix (ไม่ใช่แม้แต่ลีนุกซ์ทุกตัว) รสชาติมีความสามารถนั้นและเพื่อความสะดวกในการพกพาสามารถกำหนดค่าไม่ให้เอียง


ขอบคุณสำหรับบทสรุปที่ยอดเยี่ยม ในขณะที่การโหลดเซิร์ฟเวอร์และการแลกเปลี่ยน / การใช้งานกระบวนการไม่ได้ใช้งานนั้นเป็นข้อได้เปรียบอย่างหนึ่งที่เป็นไปได้ (สิ่งหนึ่งที่เหมาะสมยิ่งตามที่คุณกล่าวไว้) มีประโยชน์ที่ชัดเจนหากคุณดูที่เซิร์ฟเวอร์ HTTP ที่ให้บริการไคลเอนต์ ตัวอย่างเช่นเมื่อใช้งาน Apache เว็บเซิร์ฟเวอร์จะมีกระบวนการ / เธรดเซิร์ฟเวอร์จำนวนคงที่ซึ่งหมายความว่าสามารถให้บริการลูกค้าจำนวนคงที่ได้ทุกเวลา ดังนั้นไม่“ ใช้ up” กระบวนการเซิร์ฟเวอร์ในขณะที่แพ็กเก็ต“ data” จากไคลเอนต์ยังไม่มาถึงอาจหมายความว่ากระบวนการเซิร์ฟเวอร์สามารถให้บริการไคลเอ็นต์อื่นในเวลาเฉลี่ย
Ram

-1

ฉันไม่ชัดเจนว่าประโยชน์ที่จะรอให้การจับมือทั้งสามทางเสร็จสมบูรณ์จะเป็นอย่างไร

Handshakes สามทางเป็นโปรโตคอลทั่วไปในระบบโทรศัพท์:

  1. เซิร์ฟเวอร์ : "สวัสดีตอนเย็น, Epiphyte Corp. "
  2. ผู้โทร : "สวัสดีนี่คือแรนดี้"
  3. เซิร์ฟเวอร์ : "ใช่ฉันจะช่วยคุณได้อย่างไร"
  4. ผู้โทร : ร่างกายของการโทรเริ่มร้องขอเรื่องตลก

พวกเขามีความสำคัญใน TCP เพื่อให้มั่นใจว่าช่องทางที่จัดตั้งขึ้น หากลูกค้าเริ่มส่งสัญญาณก่อนที่จะได้ยิน (3) มีโอกาสที่เซิร์ฟเวอร์จะไม่ฟังหรือไม่พร้อม การพิจารณาคดี (3) ไม่รับประกันว่าเซิร์ฟเวอร์จะไม่ได้รับการเผาไหม้ทันทีหลังจากการส่ง แต่จะเพิ่มความมั่นใจว่าเซิร์ฟเวอร์พร้อมที่จะรับ

ตามที่ระบุไว้ในWikipedia เกี่ยวกับการจับมือกัน :

  1. อลิซ [เซิร์ฟเวอร์] ตอบกลับพร้อมข้อความตอบรับพร้อมหมายเลขตอบรับ y + 1 ซึ่ง Bob [ลูกค้า] ได้รับและตอบกลับโดยไม่จำเป็นต้องตอบกลับ

ดังนั้นหากคุณยินดีที่จะละทิ้งความมั่นใจเพิ่มเล็กน้อยที่เซิร์ฟเวอร์พร้อมเซิร์ฟเวอร์สามารถข้ามขั้นตอน (3) และไคลเอนต์จะสันนิษฐานว่าเซิร์ฟเวอร์พร้อมแล้ว สิ่งนี้จะเปลี่ยนการแลกเปลี่ยนโปรโตคอลด้านบนเป็น:

  1. เซิร์ฟเวอร์ : "สวัสดีตอนเย็น, Epiphyte Corp. "
  2. ผู้โทร : "สวัสดีนี่คือแรนดี้"
  3. ผู้โทร : "คุณรู้จักเรื่องตลกเกี่ยวกับ Imelda Marcos บ้างไหม"

มันเป็นมากกว่าแค่ความมั่นใจคุณส่งก่อน 3way ที่เสร็จสมบูรณ์และข้อมูลของคุณถูกขัดจังหวะ วิธีการตั้งค่าการเชื่อมต่อ TCP ในสแต็คระบบปฏิบัติการสมัยใหม่ไม่มีข้อมูลการเชื่อมต่อเข้าสู่ระบบจริงจนกว่าส่วนที่ 3 ของการเชื่อมต่อความต้องการของข้อความที่ 3 ก่อนที่จะมีการใช้ทรัพยากรใด ๆ ผ่านทาง "Syn คุกกี้" และ ป้องกัน "การโจมตี Syn" (ซึ่งเป็นปลอมแปลงแพ็กเก็ต handshake-source-ip 1 แพ็คเก็ต 3 ที่ทำลาย IP ต้นทางปลอมแปลงนั้น) ดังนั้นจึงไม่มีการเชื่อมต่อหรือรายการให้ชัดเจนก่อนจุดนี้
29411 iain

การพิจารณาคดี (3) ไม่รับประกันว่าเซิร์ฟเวอร์จะไม่ได้รับการเผาไหม้ทันทีหลังจากการส่ง แต่จะเพิ่มความมั่นใจว่าเซิร์ฟเวอร์พร้อมที่จะรับ
msw

เพิ่มขึ้น? จากศูนย์? ใช่ฉันเดาตามตัวอักษรจริง แต่คนส่วนใหญ่จะบอกว่ามี / บาง / โอกาสก่อนที่จะแพ็คเก็ต 3 เพื่อเพิ่ม และไม่มี เป็นเพียงวลี "เพิ่มความมั่นใจ" ที่ฉันไม่ชอบและฉันไม่คิดว่าการแยกตัวประกอบใน 'ประเด็นสำคัญที่สำคัญในโลกแห่งความจริง' 0.001% จะช่วยให้ปัญหาชัดเจนขึ้น แน่นอนว่าสงครามนิวเคลียร์อาจเกิดขึ้นก่อนที่เซิร์ฟเวอร์จะได้รับแพ็คเก็ตมีหลายสิ่งที่อาจเกิดขึ้นได้
Iain

นอกจากนี้ฉันเพิ่งหยิบขึ้นมาในวรรคสุดท้ายซึ่งคุณหมายถึงขั้นตอนที่ 3 เป็นตัวเลือก มันไม่ใช่อย่างนั้นไม่ใช่ อ่านย่อหน้าอีกครั้งขั้นตอนที่ 3 คือ "alice ตอบกลับพร้อมข้อความตอบรับ" นั่นไม่ใช่ทางเลือก bob ตอบกลับไปที่ (ขั้นตอนที่ 4 ตามทฤษฎี) คือ
Iain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.