ฉันพบว่าสาเหตุที่แอ็คทีฟเข้าใกล้ TIME WAIT คือเพื่อให้แน่ใจว่า ACK สุดท้ายจะไม่สูญหาย แต่จะรู้ได้อย่างไรว่า ACK สุดท้ายนั้นหายไป? Passive ที่ใกล้จะส่ง FIN อีกครั้งจากนั้น Active ที่ใกล้จะรู้ว่า ACK หายไปหรือไม่ นี่คือรูปภาพของ TCP FSM
ฉันพบว่าสาเหตุที่แอ็คทีฟเข้าใกล้ TIME WAIT คือเพื่อให้แน่ใจว่า ACK สุดท้ายจะไม่สูญหาย แต่จะรู้ได้อย่างไรว่า ACK สุดท้ายนั้นหายไป? Passive ที่ใกล้จะส่ง FIN อีกครั้งจากนั้น Active ที่ใกล้จะรู้ว่า ACK หายไปหรือไม่ นี่คือรูปภาพของ TCP FSM
คำตอบ:
Passive ที่ใกล้จะส่ง FIN อีกครั้งจากนั้น Active ที่ใกล้จะรู้ว่า ACK หายไปหรือไม่
ใช่. การอ้างอิงจากTCP / IP Illustrated Volume 1ในส่วนการจัดการการเชื่อมต่อ TCP:
- เพื่อสิ้นสุดการปิดเซกเมนต์สุดท้ายจะมี ACK สำหรับ FIN ล่าสุด โปรดทราบว่าถ้า FIN หายไปมันจะถูกส่งใหม่จนกว่าจะได้รับ ACK
มีการหมดเวลา เมื่อLAST_ACK
เข้ามาใกล้เรื่อย ๆ จะมีการส่งใหม่FIN
เมื่อหมดเวลาโดยสมมติว่ามันหายไป หากมันหายไปแน่นอนจากนั้นผู้ที่เข้ามาใกล้ที่สุดจะได้รับการส่งFIN
และป้อนTIME_WAIT
ใหม่ในที่สุด หากFIN
ไม่ได้หายไป แต่สุดท้ายACK
ก็หายไปจากนั้นที่อยู่ใกล้เข้ามาTIME_WAIT
และได้รับFIN
อีกครั้ง เมื่อสิ่งนี้เกิดขึ้น - การรับFIN
เข้าTIME_WAIT
- ACK
จะถูกส่งใหม่
ค่าหมดเวลาใช้งานTIME_WAIT
จะไม่ถูกใช้เพื่อจุดประสงค์ในการส่งใหม่ เมื่อมีการหมดเวลาใช้TIME_WAIT
งานจะถือว่าการACK
ส่งมอบครั้งสุดท้ายสำเร็จเนื่องจากการเข้าใกล้แบบพาสซีฟไม่ได้ส่งFIN
แพ็กเก็ตอีกครั้ง ดังนั้นการหมดเวลาTIME_WAIT
เป็นเพียงระยะเวลาหลังจากที่เราสามารถสรุปได้อย่างปลอดภัยว่าหากปลายอีกข้างไม่ได้ส่งอะไรเลยนั่นเป็นเพราะเขาได้รับรอบสุดท้ายACK
และปิดการเชื่อมต่อ
แต่จะรู้ได้อย่างไรว่า ACK สุดท้ายนั้นหายไป?
เพราะมันไม่ได้รับภายในระยะเวลาหมดเวลา ฉันรู้ว่านั่นคือคำตอบ "duh" แต่นั่นเป็นเหตุผลว่าทำไมรัฐและหมดเวลาใช้งาน
ผู้ที่อยู่ใกล้เรื่อย ๆ จะส่ง FIN อีกครั้ง
ไม่ไม่เว้นแต่จะมีแพ็คเก็ตเพิ่มเติมสำหรับสตรีมนั้นและนั่นจะส่งผลให้ "RST" (รีเซ็ต) ถูกส่ง
กระบวนการทั้งหมดเป็นเครื่องรัฐที่ซับซ้อนในการดำเนินการปิดระบบอย่างเป็นระเบียบแม้จะมีความเป็นไปได้ของความล้มเหลวของเครือข่าย เครือข่ายหยุดทำงานข้อผิดพลาดเกี่ยวกับลิงก์การเชื่อมโยงกลายเป็นอิ่มตัวและต้องปล่อยแพ็กเก็ตอุปกรณ์ล้มเหลว ฯลฯ ขณะออกกำลังกายให้รันแผนผังสถานะสำหรับการเชื่อมต่อที่ใช้งานอยู่เมื่อจุดปลายทางจุดใดจุดหนึ่งหายไป (เช่นความล้มเหลวด้านพลังงาน)
TL; DR โครงสร้างสถานะนั้นออกแบบมาเพื่อจัดการกับทุกโหมดความล้มเหลวที่เป็นไปได้
วัตถุประสงค์ของ TIME_WAIT คือการอนุญาตให้เครือข่ายแยกแพ็คเก็ตที่มาถึงซึ่งเป็นของการเชื่อมต่อ 'เก่าที่มีอยู่' จากเครือข่ายใหม่ คำแนะนำคือการตั้งค่าตัวจับเวลา TIME_WAIT เป็นสองเท่าของอายุการใช้งานสูงสุด (MSL) ในระบบของฉัน MSL คือ 1 นาทีดังนั้นการเชื่อมต่อจะอยู่ในสถานะ TIME_WAIT เป็นเวลา 2 นาที
หลังจากระยะเวลานี้แพ็กเก็ตใด ๆ ที่มาถึงจะไม่เชื่อมโยงกับการเชื่อมต่อเดิมอีกต่อไป
TIME_WAIT ไม่ได้รอการส่งแพ็กเก็ต ACK โดยตรง ที่ขับเคลื่อนโดยสถานะ CLOSE_WAIT และ FIN_WAIT เมื่อคุณไปถึง TIME_WAIT สถานะซ็อกเก็ตถูกปิดแล้ว
ข้อมูลอ้างอิง: http://www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm https://en.wikipedia.org/wiki/Maximum_segment_lifetime http://www.lognormal.com/blog/2012/09/27/ ลินุกซ์ TCPIP จูน /