文章框架
握手的名詞解釋
三次握手原理
概括
TCP在傳輸之前會進行三次溝通,一般稱爲“三次握手”,傳完數據斷開的時候要進行四次溝通,一般稱爲“四次揮手”
全文按照標準輸出首字母大寫
名詞解釋
TCP報文中的兩個序號
1、Seq序號:佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記
2、確認序號:佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,Ack=Seq+1,爲了兩端配對,這裏可以引出TCP傳輸協議是可靠傳輸協議,爲了提供可靠的傳送,TCP在發送新的數據之前,以特定的順序將數據包的序號,並需要這些包傳送給目標機之後的確認消息。當應用程序在收到數據後要做出確認時也要用到TCP。
注意!
只要兩端可以正常通信ACK標誌位都爲1,後續抓包查看握手過程會指出ACK的具體位置
這裏ACK和Ack不要混淆,大寫的ACK是標誌位,小寫的Ack是確認序號
標誌位
介紹完序號後,開始介紹我們的六個標誌位,三次握手四次揮手中可以看到的是ACK SYN FIN
-|-|
ACK|確認(Acknowledgement Number)欄有效,同時提示遠端系統已經成功接收所有數據
SYN|發起一個新的TCP連接,該標誌僅在三次握手建立TCP連接時有效
FIN|用來結束一個TCP回話,但對應端口仍處於開放狀態,準備接收後續數據
PSH|接收方應該儘快將這個報文交給應用層
RST|重置連接
URG|緊急指針(urgent pointer)有效
TCP連接及關閉狀態
-|-|
LISTEN|監聽來自遠方TCP端口的連接請求。
SYN-SENT|在發送連接請求後等待匹配的連接請求。
SYN-RECEIVED|在收到和發送一個連接請求後等待對連接請求的確認。
ESTABLISHED|代表一個打開的連接,數據可以傳送給用戶。
FIN-WAIT-1|等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認。
FIN-WAIT-2|從遠程TCP等待連接中斷請求。
CLOSE-WAIT|等待從本地用戶發來的連接中斷請求。
CLOSING|等待遠程TCP對連接中斷的確認。
LAST-ACK|等待原來發向遠程TCP的連接中斷請求的確認。
TIME-WAIT|等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認。
CLOSED|沒有任何連接狀態。
三次握手原理
下圖是ssh連接阿里雲服務器時WireShark抓的數據
- 第一次握手
我的客戶端向阿里雲發送SYN請求,同時會生成Seq序號(序列號)。SYN=1,Seq=N(0)。圖中的Seq爲0是因爲訪問阿里雲的數據包是第一個被抓到的(Seq隨機)
SYN1、Seq=N(0) 括號中的值是圖中的真實值
這時候我主機的狀態是SYN-SENT(在發送連接請求後等待匹配的連接請求)
- 第二次握手
阿里雲服務器一直是LISTEN(監聽來自遠方TCP端口的連接請求)收到了我的SYN包,同時發送SYN=1建立TCP連接,ACK=1(再次強調只有ACK=1時,Ack確認序號纔有效),Ack=N+1(0+1),也會對這條消息生成一個Seq序號Y(0)
服務器發送連接請求後狀態會變爲SYN-RECEIVED(在收到和發送一個連接請求後等待對連接請求的確認)
SYN=1、ACK=1、Ack=N+1(0+1)、Seq=Y(0)
- 第三次握手
我的客戶端收到阿里雲的SYN+ACK包後迴向服務器發送確認包ACK(Ack=Y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。此時就可以進行數據傳輸
ACK=1、Seq=N+1(0+1)、Ack=Y+1(0+1) - 附上百度的圖