การเชื่อมต่อยังมีชีวิตอยู่ แต่จุดสิ้นสุดตายไปแล้ว?


1

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

ไคลเอ็นต์กำลังติดตั้ง Ubuntu 11.04 เรื่องนี้เกิดขึ้นกับฉันสองสามครั้งแล้ว แต่ฉันดูเหมือนจะไม่เข้าใจว่าทำไมหรือวิธีการแก้ปัญหา


โปรโตคอลนี้คืออะไร (หนึ่งชั้นโดยตรงผ่าน TCP หนึ่งที่ระบุว่าไบต์ส่งค่าเฉลี่ยที่ส่งพวกเขาเมื่อและอื่น ๆ ..)
เดวิด Schwartz

คำตอบ:


3

การเชื่อมต่อยังคงอยู่ ESTABLISHED ในด้านหนึ่งและไม่มีอยู่อีกฝั่งหนึ่งเนื่องจากเป็นสถานะที่อยู่หลังจากเซิร์ฟเวอร์รีสตาร์ท ไคลเอนต์ไม่ทราบว่าเซิร์ฟเวอร์รีสตาร์ทและเซิร์ฟเวอร์ไม่รู้ว่าไคลเอ็นต์คิดว่ายังคงเชื่อมต่ออยู่ เว้นแต่ลูกค้าพยายามใช้การเชื่อมต่อมันจะยังคงอยู่แบบนี้ตลอดไป (ยกเว้นเปิดใช้งาน keepalives ซึ่งในกรณีนี้จะยังคงเป็นเช่นนี้เป็นเวลาประมาณสองวัน)

ทำไมลูกค้าต้องรอเซิร์ฟเวอร์ตลอดไป! ไคลเอ็นต์หรือโปรโตคอลใช้งานไม่ได้ หากลูกค้าไม่ปฏิบัติตามโปรโตคอลลูกค้าจะเสีย หากโปรโตคอลไม่ได้ระบุวิธีตรวจจับการเชื่อมต่อที่ไม่ทำงานโปรโตคอลนั้นจะใช้งานไม่ได้

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.