TIME WAIT ในการเชื่อมต่อ TCP มีวัตถุประสงค์อะไร?


12

ฉันพบว่าสาเหตุที่แอ็คทีฟเข้าใกล้ TIME WAIT คือเพื่อให้แน่ใจว่า ACK สุดท้ายจะไม่สูญหาย แต่จะรู้ได้อย่างไรว่า ACK สุดท้ายนั้นหายไป? Passive ที่ใกล้จะส่ง FIN อีกครั้งจากนั้น Active ที่ใกล้จะรู้ว่า ACK หายไปหรือไม่ นี่คือรูปภาพของ TCP FSM

TCP FSM



1
โพสต์บล็อกนี้มีคำตอบที่ยอดเยี่ยม: vincent.bernat.im/en/blog/ ......
Chimpanzee

คำตอบ:


5

Passive ที่ใกล้จะส่ง FIN อีกครั้งจากนั้น Active ที่ใกล้จะรู้ว่า ACK หายไปหรือไม่

ใช่. การอ้างอิงจากTCP / IP Illustrated Volume 1ในส่วนการจัดการการเชื่อมต่อ TCP:

  1. เพื่อสิ้นสุดการปิดเซกเมนต์สุดท้ายจะมี 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และปิดการเชื่อมต่อ


1

แต่จะรู้ได้อย่างไรว่า ACK สุดท้ายนั้นหายไป?

เพราะมันไม่ได้รับภายในระยะเวลาหมดเวลา ฉันรู้ว่านั่นคือคำตอบ "duh" แต่นั่นเป็นเหตุผลว่าทำไมรัฐและหมดเวลาใช้งาน

ผู้ที่อยู่ใกล้เรื่อย ๆ จะส่ง FIN อีกครั้ง

ไม่ไม่เว้นแต่จะมีแพ็คเก็ตเพิ่มเติมสำหรับสตรีมนั้นและนั่นจะส่งผลให้ "RST" (รีเซ็ต) ถูกส่ง

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

TL; DR โครงสร้างสถานะนั้นออกแบบมาเพื่อจัดการกับทุกโหมดความล้มเหลวที่เป็นไปได้


ขอบคุณ แต่ฉันยังคงสับสนเกี่ยวกับส่วนแรก ฉันหมายถึงการที่แอคทีฟใกล้ชิดรู้ว่า ACK นั้นไม่ได้รับการตอบโต้โดย Passive เมื่อ Passive ใกล้เข้ามารับ ACK มันจะทำให้ด้านข้างของการเชื่อมต่อขาดหายไปและถ้ามันไม่ได้รับ ACK มันจะอยู่ใน LAST ACK ดังนั้นผู้ที่อยู่ใกล้ยิ่งขึ้นรู้ว่า ACK นั้นได้รับอย่างไร
czhao

เพราะมีตัวจับเวลาติดอยู่กับทุกรัฐ
Ricky Beam

ขอโทษฉันไม่เข้าใจ ตัวจับเวลาเหล่านี้จะบอกผู้ใช้อย่างใกล้ชิดได้อย่างไรว่า passive passive ไม่ได้รับ ACK สุดท้าย นั่นคือผู้ที่อยู่ใกล้จะรู้ได้อย่างไรว่าจะต้องส่ง ACK สุดท้ายอีกครั้ง
czhao

0

วัตถุประสงค์ของ 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 จูน /

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