文章框架
握手的名詞解釋
三次握手原理服務器
TCP在傳輸以前會進行三次溝通,通常稱爲「三次握手」,傳完數據斷開的時候要進行四次溝通,通常稱爲「四次揮手」
全文按照標準輸出首字母大寫框架
一、Seq序號:佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記
二、確認序號:佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,Ack=Seq+1,爲了兩端配對,這裏能夠引出TCP傳輸協議是可靠傳輸協議,爲了提供可靠的傳送,TCP在發送新的數據以前,以特定的順序將數據包的序號,並須要這些包傳送給目標機以後的確認消息。當應用程序在收到數據後要作出確認時也要用到TCP。
注意!
只要兩端能夠正常通訊ACK標誌位都爲1,後續抓包查看握手過程會指出ACK的具體位置
這裏ACK和Ack不要混淆,大寫的ACK是標誌位,小寫的Ack是確認序號ssh
介紹完序號後,開始介紹咱們的六個標誌位,三次握手四次揮手中能夠看到的是ACK SYN FINide
-|-|
ACK|確認(Acknowledgement Number)欄有效,同時提示遠端系統已經成功接收全部數據
SYN|發起一個新的TCP鏈接,該標誌僅在三次握手創建TCP鏈接時有效
FIN|用來結束一個TCP回話,但對應端口仍處於開放狀態,準備接收後續數據
PSH|接收方應該儘快將這個報文交給應用層
RST|重置鏈接
URG|緊急指針(urgent pointer)有效阿里雲
-|-|
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抓的數據blog
個人客戶端向阿里雲發送SYN請求,同時會生成Seq序號(序列號)。SYN=1,Seq=N(0)。圖中的Seq爲0是由於訪問阿里雲的數據包是第一個被抓到的(Seq隨機)
SYN一、Seq=N(0) 括號中的值是圖中的真實值
這時候我主機的狀態是SYN-SENT(在發送鏈接請求後等待匹配的鏈接請求)
it
阿里雲服務器一直是LISTEN(監聽來自遠方TCP端口的鏈接請求)收到了個人SYN包,同時發送SYN=1創建TCP鏈接,ACK=1(再次強調只有ACK=1時,Ack確認序號纔有效),Ack=N+1(0+1),也會對這條消息生成一個Seq序號Y(0)
服務器發送鏈接請求後狀態會變爲SYN-RECEIVED(在收到和發送一個鏈接請求後等待對鏈接請求的確認)
SYN=一、ACK=一、Ack=N+1(0+1)、Seq=Y(0)
class