Tuesday, August 7, 2007

TCP Connection State (Part 2)

หลังจาก Part1 เกี่ยวกับ establish TCP connection เสร็จแล้ว ระหว่างการส่งข้อมูล จะมีการ set ACK bit ใน TCP header ตลอด และสุดท้ายเมื่อส่งข้อมูลครบแล้วก็คือการปิด connection

ใน 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)
CLOSED
1. เครื่อง 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                           CLOSED
1. เครื่อง 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