TCP三次握手四次揮手

2022-06-06 05:09:11 字數 3014 閱讀 5462

目錄四次揮手

參考

本文從三次握手角度四次揮手來帶你快速理解tcp

在將三次握手之前,先來看看每次握手都傳送了什麼東西

這裡不對報文段作詳細解釋,只講解下三次握手四次揮手有關的字段

所謂三次握手(three-way handshake),是指建立乙個 tcp 連線時,需要客戶端和伺服器總共傳送3個包。

最開始的時候客戶端和伺服器都是處於closed狀態。主動開啟連線的為客戶端,被動開啟連線的是伺服器。

注意,三次握手握的是通訊雙方資料原點的序列號。

再來看下什麼是序號和確認號

序號,確認號

在開啟tcp會話時,客戶端和服務端都會給自己的資料編號,這就是序號/序列號,初始序列號是隨機的,0~2^32之間。

此時客戶端待傳送的資料首序號為1001,服霧端待傳送資料首序號為2001。注:客戶端和服務端序號系統是獨立的

假設客戶端傳送的報文中,序號:1001,攜帶的資料為200

服務端成功接受到這200資料後,期望客戶端下一次傳送的資料是從1001+200開始的,傳送給客戶端的報文中序號為2001,確認號為1001+200,同時伺服器也傳送100資料

客戶端收到服務端的確認號1201,驗證無誤,同時收到服務端100的資料,然後再向服務端傳送300的資料,那麼這300的資料序列號肯定是1201-1500,這時客戶端傳送給服務端的報文應為

序列號:1201(要傳送的資料首序號,同時也是伺服器剛剛發來的確認號)

確認號:2200(從伺服器發來的報文中得知伺服器傳送的首序列號為2001,又因為服務端還攜帶了200的資料,所以確認號應為2201,告訴伺服器下次發給我的資料應當從2201開始傳送,但是傳送多少我不管,服務端可以從2201判斷出客戶端成功收到了那200的資料)

客戶端傳送給服務端那300的資料

...

簡而言之,序列號是自己的序列號,確認號

是對方發來的包中的(序列號+資料長度),因為確認號是期望收到對方下乙個報文的第乙個資料位元組的序號。

第一次握手:客戶端->服務端

當某個主機開啟乙個tcp會話時,他的初始序列號是隨機的,這裡假定客戶端初始序號為1000,服務端初始序號為2000

tcp會話的每一端都包含乙個32位(bit)的序列號,該序列號被用來跟蹤該端傳送的資料量。每乙個包中都包含序列號,在接收端則通過確認號用來通知傳送端資料成功接收

所以在tcp報文段中:

因為這是第乙個包,此時通話還未開始,沒有通話的另一端需要確認,所以這個包中的確認號沒有意義

tcp規定,syn報文段(syn=1的報文段)不能攜帶資料,但需要消耗掉乙個序號。

第二次握手:服務端->客戶端

tcp伺服器收到請求報文後,如果同意連線,則發出確認報文。

報文段中

同樣,syn=1,這個報文也不能攜帶資料,但是要消耗乙個序號。

第三次握手:客戶端->服務端

tcp客戶程序收到確認後,還要向伺服器給出確認

確認報文:

此時,tcp連線建立。tcp規定,ack報文段可以攜帶資料,但是如果不攜帶資料則不消耗序號。

tcp 的連線的拆除需要傳送四個包,因此稱為四次揮手(four-way handshake),也叫做改進的三次握手。客戶端或伺服器均可主動發起揮手動作,在 socket 程式設計中,任何一方執行 close() 操作即可產生揮手操作。

客戶端發出連線釋放報文,並且停止傳送資料。釋放資料報文首部,fin=1,其序列號為seq=u(等於前面已經傳送過來的資料的最後乙個位元組的序號加1)

傳送完畢後,客戶端進入 fin_wait_1 狀態。

tcp規定,fin報文段即使不攜帶資料,也要消耗乙個序號。

伺服器收到連線釋放報文,發出確認報文,ack=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了close-wait(關閉等待)狀態。tcp伺服器通知高層的應用程序,客戶端向伺服器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有資料要傳送了,但是伺服器若傳送資料,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個close-wait狀態持續的時間。

伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,fin 置為1。

傳送完畢後,伺服器端進入 last_ack 狀態,等待來自客戶端的最後乙個ack。

tcp規定,fin報文段即使不攜帶資料,也要消耗乙個序號。

客戶端接收到來自伺服器端的關閉請求,傳送乙個確認包,並進入 time_wait狀態,等待可能出現的要求重傳的 ack 包。

伺服器端接收到這個確認包之後,關閉連線,進入 closed 狀態。

注意此時tcp連線還沒有釋放,必須經過2*msl(最長報文段壽命)的時間後,沒有收到伺服器端的 ack ,認為伺服器端已經正常關閉連線,當客戶端撤銷相應的tcb後,才進入closed狀態。

伺服器只要收到了客戶端發出的確認,立即進入closed狀態。同樣,撤銷tcb後,就結束了這次的tcp連線。伺服器結束tcp連線的時間要比客戶端早一些。

blog

tcp的三次握手與四次揮手(詳解+**)

TCP三次握手 四次揮手

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

TCP三次握手 四次揮手

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

TCP三次握手四次揮手

tcp transmission control protocol 傳輸控制協議 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線。位碼即tcp標誌位,有6種標誌 urg urgent緊急 ack acknowledgement 確認 psh push傳送 rst...