關於TCP三次握手 四次揮手的個人理解

2021-09-25 12:45:08 字數 2825 閱讀 3530

相信大家對網路協議中 tcp 三次握手和四次揮手都很了解,那我們要怎麼把這過程描述出來呢?

第一次握手:客戶端傳送乙個 syn 報文請求連線

第二次握手:伺服器收到請求 syn 報文,並應答客戶端乙個 syn+ack 報文

第三次握手:客戶端收到伺服器的應答 syn+ack 報文後,回應乙個 ack 報文

伺服器收到 ack 報文,三次握手完成建立

這裡說一點,三次揮手時,第一次,第二次不能攜帶資料,在確認之後的第三次揮手時可以攜帶資料

第一次揮手:客戶端傳送乙個 fin 報文關閉連線請求

第二次揮手:伺服器收到請求,並傳送乙個 ack 報文確認應答

第三次揮手:如果伺服器也想斷開連線,再傳送乙個 fin 報文,並等待最後乙個 ack 的到來(ack 是確認客戶端收到 fin)

第四次揮手:客戶端收到 ack 報文和 fin報文,然後給伺服器傳送乙個 ack 報文,最後關閉客戶端

伺服器收到最後乙個 ack 報文,完全關閉伺服器

作用呢, 是為了確認客戶端與伺服器之間的傳送與接收能力是否正常

其實可以再描述的再仔細一些

剛開始客戶端處於 closed 的狀態,服務端處於 listen 狀態,其次開始

第一次握手:

客戶端:[closed -> syn_sent] 客戶端呼叫 connect, 傳送同步

伺服器:[closed -> listen] 伺服器端呼叫 listen 後進入 listen 狀態, 等待客戶端連線;

客戶端給服務端傳送乙個 syn 報文,並指明客戶端的初始化序列號 isn,此時客戶端處於 syn_sent 狀態

第二次握手:

伺服器:[listen -> syn_rcvd] 一旦監聽到連線請求(同步報文段), 就將該連線放入核心等待佇列中, 並向客戶端

傳送 syn 確認報文.

伺服器收到客戶端 syn 報文,以自己的 syn 報文作為應答,並也指定自己的初始化序列號 isn

然後會把客戶端的i sn+1 作為 ack 的值回應給客戶端,表示伺服器已經收到請求

第三次握手:

客戶端收到 syn 報文後,會返回乙個 ack 報文,也會將伺服器的 isn+1 作為 ack 的值回應給伺服器,表示已經收到伺服器的 syn 報文,此時客戶端處於 established

最後,伺服器收到 ack 報文後,也處於 established 狀態,完成連線的建立,此時開始正常的通訊

第一次揮手:

[established -> fin_wait_1] 

客戶端主動呼叫 close 時,客戶端傳送乙個 fin 報文,報文中會指定乙個序列號,客戶端此時處於乙個 fin_wait_1 狀態

第二次揮手:

[established -> close_wait] 

當客戶端主動關閉連線(呼叫close),伺服器收到 fin 後,傳送乙個 ack 報文,並把客戶端的序列號 +1 作為 ack 報文的序列號值,表明收到客戶端的報文,此時伺服器處於 close_wait_1 狀態

[fin_wait_1 -> fin_wait_2] 

客戶端收到伺服器對結束報文段的確認, 則進入fin_wait_2, 開始等待伺服器的結束報文段;

第三次揮手:

[close_wait -> last_ack] 進入 close_wait 後說明伺服器準備關閉連線(需要處理完之前的資料); 當伺服器真正呼叫 close 關閉連線時, 和客戶端第一次揮手一樣,傳送乙個 fin 報文,且指定乙個序列號, 此時伺服器進入 last_ack 狀態, 等待最後乙個 ack 到來(這個ack是客戶端確認收到了 fin)

第四次揮手:

[fin_wait_2 -> time_wait]

客戶端收到伺服器發來的結束 fin 報文段, 進入 time_wait, 並發出乙個 ack 報文段作為應答

[time_wait -> closed] 

客戶端要等待乙個 2msl (max segment life, 報文最大生存時間)的時間, 才會進入 closed 狀態

最後伺服器:

[last_ack -> closed]

伺服器收到 ack 報文之後,就關閉連線了,處於 closed 狀態

這裡面要注意 time_wait 狀態,為什麼客戶端傳送 ack 之後不直接關閉,而是要等一陣子才關閉?

這裡是為了確保伺服器收到客戶端傳送的 ack 報文,如果沒有收到的話,有可能出現了丟包的情況,伺服器會重新發 fin 

報文給客戶端,客戶端收到之後,就知道之前的 ack 報文丟失了,然後再次傳送 ack 報文

這裡等待的時間為什麼是2msl (max segment life, 報文最大生存時間)的時間?

msl是tcp報文的最大生存時間, 因此time_wait持續存在2msl的話就能保證在兩個傳輸方向上的尚未被接收或遲到的報文段都已經消失(否則伺服器立刻重啟, 可能會收到來自上乙個程序的遲到的資料, 但是這種資料很可能是錯誤的)同時也是在理論上保證最後乙個報文可靠到達(假設最後乙個ack丟失, 那麼伺服器會再重發乙個fin. 這時雖然客戶端的程序不在了, 但是tcp連線還在, 仍然可以重發last_ack)

關於TCP三次握手四次揮手

三次握手 1 a的tcp客戶程序首先建立傳輸控制模組tcb,同步位syn 1 初始序列號seq x,進入syn sent 同步已傳送 階段 2 b收到請求報文,同意建立連線,向a傳送確認 syn ack都置1 確認號是ack x 1,初始序列號seq y 進入syn rcvd 同步已收到 狀態 3 ...

TCP三次握手 四次揮手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手 四次揮手

服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...