เหตุใดจึงใช้เวลาหลายนาทีในการทำความสะอาดพอร์ต TCP ที่รับฟังหลังจากที่โปรแกรมหยุดทำงาน


27

ถ้าฉันฆ่าโปรแกรมที่กำลังฟังพอร์ต TCP จะใช้เวลานานหลายนาทีจนกว่าระบบจะเรียกคืนพอร์ตโดยใช้งานได้อีกครั้ง ฉันเคยเห็นคำถามหลายข้อเกี่ยวกับปรากฏการณ์นี้ แต่ไม่มีคำอธิบาย เหตุใดจึงเกิดขึ้นทำไมระบบไม่เรียกคืนพอร์ตทันที มันเกิดขึ้นกับระบบอื่นเช่น Windows หรือ Mac หรือไม่

คำตอบ:


25

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

ฉันไม่รู้เกี่ยวกับระบบปฏิบัติการอื่น แต่ฉันคิดว่าสิ่งเหล่านี้มีลักษณะคล้ายกันบ้าง

วิธีแก้ปัญหาสำหรับปัญหานี้คือการตั้งค่าSO_REUSEADDRบนซ็อกเก็ตซึ่งควรละเว้นTIME_WAITสถานะ


3
การตรวจสอบแผนภาพสถานะ TCP ที่เชื่อถือของฉันฉันจะเห็นได้ว่า TIME_WAIT เป็นสถานะสุดท้ายของซ็อกเก็ตและโดยทั่วไปยังคงอยู่สำหรับ 2MSL - ซึ่งเป็นสองเท่าของอายุการใช้งานเซกเมนต์สูงสุด ข้อมูลจำเพาะ (RFC793) ระบุว่านี่เป็น 2 นาทีโดยให้ทั้งหมด 4 นาที นี่จะช่วยให้มีเวลาเพียงพอสำหรับการร้องขอและการตอบกลับใด ๆ ที่ยังคง "อยู่ในระหว่างการบิน" เพื่อประมวลผลและลงจอดที่โปรแกรมด้านขวา - หรือจะถูกยกเลิกหากซ็อกเก็ตอยู่ใน TIME_WAIT
Faelkle

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