TCP的三次握手與四次揮手

2021-08-26 23:40:54 字數 2552 閱讀 5147

置位概念:根據tcp的包頭字段,存在3個重要的標識ack、syn、fin 

ack:表示驗證字段 

syn:位數置1,表示建立tcp連線 

fin:位數置1,表示斷開tcp連線

1. 源埠號:表示傳送端埠號,字段長為16位。 

2. 目標埠號:表示接收埠號,字段長為16位。 

3. 序列號:表示傳送資料的位置,字段長為32位。每傳送一次資料,就累加一次該資料位元組數的大小。 

注意:序列號不會從0或1開始,而是在建立連線時由計算機生成的乙個隨機數作為其初始值,通過syn包傳送給接收端主機。然後再將每**過去的位元組數累加到初始值上表示資料的位置。 

4. 確認應答號:表示下一次應該收到的資料的序列號,字段長為32位元組。傳送端收到這個確認應答以後可以認為在這個序號以前的資料都已經被正常接收。

step1:第一次握手

建立連線時,客戶端傳送syn包到伺服器,其中包含客戶端的初始序號seq=j,並進入syn_sent狀態,等待伺服器確認。(其中,syn=1,ack=0,表示這是乙個tcp連線請求資料報文;序號seq=j,表明傳輸資料時的第乙個資料位元組的序號是x)。

step2:第二次握手

伺服器收到請求後,必須確認客戶的資料報。同時自己也傳送乙個syn包,即syn+ack包,此時伺服器進入syn_recv狀態。(其中確認報文段中,標識位syn=1,ack=1,表示這是乙個tcp連線響應資料報文,並含服務端的初始序號seq(伺服器)=k,以及伺服器對客戶端初始序號的確認號ack(伺服器)=seq(客戶端)+1=j+1)。

step3:第三次握手

客戶端收到伺服器的syn+ack包,向伺服器傳送乙個序列號(seq=j+1),確認號為ack(客戶端)=k+1,此包傳送完畢,客戶端和伺服器進入estab_lished(tcp連線成功)狀態,完成三次握手。

未連線佇列

在三次握手協議中,伺服器維護乙個未連線佇列,該隊列為每個客戶端的syn包(syn=j)開設乙個條目,該條目表明伺服器已收到syn包,並向客戶發出確認,正在等待客戶的確認包時,刪除該條目,伺服器進入estab_lished狀態。

為什麼tcp客戶端最後還要傳送一次確認呢?主要防止已經失效的連線請求報文突然又傳送到了伺服器,從而產生錯誤。

step1:第一次揮手

首先,客戶端傳送乙個fin,用來關閉客戶端到伺服器的資料傳送,然後等待伺服器的確認。其中終止標誌位fin=1,序列號seq=u。

step2:第二次揮手

伺服器收到這個fin,它傳送乙個ack,確認ack為收到的序號加一。tcp伺服器通知高層的應用程序,客戶端向伺服器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有資料要傳送了,但是伺服器若傳送資料,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個close-wait狀態持續的時間。

step3:第三次揮手

當伺服器端資料傳送完畢,關閉伺服器到客戶端的連線,傳送乙個fin給客戶端。

step4:第四次揮手

客戶端收到伺服器的連線釋放報文後,必須發出確認,ack=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了time-wait(時間等待)狀態。注意此時tcp連線還沒有釋放,必須經過2∗∗msl(最長報文段壽命)的時間後,當客戶端撤銷相應的tcb後,才進入closed狀態。

為什麼客戶端最後還要等待2msl?

第一,保證客戶端傳送的最後乙個ack報文能夠到達伺服器,因為這個ack報文可能丟失,站在伺服器的角度看來,我已經傳送了fin+ack報文請求斷開了,客戶端還沒有給我回應,應該是我傳送的請求斷開報文它沒有收到,於是伺服器又會重新傳送一次,而客戶端就能在這個2msl時間段內收到這個重傳的報文,接著給出回應報文,並且會重啟2msl計時器。

第二,防止類似與「三次握手」中提到了的「已經失效的連線請求報文段」出現在本連線中。客戶端傳送完最後乙個確認報文後,在這個2msl時間中,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣新的連線中不會出現舊連線的請求報文。

為什麼建立連線是三次握手,關閉連線確是四次揮手呢?

建立連線的時候, 伺服器在listen狀態下,收到建立連線請求的syn報文後,把ack和syn放在乙個報文裡傳送給客戶端。 

而關閉連線時,伺服器收到對方的fin報文時,僅僅表示對方不再傳送資料了但是還能接收資料,而自己也未必全部資料都傳送給對方了,所以己方可以立即關閉,也可以傳送一些資料給對方後,再傳送fin報文給對方來表示同意現在關閉連線,因此,己方ack和fin一般都會分開傳送,從而導致多了一次。

Tcp三次握手與四次揮手

tcp三次握手 四次揮手 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 第二次...

TCP三次握手與四次揮手

也許三次握手你會經常聽到,但你知道三次握手的真正意義嗎,為什麼需要三次握手呢?首先我們必須明白tcp是面向連線的協議,無論哪乙個方向在傳送資料之前,都必須先在雙方之間建立連線。這一點與udp協議是不一樣的,udp在傳送資料報之前是不需要建立連線的。建立tcp連線的過程中,通訊的雙方需要互相發報文進行...

tcp三次握手與四次揮手

一.tcp三次握手 簡述 a傳送乙個請求給b,b發回確認,然後a再加以確認,來回共3次 1 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認。2 第二次握手 伺服器收到syn包之後,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn syn...