ใน Part นี้จะพูดเกี่ยวกับ state ที่เหลือที่ค้างไว้ ซึ่งทั้งหมดจะอยู่ในช่วงของการปิด connection
Note: การปิด connection ของ TCP จะหมายถึงจะไม่ส่งข้อมูลอีกแล้ว
ในการปิดมี 3 แบบที่สำคัญใน (จาก rfc 793) แต่จะขอพูดแค่ 2 แบบ ซึ่งจะแสดงครบทุก state แล้วคือ
Case 1: มีการเริ่มปิด connection จากฝั่งหนึ่ง
TCP A TCP B 0. ESTABLISHED ESTABLISHED 1. FIN-WAIT-1 --> FIN,ACK --> CLOSE-WAIT 2. FIN-WAIT-2 <-- ACK <-- CLOSE-WAIT 3. TIME-WAIT <-- FIN,ACK <-- LAST-ACK 4. TIME-WAIT --> ACK --> CLOSED 5. (2 MSL) CLOSED1. เครื่อง A จะส่ง packet โดย set FIN ไปยังเครื่อง B เพื่อบอกว่าจะปิด connection และจะเห็นว่า ACK bit ได้ถูก set ด้วย ซึ่ง ACK อันนี้หมายถึงตอบกลับว่าได้รับข้อมูลถึงไหนแล้ว ขณะนี้ state เครื่อง A จะเป็น FIN-WAIT-1 และเครื่อง B เป็น CLOSE-WAIT
2. เครื่อง B จะตอบด้วย ACK เมื่อเครื่อง A ได้รับ ACK จะถือว่าเครื่อง A ได้ปิด connection เสร็จแล้ว ขณะนี้เครื่อง A จะไม่มีการส่งข้อมูลอีก แต่ยังรับข้อมูลอยู่ได้ ส่วนเครื่อง B จะยังส่งและรับข้อมูลได้ เมื่อจบขั้นตอนนี้ state ของเครื่อง A จะเป็น FIN-WAIT-2 และเครื่อง B เป็น CLOSE-WAIT
3. เมื่อเครื่อง B ต้องการจะปิด connection ก็จะส่ง FIN ไปยังเครื่อง A (ACK flag เหมือนกับขั้นตอน1) โดย state ของเครื่อง A จะเป็น TIME-WAIT และเครื่อง B เป็น LAST-ACK
4. เครื่อง A ตอบกลับด้วย ACK เมื่อเครื่อง B ได้รับจะถือว่าเครื่อง B ปิด connection เสร็จแล้ว และเมื่อทั้งฝั่งปิด connection เสร็จแล้วจะถือว่าจบการ connection เมือถึงขั้นตอนนี้ state ของเครื่อง A ยังคงเป็น TIME-WAIT และเครื่อง B เป็น CLOSED
5. เครือง A หลังจากเข้าสู่ state TIME-WAIT จะคอยอีก 2 MSL (Maximum Segment Life) โดย 1 MSL ใน rfc793 จะกำหนดไว้ที่ 120 วินาที แล้วถึงเข้า state CLOSED
* สาเหตุที่ต้องคอยอีก 2 MSL หลังจาก TIME-WAIT มันต้องอธิบายเกี่ยวกับ Sequence Number ด้วย ถ้าใครสนใจก็อ่านเพิ่มได้จาก rfc
Case 2: ทั้งสองฝั่งปิด connection พร้อมกัน
TCP A TCP B 0. ESTABLISHED ESTABLISHED 1. FIN-WAIT-1 <--> FIN,ACK <--> FIN-WAIT-1 2. CLOSING <--> ACK <--> CLOSING 3. TIME-WAIT TIME-WAIT (2 MSL) (2 MSL) CLOSED CLOSED1. เครื่อง A และ B ขอปิด connection พร้อมกัน โดยส่ง packet ที่ set FIN flag พร้อมกัน ซึ่ง state ทั้ง 2 เครื่องจะเป็น FIN-WAIT-1
2. เครื่อง A และ B จะตอบด้วย ACK เพื่อจบ connection โดยขณะที่ส่ง ACK แต่ยังไม่รับของอีกฝ่าย state จะเป็น CLOSING
3. เมื่อได้รับ ACK ทั้งสองฝั่งจะเข้าสู่ state TIME-WAIT และคอยอีก 2 MSL แล้้วเปลี่ยนเป็น state CLOSED
สรุป
จากที่กล่าวมาทั้งหมดจาก Part1 และ Part2 สามารถสรุปเป็น diagram สำหรับแสดงการเปลี่ยนแปลงของ state ดังนี้ (diagram นี้เป็นแค่สรุป ไม่ใช่ specification ทั้งหมดนะ)
Diagram จาก RFC 793
สรุปความหมายของแต่ละ state ได้ดังนี้
- LISTEN คือกำลังคอย connection request (SYN) จาก remote TCP และ port
- SYN-SENT คือกำลังคอยการตอบกลับ (SYN,ACK) หลังจากได้ส่ง connection request (SYN)
- SYN-RECEIVED คือกำลังคอยการยืนยัน connection (ACK) หลังจากตอบกลับ connection request (SYN, ACK)
- ESTABLISHED คือได้เปิด connection สมบูรณ์แล้ว และมีการส่งข้อมูลอยู่
- FIN-WAIT-1 คือกำลังคอยการปิด หลังจากส่ง connection termination request (FIN)
- FIN-WAIT-2 คือกำลังคอย connection termination request (FIN) จากอีกฝั่ง หลังจากปิด connection ของฝั่งตัวเองแล้ว
- CLOSE-WAIT คือกำลังคอยปิด connection จาก local user โดยได้รับและตอบกลับ connection termincation request (FIN และ ACK) จากอีกฝั่งแล้ว
- CLOSING คือกำลังคอยการปิด หลังจากส่ง connection termination request (FIN) และได้รับ connection termination request ด้วย (ก็คือส่ง FIN ไปแล้ว ได้รับ FIN มาก่อน แต่ยังไม่รับ ACK)
- LAST-ACK คือกำลังคอยการปิด หลังจากส่ง connection termination request (FIN) จาก state CLOSE-WAIT
- TIME-WAIT คือคอยให้เวลาผ่านไป 2MSL เพื่อให้แน่ใจว่า remote TCP ได้รับ ACK และปิด connection ไปแล้ว
- CLOSED คือ state ที่ไม่มี connection ใดๆ ทั้งสิ้น
11 August 2007
Reference:
[1] RFC 793 - Transmission Control Protocol, http://www.rfc.net/rfc793.html
No comments:
Post a Comment