TCP的三次握手-WireShark抓包解析

文章框架
握手的名詞解釋
三次握手原理

概括

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)
    三次握手
  • 附上百度的圖

握手流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章