TCP 三次握手 四次揮手詳解

2021-07-16 04:09:48 字數 3591 閱讀 4488

tcp雖然是面向位元組流,但是tcp傳送的資料單元確實報文段,乙個tcp報文段分為首部和資料兩部分,而tcp的全部功能都體現在首部中各字段的作用,因此,只要弄清了首部各字段的作用後,就能很好的理解tcp的工作原理。

序號:(seq):佔4個位元組,乙個報文段的序號字段值是201,而攜帶的資料共有100位元組,這就表明,本報文段的資料的第乙個位元組的序號是201,最後乙個位元組的序號是300;那麼下乙個報文段的序號字段值是301;序號也稱報文段序號。

確認號:(ack):佔4個位元組,是期待收到對方下乙個報文段的第乙個資料位元組的序號,例如,b正確的收到了a發過來的乙個報文段,其序號字段值是301,而資料長度是200位元組,(301~500),這表明b正確的收到了a傳送的200個位元組的資料,那麼b期待收到a發過來的下個資料序號是501,於是b給a傳送乙個確認號ack=501,總之,若ack為n,那麼到n-1為止的所有資料都已正確收到,

確認ack:僅當ack=1時,我們的確認序列號ack才有效,當ack=0時,確認序號ack無效,tcp規定:建立連線後所有傳送的報文端都必須把ack必須置為1。

同步syn(synchronization):在連線建立時用來同步序號。當syn=1而ack=0時,表明這是乙個連線請求報文。對方若同意建立連線,則應在響應報文中使syn=1和ack=1. 因此, syn置1就表示這是乙個連線請求或連線接受報文。

終止fin(finis,意思是完,終), 用來釋放乙個連線。當 fin = 1 時,表明此報文段的傳送方的資料已經傳送完畢,並要求釋放運輸連線。

主機a執行的是tcp客戶程式,而b執行的是tcp服務端程式,最初tcp程序都處於關閉狀態,a主動開啟連線,b被動開啟連線;

三次握手:

第一次握手:

b的tcp伺服器程序先建立傳輸控制塊tcb,準備接收客戶程序的連線請求,然後伺服器程序就處於listen(收聽)狀態,等待客戶的連線請求.如有,就做出響應.

a的tcp客戶程序也是先建立傳輸控制塊tcb,然後向b發出連線請求報文段,這時候首部中的同步位syn=1,同時選擇乙個初始序號 seq=x。tcp規定,syn報文段(syn=1的報文段) 不能攜帶資料,但要消耗乙個序號.這時,tcp客戶程序進入syn-sent(同步已傳送)狀態.

第二次握手:

b收到連線請求報文段後,如同意建立連線,則向a傳送確認.在確認報文段中,應把syn和ack位都置1,確認號是ack=x+1,同時也為自己選擇乙個初始序號seq=y。這個報文段也不能攜帶資料,同樣要消耗乙個序號.這時tcp伺服器程序進入syn-rcvd(同步收到)狀態.

第三次握手:

tcp客戶程序收到b的確認後,還要向b給出確認。確認報文段的ack置1,確認號ack=y+1,而自己的序號seq=x+1。tcp的標準規定,ack報文段可以攜帶資料。但如果不攜帶資料則不消耗序號,這種情況下,下乙個資料報文段的序號仍是seq=x+1。這時,tcp連線已經建立,a進入established(已建立連線)狀態。

當b收到a的確認後,也進入established狀態。

四次揮手:

1.資料傳輸結束後,通訊雙方都可釋放連線。現在a,b都處於established狀態。a先傳送連線釋放報文段,並停止在傳送資料,主動關閉tcp連線。a把連線釋放報文段首部離得fin置1,其序號seq=u,u等於前面已傳送的資料的最後乙個位元組的序號加1.這是a進入fin-wait-1(終止等待1)狀態,等待b的確認。請注意,tcp規定,fin報文段即使不攜帶資料,也消耗乙個序號。

2.b收到連線釋放報文段後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等於b前面已傳送的資料的最後乙個位元組的序號加1.然後b進入close-wait(關閉等待)狀態。tcp伺服器程序這時通知高層應用程式,因而從a到b的連線就釋放了,這時的tcp連線處於半關閉(half-close)狀態,即a已經沒有資料要傳送了,但b若傳送資料,a仍然接收。也就是b到a這個方向的連線並未關閉,這個狀態可能持續一段時間。

3.a收到b的確認後,就進入fin-wait-2(終止等待2)狀態,等待b發出的連線釋放報文段。若b已經沒有資料要發給a,其應用程序就通知tcp釋放連線。這時b發出的連線釋放報文段必須使fin=1.假定b的序號是w(在半關閉狀態b可能又傳送了一些資料)。b還必須從夫上次已傳送過的確認號ack=u+1。這時b進入last-ack狀態,等待a確認。

4.a在收到b的連線釋放報文段後,必須對此發出確認。在確認報文段中把ack置1,確認號ack=w+1,而自己的序號為seq=u+1(根據tcp標準,前面傳送的fin報文段要消耗乙個序號)。然後進入到time-wait(時間等待)狀態。現在tcp連線還沒有釋放掉。必須經過時間等待計時器(time-wait timer)設定的時間2msl後,a才進入到closed狀態。時間msl:maximum segment lifetime 最長報文段壽命,msl值可以根據具體情況設定。當a撤銷傳輸控制塊後,就結束了本次tcp連線。

為什麼a在time-wait狀態必須等待2msl的時間呢?

1)為了保證a傳送的最後乙個ack報文段能夠達到b。 這個ack報文段有可能丟失,因而使處在last-ack狀態的b收不到對已發的fin+ack報文段的確認。b會超時重傳fin+ack報文段,而a就能在2msl時間內收到這個重傳的fin+ack報文段,接著a重傳一次確認,重新啟動2msl計時器。最後, a和b都正常進入到closed狀態。如果a在time-wait狀態不等待一段時間,而是再傳送完ack報文後立即釋放連線,那麼就無法收到b重傳的fin+ack報文段,因而也不會再傳送一次確認報文。這樣, b就無法按照正常步驟進入closed狀態。

2)防止「已失效的連線請求報文段」出現在本連線中。a在傳送完最後乙個ack確認報文段後,再經過時間2msl,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣就可以使下乙個新的連線中不會出現這種舊的連線請求報文段。

b只要收到a發出的確認,就進入closed狀態,同樣,b在撤銷了相應的傳輸控制塊後,就結束了本次tcp的連線,b結束tcp連線的時間比a早一些。

msl的含義:

msl是maximum segment lifetime英文的縮寫,中文可以譯為「報文最大生存時間」,他是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。

2msl即兩倍的msl,tcp的time_wait狀態也稱為2msl等待狀態,當tcp的一端發起主動關閉,在發出最後乙個ack包後,即第3次握手完成後傳送了第四次握手的ack包後就進入了time_wait狀態,必須在此狀態上停留兩倍的msl時間,等待2msl時間主要目的是怕最後乙個ack包對方沒收到,那麼對方在超時後將重發第三次握手的fin包,主動關閉端接到重發的fin包後可以再發乙個ack應答包。在time_wait狀態時兩端的埠不能使用,要等到2msl時間結束才可繼續使用。當連線處於2msl等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設定so_reuseaddr選項達到不必等待2msl時間結束再使用此埠。

TCP三次握手 四次揮手詳解

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

TCP三次握手 四次揮手詳解

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

TCP三次握手 四次揮手詳解

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