TCP三次握手與四次揮手

2021-07-22 01:19:33 字數 2295 閱讀 7363

也許三次握手你會經常聽到,但你知道三次握手的真正意義嗎,為什麼需要三次握手呢?

首先我們必須明白tcp是面向連線的協議,無論哪乙個方向在傳送資料之前,都必須先在雙方之間建立連線。這一點與udp協議是不一樣的,udp在傳送資料報之前是不需要建立連線的。建立tcp連線的過程中,通訊的雙方需要互相發報文進行對話,總共發了三次報文,我們把這個過程稱為三次握手,三次握手的過程也就是tcp建立連線的過程。

既然三次握手的過程需要用到報文,我們先了解一下報文的格式吧。下圖中的報文格式即是一般的tcp報文模板,每一行表示32位(即4位元組)長度,tcp報文由首部與資料組成,其中首部由固定選項和可選選項組成,固定選項占用20個位元組。

圖1 tcp報文格式

在三次握手的過程中,我們需要了解的是報文的序號、確認號、標誌位,如下:

tcp連線的三次握手

圖2 tcp連線三次握手

我們假設建立tcp連線的請求由client發起,那麼整個建立tcp連線流程如下:

client向server傳送乙個syn報文,其中報文標誌syn=1,序號seq=j,傳送報文後client處於syn_sent(同步已傳送)狀態;tcp規定,syn報文不能攜帶資料,但標誌syn會消耗乙個序號;

server接收到syn報文,如果同意建立連線,那麼server會傳送syn+ack報文,報文的標誌syn=1、ack=1,序號seq=k,確認序號ack=j+1,傳送報文後server處於syn_rcvd(同步已收到)狀態

client收到syn+ack報文後,需要向server傳送ack報文確認,報文的標誌ack=1,確認序號ack=k+1,此時client進入established(連線已建立)狀態;當server接收到ack報文後,server也進入established(連線已建立)狀態。

為什麼要server需要接收到client的ack報文後才建立連線呢,而不是在收到syn+ack報文後就建立連線??

主要是為了防止已失效的syn報文又回到server。因為有可能出現這樣的情況: client發出syn報文後,由於某些原因在網路中滯留了一段時間,以致於延遲到連線已經釋放後才到達server。server收到這個已經失效的syn報文,誤以為這是client發起乙個新的連線請求,server會向client傳送確認的syn+ack報文,同意建立連線。如果不採用三次握手,那麼server在發出syn+ack報文後就建立新的連線了。由於client沒有發起新的連線請求,因此它不會理會server建立連線的syn+ack報文,也不會向server傳送任何資料。此時,server誤以為連線已經建立,一直在等待client傳送資料,這樣server因為等待無效的連線的很多資源就白白資源了。採用三次握手就可以防止上面的情況出現。

tcp釋放的四次揮手

圖3 tcp釋放四次揮手

由於tcp是全雙工的,因此每個方向必須單獨進行關閉。這一原則是當一方完成資料傳送任務後,傳送乙個fin來終止這一方向的連線;收到乙個fin表示這一方向上不會再有資料流動了,即不會再收到資料了,但自己仍可以向對方傳送資料。首先發起fin請求的一方執行主動關閉,而另一方執行被動關閉。我們假設client首先發起fin請求,流程如下:

client向server傳送fin報文請求關閉連線,其中報文標誌fin=1,序號seq=m,標記fin會消耗乙個序號,然後client進入fin_wait_1狀態;

server收到fin報文,向client傳送ack報文,其中報文標誌ack=1,確認序號=m+1,client收到報文後進入fin_wait_2狀態,等待server發出釋放連線報文;

server完成資料傳送任務,向client傳送fin報文,其中報文標誌fin=1,序號seq=n,然後server進入last_ack狀態;

client收到server的fin報文,向server傳送確認報文,確認報文的標記ack=1,序號ack=n+1,然後client進入time_wait狀態;server收到確認報文後,釋放連線資源,進入closed狀態,此時server->client方向的連線關閉,client->server方向的連線必須等待一段時間後才會執行關閉,一般為2msl,msl即報文最大生存時間。

為什麼client在time_wait狀態上必須等待一段時間才進入closed狀態呢?

Tcp三次握手與四次揮手

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

tcp三次握手與四次揮手

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

TCP三次握手與四次揮手

1 tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線 1 第一次握手 建立連線時,客戶端a傳送syn包 syn j 到伺服器b,並進入syn send狀態,等待伺服器b確認。2 第二次握手 伺服器b收到syn包,必須確認客戶a的syn ack j 1 同時自己也傳送乙個sy...