TCP的三次握手與四次揮手

2021-09-25 06:10:22 字數 2489 閱讀 1132

tcp雖然是面向位元組流的,但tcp傳輸的資料單元卻是報文段。tcp報文段分為首部和資料部分,而tcp的全部功能都體現在它首部中各字段的作用,圖是tcp報文段的首部結構。

tcp首部的前20個位元組是固定的,後面4n個位元組是根據需要而增加的選項。因此tcp首部的最小長度為20位元組。

下面介紹幾個重要欄位的意義:

客戶機:主機a伺服器:主機b

第一次握手:建立連線。主機a傳送請求連線報文段,將syn位置1,seq為x;然後主機a進入syn_send(連線請求)狀態,等待主機b的確認。

第二次握手:主機b收到主機a的syn報文段,需要對這個報文段進行確認,設定ack為x+1,同時,自己還要傳送syn資訊,將syn置1,seq為y;主機b要將所有的資訊放到乙個報文段(即syn+ack報文段)中,一併傳送給主機a,此時主機b進入syn_rcvd(接受請求)狀態。

第三次握手:主機a收到主機b的syn+ack報文段。然後將ack置為y+1,向主機b傳送ack報文段,這個報文段傳送完畢後,主機a和主機b都進入establish狀態,完成tcp三次握手。

注:syn_sent表示請求連線,當你要訪問其它的計算機的服務時首先要發個同步訊號給該埠,此時狀態為syn_sent,如果連線成功了就變為established,此時syn_sent狀態非常短暫。

為什麼要建立三次握手呢?

這主要是為了防止已經實效的報文段突然傳送到了主機b,因而產生錯誤。

考慮這樣一種情況:當a傳送連線請求,但因連線請求報文丟失而未收到確認。於是a再重傳一次。第二個報文段到達了主機b,收到了確認,建立了連線。傳輸完畢後,就釋放連線。       

現假定出現另一種情況:a傳送的第乙個請求報文段並沒有丟失,而是在某些網點滯留時間太長,以致延誤到這次的連線釋放後才到大主機b,本來這已經是乙個已經失效的報文段,但主機b收到這個報文段,卻誤認為主機a又傳送了一次新的請求,於是向a傳送確認報文段,同意建立連線。

主機a並沒有要求建立連線,因此不會理睬主機b的確認,也不會向主機b傳送資料,但主機b卻以為連線已經建立,並且一直等待主機a傳送資料,於是主機b的許多資源就這樣被浪費了。

而如果採用了三次連線就可以防止以上現象的發生。例如在剛才的情況下,主機a不會再向主機b的確認傳送確認。主機b收不到確認,就建立不了連線。

客戶機:主機a伺服器:主機b

第一次揮手:主機a的應用程序先向其tcp發出連線釋放請求,並且不再傳送資料。tcp要通知對方釋放從a到b這個方向的連線,把發往主機b的報文段首部fin置1,此時主機a進入fin_wait_1狀態。

第二次揮手:主機b收到釋放連線通知後即發出確認,確認號是收到序號+1,主機b通知高層應用程序,這樣從a到b的連線就釋放了,此時主機b進入close_wait(半關閉)狀態,相當於主機a向主機b說:「我已經沒有資料要傳送了,但你如果還傳送資料,我仍可以接收」。

第三次揮手:若主機b不再向主機a傳送資料,其應用程序先向其tcp發出連線釋放請求,並且不再傳送資料。tcp要通知對方釋放從b到a這個方向的連線,把發往主機a的報文段首部fin置1,此時主機b進入last_ack狀態。

第四次揮手:主機a收到釋放連線請求後,進入2msl的time_wait狀態(必須經過2∗∗msl的時間後,才進入closed狀態),接著傳送乙個ack給主機b,確認序號為收到序號+1,整個連線全部釋放,主機進入了closed狀態,完成四次揮手。可以看到,伺服器結束tcp連線的時間要比客戶端早一些。

以上釋放過程是4次聯絡,也可以看成2個2次聯絡。

為什麼要建立四次揮手呢?

根本原因是,一方傳送fin只能表示自己發完了要發的資料,但還允許對方繼續把沒發完的資料發過來。

time_wait.的狀態必須等待2msl的原因?

保證當最後乙個ack丟失後,能收到對端重傳的fin包。為了保證a傳送的最後乙個ack報文段能夠到達b。這個ack報文段可能丟失,因而處於last_ack狀態的b可能收不到對已傳送的fin+ack報文段的確認,b會超時重傳這個報文段,則a就可以在2msl這個時間內收到這個重傳的fin+ack報文段。接著a會重傳一次確認,然後啟動2msl計時器。

如果a在time_wait這個狀態不等待一段時間,而是在傳送ack報文段後立即釋放連線,那麼就無法收到b重傳的fin+ack報文段,因而也不會再傳送一次確認報文段,b則無法按正常步驟進入closed狀態。(注:time_wait狀態一般維持在1-4分鐘)

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...