TCP連接的建立與終止
- 建立連接
- 第一次握手
- 第二次握手
- 第三次握手
- 終止連接
- 第一次揮手
- 第二次揮手
- 第三次揮手
- 第四次揮手
T C P是一個面向連接的協議。無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。本文將詳細討論一個T C P連接是如何建立的以及通信結束后是如何終止的。
如何使用抓包工具 wireshark
建立連接
為了建立一個TCP連接:
第一次握手
- 請求端發送一個S Y N段指明連接的服務器的端口,以及初始序號(
ISN
)。這個SYN段為報文段1。
使用抓包工具得到以下內容,可以看到:- 指定了源端口和目標端口,什么?怎么沒有
IP
地址,IP
地址在IP
首部呢! - 序號為
1514758884
,序號并不從0
開始,而是生成ISN
。序號為什么不從0開始? SYN=1
表明這是一個連接請求或連接接受報文- 窗口大小聲明為
64240
- 指定了源端口和目標端口,什么?怎么沒有
第二次握手
- 服務器發回包含服務器的初始序號的S Y N報文段(報文段2)作為應答。同時,將確認
序號設置為客戶的I S N加1以對客戶的S Y N報文段進行確認。一個S Y N將占用一個序號。
使用抓包工具得到以下內容,可以看到:- 指定了源端口(22)和目標端口(60378)
- 序號為
3444481880
ACK=1
,表明確認號ack
有效,ack=151475885
,即發來的報文序號1514758884+1
SYN=1
表明這是一個連接請求或連接接受報文- 窗口大小聲明為
64240
第三次握手
- 客戶必須將確認序號設置為服務器的I S N加1以對服務器的S Y N報文段進行確認(報文
段3)。
使用抓包工具得到以下內容,可以看到:- 同樣指定了源端口和目標端口
- 序號為
1514758885
ACK=1
,表明確認號ack
有效,ack=3444481881
,即發來的報文序號3444481880+1
SYN=0
表明這不是一個連接請求或連接接受報文,服務器連接請求和連接接受發生在第二次握手時。- 窗口大小聲明為
513
,為什么這么小呢?這個流量控制有關。
一個整體的流程圖:
終止連接
建立一個連接需要三次握手,而終止一個連接要經過 4次揮手。這由T C P的半關閉(h a l f - c l o s e)造成的。一個T C P連接是全雙工(即數據在兩個方向上能同時傳遞),因此每個方向必須單獨地進行關閉。
如圖,為抓包工具顯示內容:這就是四次揮手的過程。
第一次揮手
- 我從服務器進行斷開連接的,故而先由服務器主動關閉連接。當一方完成數據傳輸并想要關閉連接時,它會發送一個FIN(結束)標志的數據包。這個FIN標志表示發送方已經完成了數據發送,但仍然可以接收數據。
第二次揮手
- 收到FIN標志的一方會在處理完剩余數據后,再發送一個帶有ACK(確認)標志的數據包以確認收到了FIN。
第三次揮手
- 此時,如果應用程序不調用c l o s e而調用s h u t d o w n,且第2個參數值為1,則socket的A P I支持半關閉。顯然,這不是一個半關閉。所以本地主機發送一個FIN(結束)標志的數據包至服務器。
第四次揮手
- 服務器確認(stream 主機->服務器 關閉連接)
一個完整的流程圖: