1. 程式人生 > >文字版 描述TCP三次握手和四次揮手以及有限狀態機等

文字版 描述TCP三次握手和四次揮手以及有限狀態機等

切換 list 遠方 是什麽 int last 關閉 ive tcp報文

客戶端和服務器 ,雙方都處於第一次交互的情況下展開通信

三次握手



1.首先 服務器 需要是處於listen收聽狀態下才能接受報文
客戶端由closed狀態 打開並向服務器發送報文
SYN=1 申請建立聯機
seq=a (這裏的seq的順序號也就是tcp包頭的序號,如果雙方通信次數)
??
?
?

2.第二步:
服務器B返回信息
ACK=1 已收到確認 並向A也發送一個包請求通訊 seq=b1
ack確認號也要+1
(這裏為什麽要+1 是因為B已經收到了ack包 如果你再發的話需要你發 ack+1的包)
而大寫的ACK是確認號 表示前面f發過來的那個包 或者字段是否有效。當ACK=1時,前面的確認號字段才有效。0則無效

這時候服務器和客戶端都處於SYN-RCVD狀態 (同步收到)
?


3.第三步:客戶端返回服務器
首先大寫的ACK=1 確認有效性
這時候 客戶端A要再給服務器B發的包的話。seq的順序號就要+1了
也就是seq=a+1
並且在給服務器B返回ack=y+1 也就是告訴b你上一個ack=y的包我已經收到了 再發的話需要你發 y+1的包
?
這時候服務器和客戶端的狀態都處於ESTAB-LISHED(已建立連接狀態)

4.之後 客戶端a和服務器b就可以進行正常的數據傳送了

?
?
?

四次揮手


還是 A客戶端 B服務器
一般都是客戶端對服務器發起請求斷開鏈接
當然 服務端也可以向客戶端發起斷開鏈接的請求
(用客戶端向服務器提出斷開鏈接 舉例子)

?
當需要斷開鏈接的時候


?
第一步:
客戶端A 對服務器B發出
FIN=1 的數據包(FIN(finish結束))
seq=u 包的序號
並且客戶端的狀態從建立鏈接
ESTAAB-LISHED狀態切換到 FINWAIT-1終止等待狀態
seq=u 序號為u的包
?
?
第二步:
服務器返回ACK(acknowledgement 確認) 確認接收到 斷開鏈接的包了
返回ack=u+1 並告知客戶端。你的上一個包已經收到。下次再發請發ack=u+1的包
並且。返回的給客戶端的報頭編號為
seq=v
ack=u+1

服務器的狀態變更為close-wait 關閉等待

客戶端接收到第二步的包時 客戶端的狀態立即切換到 FIN-WAIT2 終止等待2的狀態

?
?
第三步:
由於客戶端已經對服務器發起了斷開鏈接請求。也就是客戶端已經沒有數據向服務器發送了。。
但是服務器可能還有數據沒有對客戶端傳送完畢。
當服務器對客戶端的數據傳送完畢之後
會對客戶端在發起新的數據報文
FIN=1 確認關閉
ACK=1
seq=w 序列號 (這裏的為什麽不是V+1 因為 第三步和第四部之間 服務器會給客戶端傳送剩余的數據,所以這裏的seq編號。就變很多了,暫且用w表示 而不是 seq=v+1)
ack=u+1 確認
客戶端的狀態變更為 last-ack 最後確認 狀態
?
?
第四步:
當客戶端收到了 第三步的包
立即回應 並確認 斷開鏈接
ACK=1
seq=u+1 ack=w+1
並且客戶端的狀態 切換到 time-wait 時間等待 狀態
(由於網絡的情況或許有延遲,丟包等情況,有可能會出現 數據還沒傳送完畢。但是服務端的確認斷開鏈接的報頭先到了。。 為了保證接收到了所有數據。客戶端會等待一段時間,等待2MSL (1))

?
?

第五步:
服務器當收到客戶端的第四步回應的報頭 直接就處於closed 關閉狀態了

客戶端需要 等待2MSL後 才會進行closed關閉狀態

?
?

補充:
MSL是什麽;aximum Segment Lifetime
報文的最大生命時間。何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄

?
?

有限狀態機FSM:Finite State Machine


CLOSED 沒有任何連接狀態
LISTEN 偵聽狀態,等待來自遠方TCP端口的連接請求
SYN-SENT 在發送連接請求後,等待對方確認
SYN-RECEIVED 在收到和發送一個連接請求後,等待對方確認
ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態
FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認
FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉 傳輸連接請求
TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失
CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,並已確認
LAST-ACK 被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失
CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認

?
?
?

TCP包頭


URG:表示本報文段中發送的數據是否包含緊急數據。後面的緊急指針字段(urgent pointer)只有當URG=1時才有效

ACK:表示是否前面確認號字段是否有效。只有當ACK=1時,前面的確認號字段才有效。 TCP規定,連接建立後,ACK必須為1,帶ACK標誌的TCP報文段稱為確認報文段

PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收後續數據騰出空 間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序 不將接收到的數據讀走,就會一直停留在TCP接收緩沖區中

RST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必 須釋放連接,然後再重新建立連接。或者說明上次發送給主機的數據有問題,主機拒絕響應, 帶RST標誌的TCP報文段稱為復位報文段

SYN:在建立連接時使用 用來同步序號。當SYN=1,ACK=0時 表示這是一個請求建立連 接的報文段當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求 建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標誌的TCP報文 段稱為同步報文段

FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方: “我的數據已經發送完畢,你可以釋放連接了”,帶FIN標誌的TCP報文段稱為結束報文段

文字版 描述TCP三次握手和四次揮手以及有限狀態機等