大家都知道,計算機與網路裝置要相互通訊,雙方就必須基於相同的方法,不同的硬體、作業系統間的通訊,這一切都需要一種規則。我們把這種規則稱為協議。
tcp/ip是網際網路中相關各類協議族的總稱。tcp/ip是指tcp和ip這兩種協議。tcp/ip是在ip協議的通訊過程中使用到的協議族的統稱。
附:計算機訪問網際網路的過程
可以看到,在利用tcp/ip協議族訪問網路時,會通過分層的順序與對方進行通訊。
順序:傳送端:應用層(http客戶端)→傳輸層(tcp)→網路層(ip)→資料鏈路層
伺服器端:資料鏈路層→網路層(ip)→傳輸層(tcp)→應用層(http伺服器端)
tcp(transmission control protocol傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。
好了,現在我們回歸正題,tcp三次握手的具體過程是怎樣的呢
由於 tcp 只存在請求和響應,請求和響應都是資料報。為了更好的理解tcp三次握手的過程,我們需要先了解tcp的報文
其中比較重要的字段有:
序號(sequence number):seq 序號,佔 32 位,用來標識從 tcp 源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。
確認號(acknowledgement number):ack 序號,佔 32 位,只有 ack 標誌位為 1 時,確認序號欄位才有效,ack=seq+1。
標誌位(flags):共 6 個,即 urg、ack、psh、rst、syn、fin 等。
六個標誌位具體含義如下:
urg:緊急指標(urgent pointer)有效。
ack:確認序號有效。
psh:接收方應該盡快將這個報文傳送給應用層。
rst:重置連線。
syn:發起乙個新連線。
fin:釋放乙個連線。
注意:不要將確認序號 ack 與標誌位中的 ack 搞混了。
確認方 ack=發起方 seq+1,兩端配對。
了解了tcp報文首部了現在我們來看具體的過程:
初始化狀態:客戶端:close關閉狀態,伺服器:listen監聽狀態。
第一次握手:客戶端傳送請求報文將 syn=1 同步序列號和初始化 seq=x傳送給服務端,服務端從初始化狀態,建立連線,等待客戶端,確認接收後的狀態為syn_receive。這個時候客戶端處於等待狀態為syn_send。
第二次握手,伺服器接收到報文後(syn=1,seq=x)收到請求後請求報文變為同步序列號syn=1,初始化序列號seq=1,確認號ack=1,ack=x+1,伺服器為syn_receive狀態,傳送端的狀態為:syn_send。
第三次握手,客戶端收到服務端的資料報(收到響應後),然後傳送同步序列號ack=y+1和資料報的序列號seq=x+1和ack=1確認包作為應答(第三次握手:ack=1,seq=x+1,ack=y+1),客戶端和服務端變化為established狀態。
動態過程如下圖所示
我們把客戶端和伺服器比作兩名網癮少年
這個過程我們可以通俗的理解為:
至此,三次握手完成,tcp客戶端和伺服器端成功地建立連線,客戶端可以訪問網路並開始快樂了
但是,先別忙著快樂,我們還有一點沒整明白:為什麼要進行第三次握手?
答:為了防止伺服器端開啟一些無用的連線增加伺服器開銷以及防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤的連線。
由於網路傳輸是有延時的(要通過網路光纖和各種中間**伺服器),在傳輸的過程中,比如客戶端發起了 syn=1 建立連線的請求(第一次握手)。
如果伺服器端就直接建立了這個連線並返回包含 syn、ack 和 seq 等內容的資料報給客戶端,這個資料報因為網路傳輸的原因丟失了,丟失之後客戶端就一直沒有接收到伺服器返回的資料報。
客戶端可能設定了乙個超時時間,時間到了就關閉了連線建立的請求。
再重新發出建立連線的請求,而伺服器端是不知道的,如果沒有第三次握手告訴伺服器端客戶端收的到伺服器端傳輸的資料的話,伺服器端是不知道客戶端有沒有接收到伺服器端返回的資訊的。
這個過程可理解為:
有連線就應當有釋放,當建立的連線不用的時候(在網咖快樂完了),連線的釋放將由一方主動釋放,另一方被動釋放,這就是我們常說的tcp的四次揮手。
本文參考了51cto的部落格,如需更詳細的解釋,請戳以下鏈結
三次握手+四次揮手
TCP三次握手建立關係
三次握手 three times handshake three way handshake 所謂的 三次握手 即對每次傳送的資料量是怎樣跟蹤進行協商使資料段的 傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送 接收完畢後何時撤消聯絡,並建立虛連線。tcp資料格式 首部 特殊字段 在...
三次握手建立連線
建立連線的步驟例如以下 client傳送乙個syn段表示發起連線請求,該段中包括乙個初始序號isn。server也傳送乙個syn段幷包括它自己的初始序號isn。同一時候設定ack標誌表示對上乙個client的syn的確認。確認序號為client的isn值加1,該確認序號表示server希望下一次收到...
socket中TCP的三次握手建立連線
socket中傳送的tcp三次握手 我們知道tcp建立連線要進行 三次握手 即交換三個分組。大致流程如下 只有就完了三次握手,但是這個三次握手發生在socket的那幾個函式中呢?請看下圖 從圖中可以看出,當客戶端呼叫connect時,觸發了連線請求,向伺服器傳送了syn j包,這時connect進入...