1. 程式人生 > >TCP詳解——連接建立與斷開

TCP詳解——連接建立與斷開

介紹 32bit 標誌位 關閉連接 選擇 tro 窗口大小 syn 重新發送

一、報文結構介紹

  在開始講TCP連接過程時,還是先看看TCP報文的格式如圖1所示。IP數據報此時由IP頭部+TCP頭部+TCP數據組成。不帶選項的TCP頭部是20字節長,而帶選項的,TCP頭部最長可達60字節。常見的選項包括最大的大小(MSS),時間戳(傳輸控制時使用)、窗口縮放(流量控制時使用)、選擇性ACK(傳輸控制時使用)。我們來具體看下TCP頭部字段如圖2所示。

技術分享

圖1 IP數據報中TCP封裝

  圖2所示的即是TCP頭部的詳細結構。源端口與目的端口和源IP及目的IP這四元組唯一標識每個TCP連接。序列號(Sequence Number)字段標識TCP的一端到另一端的數據流的第一個開始字節(例如發送端發送的數據總字節長度為1000字節,假定序列號從1開始,總的序列號是1-1000,TCP會給每個字節賦予一個序列號)。通過序列號來代表發送端到接收端的數據,接收端接收到數據後,即可通過確認號(ACK)來發送給發送端,讓發送端知道數據已被接受。這個ACK號是由接收到的數據的序列號加1,代表接收端希望接收的下一個數據的序列號。(註:ACK是不占用序列號的,原因是接收端發送ACK給發送端後,發送端的ISN是等於此時接收到的ACK號)。

技術分享

圖2 TCP頭部結構

  頭部長度的單位32bit,所以這也定義了TCP的長度最大為4*15=60字節。八個標誌位中(CWR、ECE。。。等),這裏先每個介紹,後面文章有用到時在另行介紹。我們來主要了解下ACK、SYN、FIN。ACK即確認,連接建立後一般都是啟用狀態。SYN用於初始化一個連接的同步序列號。當發送方已經結束數據的發送時,即發送FIN報文段給接收端。窗口大小在TCP流量控制中會重點講解。

二、TCP連接的建立與終止

  如圖3所示即為TCP連接建立與終止的過程圖。

技術分享

圖3 TCP連接的建立與終止

TCP建立的三次握手:

  1、發送端發送一個SYN報文段(SYN位被置位),SYN中包含TCP目的端口和發送端的初始序列號(圖中ISN(c)),同時攜帶著TCP選項數據。

  2、接收端收到發送端連接請求後,接收端發送自己SYN報文段(包含ISN(s)),同時對發送端的SYN進行確認,如前所述,接收端發送的ACK是ISN(c)+1。此時ACK位與SYN位都被置位。接收端發送SYN+ACK到發送端。

  3、發送端接收到接收端的SYN+ACK數據後,對ISN(s)進行確認,發送ACK為ISN(s)+1的報文段給接收端。

TCP斷開的四次握手:

  1、TCP協議規定通過發送一個FIN段(FIN被置位)來發起關閉操作,圖3中發送端發送FIN段給接收端,告知它數據已發送完畢,請求斷開TCP連接。同時FIN報文段還包含著對最近收到的數據進行ACK。

  2、接收端接收端FIN報文段後,對FIN進行確認,發送ACK=k+1給發送端。

  3、接收端將連接關閉發送給上層應用程序,由應用程序發起連接關閉操作。此時接收端由被動關閉連接壯成主動,並發送FIN報文段給發送端。報文的序列號為L(這裏也可看出上一步驟中發送ACK序列號也為L,因為ACK不占用序列號,所以這裏的FIN的序列號也為L)。

  4、發送端接收到FIN後,發送回ACK給接收端後,TCP連接終止。如果FIN丟失,發送FIN的那端需要重新發送FIN,知道接收到ACK為止。

三:總結

  如前所述,建立一個TCP連接需要3個報文段,而關閉TCP連接需要4個報文段。

TCP詳解——連接建立與斷開