通常一個完整的TCP:從三次握手建立連接,互相各發送一個數據報,然後通過四次握手斷開連接的流程。
下面以在172.16.48.13(以下簡稱13)上建立一個TCP客戶端進程,連接172.16.48.1(以下簡稱1)的5002端口。然後向1發送一個數據報,1收到後,向13也發送一個數據,然後13發送FIN主動斷開連接。1也隨後發送它的FIN,完成斷開連接,這整個過程,總共有11個數據報,其中三次握手3個,數據通訊4個,斷開連接4個。
下面我們列出這11個數據報的主要內容,爲簡潔起見,略去如源和目的端口等一些非關鍵信息。
序號 確認序號 標誌 數據三次握手建立連接:
13發送SYN: 0x000007bc(0) 0x00000000(0) SYN 無
1發送ACK,
並同時發送SYN: 0xab2b9dc7(0) 0x000007bd(1) SYN ACK 無
13發送ACK: 0x000007bd(1) 0xab2b9dc8(1) ACK 無
數據收發:
13發送數據報: 0x000007bd(1) 0xab2b9dc8(1) PSH ACK 21字節負載數據
1發送ACK: 0xab2b9dc8(1) 0x000007d2(22) ACK 無
1發送數據報: 0xab2b9dc8(1) 0x000007d2(22) PSH ACK 34字節負載數據
13發送ACK: 0x000007d2(22) 0xab2b9dea(35) ACK 無
四次握手斷開連接:
13發送FIN: 0x000007d2(22) 0xab2b9dea(35) FIN ACK 無
1發送ACK: 0xab2b9dea(35) 0x000007d3(23) ACK 無
1發送FIN: 0xab2b9dea(35) 0x000007d3(23) FIN ACK 無
13發送ACK: 0x000007d3(23) 0xab2b9deb(36) ACK 無
表中序號後面的括號中是十進制的相對序號,從零開始。三次握手完成,兩端因爲各發送一個SYN而各佔用一個序號,數據收發階段,13發送一個21字節的數據報,佔用21個序號,1發送一個34字節的數據報而佔用34個序號,斷開連接階段,兩端因爲各發送一個FIN而各佔用一個序號。所以,最後,13共佔用1+21+1=23個序號(0-22),而1共佔用1+34+1=36個序號(0-35)。
從表中可以看到,如果一端發送一個數據報後,不需要對端迴應,緊接着發送第二個數據報,則這兩個數據報實際上會ACK對端的同一個數據報,表中,13的第一個ACK和(PSH ACK),都應答了1的(ACK,SYN)。在數據通訊階段,TCP協議對收到的每一個數據報都要進行ACK確認,否則對方會超時重傳。