詳解TCP三次握手四次揮手面試題

2021-08-20 03:56:56 字數 2233 閱讀 6023

tcp(transmission control protocol)傳輸控制協議。是面向連線的、全雙工的協議。主要用來傳輸tcp報文的。而傳輸需要客戶端client與伺服器server建立連線來完成(三次握手)。傳輸完成後需要釋放鏈結(四次揮手)

建立連線—三次握手:

第一次握手:首先客戶a主動開啟連線,伺服器b被動開啟連線,雙方都會先建立傳輸控制塊tcp,此時客戶a和伺服器b都處於closed狀態,當客戶a向伺服器b傳送連線請求報文段時,同步位syn置1,確認ack=0,序號seq隨機產生為x,此時客戶端進入syn-send(同步傳送狀態),此時伺服器b還處於listen(監聽狀態)。

第二次握手:伺服器b接收到客戶a的連線請求報文時,如果同意建立連線則會向a傳送確連線請求,此時同步位syn=1,確認ack=1,確認好ack=x+1,並隨機生成自己的序號seq=y。此時伺服器b進入syn-rcvd(同步收到)狀態。

第三次握手:客戶端a收到b的確認連線時,會繼續向b傳送確認。此時確認ack=1,確認號ack=y+1,序號seq=x+1。此時客戶a進入establisheed(已建立連線)狀態。當b收到a的確認時,b也進入established狀態。到此完成客戶a與伺服器b的tcp連線。

為什麼要第三次握手?

這主要是為了防止已失效的鏈結請求突然傳輸到了b,產生錯誤,造成資源浪費。假設a第一次向b傳送連線請求時,由於請求報文丟失,在一定時間內a收不到b的確認連線時,a會繼續向b重傳連線請求,當第二次請求被b接收後,會與a建立連線,當a與b資料傳輸完成後會釋放連線,但如果a的地第一次請求報文並不是丟失,而是在某個網路節點長時間滯留了,當a-b釋放完連線時,a的第一次請求報文又傳送到了b,而b會誤認為a又一次向自己傳送了請求連線,然後向客戶a傳送連線確認,但客戶a和伺服器b傳輸完資料後並沒有再一次向b傳送連線請求報文,所以會對b的連線確認「置之不理」,這樣伺服器b就只能幹等著a給與確認,這樣就極大的浪費了伺服器b的網路資源。採用第三次握手可以解決這個問題,此時第三次握手,即a如果向b的確認傳送確認後,b就知道a又一次向b傳送連線請求,相反,如果a沒有向b的確認傳送確認,則b會認為a並沒有像向b再一次傳送連線請求。

釋放連線說明此時客戶a和伺服器b都處於established(連線狀態),釋放連線a和b之間需要傳送四次報文,即四次揮手。

第一次揮手:客戶a的應用程序會先向tcp傳送連線釋放報文,並停止向b傳送資料,終止與b的連線。此時終止控制位fin=1,序號seq=u(等於最後連線狀態情況下最後序號加1),此時a進入終止等待狀態(fin-wait1),等待b的確認。

**第二次揮手:**b收到a的釋放鏈結請求報文時,確認ack=1,確認號ack=u+1,並產生自己的序號v。此時b進入closed-wait(關閉等待狀態)。這個連線處於半連線狀態,即a不能向b傳送資料,但b向a的這條連線並沒有關閉,b可以繼續向a傳送資料。

第三次揮手:如果b沒有向a傳送資料,則會通知tcp釋放鏈結,並向a傳送確認,此時確認終止控制位fin=1,確認ack=1,確認號ack=v+1,並產生序號seq=w,等待a的確認,此時a接收到b的確認時,進入fin-wait2(終止等待)狀態。b進入last-ack(最後確認)狀態。

第四次揮手:在a收到b的連線釋放報文時,a需要對b再一次傳送確認,在報文中確認ack=1,確認號ack=w+1,序號seq=u+1。此時連線還沒有釋放掉,需要等待一段時間(時間等待計時器設定為2msl),此時a進入time-wait(時間等待)狀態。當伺服器b接收到a的確認時,b進入closed的狀態。而經過2msl時間後a的傳輸控制塊tcb撤銷時a進入closed狀態。

為什麼要第四次揮手(a等待2msl時間?)?

第一:是為了保證a最後一次傳送的確認ack能夠到達b。ack報文段可能丟失,當在2mls時間內,b收不到a的確認ack,就會重傳fin-ack請求,a就會對b再次重傳確認ack,重啟2msl計時器,保證b接收到a的ack確認。最後a和b都處於closed狀態,關閉a和b的連線。

第二:是為了防止建立連線時,a發出的第一連線請求因為在網路節點長時間滯留而再一次出現在釋放連線中。由於2msl時間內,可以使連續時間內連線的報文段從網路中消失,即使已失效的連線請求報文段出現在了本連線中,

TCP三次握手 四次揮手(面試)

第一次握手 客戶端傳送第乙個包,其中syn標誌位為1,ack 0,傳送順序號sequence x 隨機int 客戶端進入syn傳送狀態,等待伺服器確認。第二次握手 伺服器收到這個包後傳送第二個包,其中包syn ack標誌位為1,傳送順序號seq y 隨機int 接收順序號ack x 1,此時伺服器進...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...