TCP的連接建立和釋放

(複習複習= =)

5.5 TCP報文段的首部格式

              8               16               24               32  
源 端 口 目 的 端 口 20





序 號
確 認 號
數據偏移 保 留 U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
F
I
N
窗 口
檢 驗 和 緊 急 指 針
選 項(長度可變,最長40字節) 填 充  

 

 

 

 

 

 

 

 

 

序號
佔4字節,共2^32(即4294967296)個序號,序號增加到2^32-1後,下一個序號回到0。首部中的序號字段值指的是本報文段所發送的數據的第一個子節的序號。
確認號
佔4字節,是期望收到對方下一個報文段的第一個數據字節的序號。例如,B正確收到了A發送過來的一個報文段,其序號字段爲501,數據長度200字節(序號501~700),則B期望收到A的下一個數據序號是701,於是B在發送給A的確認報文段中把確認號置爲701。
注意:若確認號=N,則表明:到序號N-1爲止的所有數據都已正確收到。
確認ACK
僅當ACK=1時確認號字段纔有效。TCP規定,在連接建立後所有傳送的報文段都必須把ACK置1。
同步SYN
在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文段。對方若同意建立連接,則應在響應的報文段中使SYN=1和ACK=1。所以,SYN=1表示這是一個連接請求或連接接受報文。
終止FIN
當FIN=1,表示此報文段的發送方的數據已發送完畢,並要求釋放運輸連接。
窗口
佔2字節,指發送本報文段的一方的接收窗口(而不是自己的發送窗口)。例如確認號是701,窗口字段是1000,表示發送此報文段的一方還有1000個字節數據(序號701-1700)的接收緩存空間。
注意:窗口字段明確指出了現在允許對方發送的數據量,它是動態變化的。
 

5.9 TCP的運輸連接管理

運輸連接的三個階段:連接建立、數據傳送和連接釋放。

TCP的連接建立 / 三次握手(three-way handshake)

假定主機A運行的是TCP客戶程序,而B運行TCP服務器程序。

最初兩端的TCP進程都處於 CLOSED(關閉)狀態。

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+1TCP的標準規定,ACK報文段可以攜帶數據。但如果不攜帶數據則不消耗序號,在這種情況下,下一個數據報文段的序號仍是seq=x+1。這時,TCP連接已經建立,A進入 ESTABLISHED(已建立連接)狀態

當B收到A的確認後,也進入 ESTABLISHED狀態

TCP的連接釋放 / 四次握手

數據傳輸結束後,通信的雙方都可釋放連接。現在A和B都處於 ESTABLISHED狀態。

A的應用進程先向其TCP發出連接釋放報文段,並停止再發送數據,主動關閉TCP連接。A把連接釋放報文段首部的終止控制位FIN置1,其序號seq=u,它等於前面已傳送過的數據的最後一個字節的序號加1。這時A進入 FIN-WAIT1(終止等待1)狀態,等待B的確認。請注意,TCP規定,FIN報文段即使不攜帶數據,它也消耗掉一個序號。

B收到連接釋放報文段後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等於B前面已傳送過的數據的最後一個字節的序號加1。然後B就進入 CLOSE WAIT(關閉等待)狀態。TCP服務器進程這時應通知高層應用進程,因而從A到B這個方向的連接就釋放了,這時的TCP連接處於半關閉 (half-close)狀態,即A已經沒有數據要發送了,但B若發送數據,A仍要接收。即從B到A這個方向的連接並未關閉,這個狀態可能會持續一些時間。

A收到來自B的確認後,就進入 FIN-WAIT2(終止等待2)狀態,等待B發出的連接釋放報文段。
若B已經沒有要向A發送的數據,其應用進程就通知TCP釋放連接。這時B發出的連接釋放報文段必須使FIN=1。現假定B的序號爲w(在半關閉狀態B可能又發送了一些數據)。B還必須重複上次已發送過的確認號ack=u+1,這時B就進入 LAST-ACK(最後確認)狀態,等待A的確認。

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)。

 

參考資料:《計算機網絡(第6版)》 謝希仁 編著 5.5 TCP報文段的首部格式,5.9 TCP的運輸連接管理

 

發佈了92 篇原創文章 · 獲贊 2 · 訪問量 5696
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章