Sunday, August 5, 2007

TCP Connection State (Part 1)

หลังจากที่สงสัยมานาน จากตัวโปรแกรม TCPView (หาโหลดได้ที่ http://www.microsoft.com/technet/sysinternals/Utilities/TcpView.mspx) ในช่อง state ว่า state CLOSE_WAIT, CLOSING, LAST_ACK, FIN_WAIT_1, FIN_WAIT_2 มันคือ state อะไรกันแน่ ในที่สุดก็ยอมอ่านซะที

ขอแสดง state ทั้งหมดของ TCP Connection ก่อนดีกว่า (ตาม rfc 793) มันมี LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSING, LAST-ACK, TIME-WAIT และสุดท้าย state ที่คุณไม่มีวันเห็นก็คือ CLOSED

ก่อนจะบอกว่าแต่ละ state ทำอะไรขอพูดเรื่อง Control bit ใน TCP Header นิดนึงกับ 3-Way Handshake ก่อนละกัน

ตัว TCP Header จะมี Control bit อยู่ทั้งหมด 6 bits คือ URG, ACK, PSH, RST, SYN, FIN โดยบิท ACK, RST, SYN, FIN เป็นตัวหลักในการกำหนดการเปลี่ยนแปลงของ connection state

ในการเชื่อมต่อจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง ด้วย TCP ฝั่ง server จะต้องเปิด port ทิ้งไว้ โดยฝั่ง server จะเรียก state ที่เปิด port ว่า LISTEN และก่อนที่จะเริ่มส่งข้อมูลกันได้ ก็จะมีการทำที่เรียกว่า 3-Way Handshake ดังนี้
    Client                         Server
0. CLOSED LISTEN
1. SYN-SENT --> SYN --> SYN-RECEIVED
2. ESTABLISHED <-- SYN,ACK <-- SYN-RECEIVED
3. ESTABLISHED --> ACK --> ESTABLISHED

1. Client จะส่ง packet โดยจะ set SYN bit ใน TCP header ไปยัง client เมื่อจบขั้นตอนนี้ state ที่ฝั่ง client จะเป็น SYN-SENT และ state ของ server จะเป็น SYN-RECEIVED
2. Server จะตอบ client โดยการ set SYN และ ACK bit ใน TCP header
เมื่อจบขั้นตอนนี้ state ที่ฝั่ง client จะเป็น ESTABLISHED และ state ของ server ยังคงเป็น SYN-RECEIVED
3. Client ตอบ server ด้วยการ set ACK bit ใน TCP header
เมื่อจบขั้นตอนนี้ state ของทั้ง client และ server จะเป็น ESTABLISHED

หลังจาก 3-Way handshake ก็จะทำการเริ่มส่งข้อมูล

เหนื่อยแหละ พอก่อน ถ้าไม่นับ CLOSED ก็อธิบายไปแล้วนะ 4 state คือ LISTEN, SYN-SENT, SYN-RECEIVED และ ESTABLISHED ที่เหลือจะอยู่ในช่วงที่จะปิด connection ต่อคราวหน้า

4 August 2007

Reference:
[1] RFC 793 - Transmission Control Protocol, http://www.rfc.net/rfc793.html

No comments:

Post a Comment