1. 程式人生 > >TCP協議詳解(TCP建立連接與斷開連接)

TCP協議詳解(TCP建立連接與斷開連接)

想要 第一次 客戶端 單向 特點 mar image 端口 二次

TCP是面向連接的、可靠的進程到進程通信的協議。它提供的是全雙工(雙向可傳輸)的服務,每個TCP都有發送緩存和接受緩存,用來臨時存儲數據。


1、TCP報文段:
TCP把若幹個字節構成一個分組,稱為報文段(segment)。TCP報文段封裝在IP數據報中,TCP報文段的首部格式如下圖所示:

技術分享圖片

首部長度為20~60個字節,一下是各個字段的含義:
①:源端口號:它是16位字段,為發送發進程對應的端口號;
②:目標端口號:它是16位字段,對應的是接收端的進程,接收端收到數據段後,根據這個端口號來確定把數據送給哪個應用程序的進程。
③:序號:當TCP從進程接受數據字節時,就把它們存儲在發送緩存中,並對每一個字節都進行編號。編號的特點如下:

  • 編號不一定從0開始,一般會產生一個隨機數作為第一個字節的編號,稱為初始序列號(ISN)
  • TCP每個方向的編號是相互獨立的。
  • 當字節都被編上號後,TCP就給每個報文段指派一個序號,序號就是該報文段中第一個字節的編號。
    當數據到達目的地後,接收端會按照這個序號把數據重新排列,保證數據的正確性。
    ④:確認號:對發送端的確認信息,用它來告訴發送端這個序號之前的數據段都已經收到,如確認段是8,就是表示前7個數據段都已經收到。
    ⑤:首部長度:用它可以確定首部數據結構的字節長度。一般情況下TCP首部是20個字節,但首部長度最大可以擴展為60字節。
    ⑥:保留:這部分保留位供今後擴展功能用,目前還沒有使用到。
    ⑦:控制位:這六位有很重要的作用,TCP的連接、傳輸和斷開都受這六個控制位的指揮。各位含義如下:
  • URG:緊急指針有效位。
  • ACK:只有當ACK=1時,確認序列號字段才有效;當ACK=0時,確認號字段無效。
  • PSH:標誌位為1時,要求接受方盡快將數據段送達應用層。
  • RST:當RST值為1時,通知重新建立TCP連接。
  • SYN:同步序號位,TCP需要建立連接時將這個值設為1。
  • FIN:發送端完成發送任務,當TCP完成數據傳輸需要斷開連接時,提出斷開連接一方將這個值設為1。
    ⑧:窗口大小:說明本地可接受數據段的數目,這個值得大小是可變的,當網絡順暢時將這個窗口值變大以加快傳輸速度,當網絡不穩定時減小這個值可保證網絡數據的可靠傳輸,TCP中的流量控制機制就是依靠變化窗口的大小實現的。
    ⑨:校驗和:用來做差錯控制,與IP的校驗和不同,TCP校驗和的計算包括TCP首部、數據和其他填充字節。在發送TCP數據段時,由發送端計算校驗和,當到達目的地時又進行一次校驗和計算。若這兩次的校驗和一致,則說明數據基本是正確的,否則將認為該數據已被破壞,接受端將丟棄該數據。
    ⑩:緊急指針:和URG配合使用,當URG=1時有效。
    ?:選項:在TCP首部可以有多達40字節的可選信息。

——

2、TCP連接:
TCP是面向連接的協議,它在源點和終點之間建立一條虛連接。TCP報文段封裝成IP數據報後,每一個IP數據報可以走不同的路徑到達終點,因此收到的IP數據報可能不按順序到達,甚至可能丟失或損壞。如果一個報文段沒有按順序到達,那麽TCP保留它,然後等待它之前的報文段到達;如果一個報文段丟失或損壞,那麽TCP就要重傳。總之,TCP保證報文段是有序的。
在數據通信之前,發送端與接收端要先建立連接;等待數據發送結束後,雙方再斷開連接。TCP連接的每一方都是由一個IP地址和一個端口號組成的。

(1)建立連接:

TCP建立連接的過程稱為“三次握手”,要想在兩臺主機間使用TCP協議傳輸數據,那麽它必定會在傳輸數據之前經過“三次握手”來建立連接。

可以使用打電話的例子來簡單解釋三次握手:
A : 你好我是A,你聽得到我在說話嗎
B : 聽到了,我是B,你聽到我在說話嗎
A : 嗯,聽到了 
建立連接,開始聊天!(這就相當於三次握手)

那麽客戶端訪問服務器上的網站時,它三次握手的數據包含有的信息如下:
  • 第一次握手:客戶端使用一個隨機的端口號向服務器端的80/443端口發送建立連接的請求,此過程的典型標誌就是TCP的SYN控制位為1,其他五個控制位全為0。

  • 第二次握手:實際上是分兩部分來完成的。當服務端接受到了客戶端的請求,向客戶端回復一個確認消息,此過程的典型標誌就是TCP的ACK控制位為1,其他五個控制位全為0,而且確認序列號是客戶端的初始序列號+1。
    服務端也向客戶端發送建立連接的請求,此過程的典型標誌和第一次握手一樣。
    為了提高效率,一般將這兩部分合並在一個數據包裏實現。

  • 第三次握手:客戶端收到了服務端的回復(包含請求和確認),也要向服務端回復一個確認信息,此過程的典型標誌就是TCP的ACK控制位為1,其他五個控制位全為0,而且確認序列號是服務端的初始序列號+1。

這樣就完成了三次握手,客戶端與服務端之間就建立了TCP連接。三次握手可以總結為下圖所示的過程:
技術分享圖片

上圖中Seq表示請求序列號,ACK表示確認序列號,SYN和ACK為控制位,可以看出SYN位只有在請求建立連接時才被設置為1。

TCP使用面向連接的通信方式,它提高了數據傳輸的可靠性,使發送端和接收端在數據正式傳輸之前就有了交互,為數據正式傳輸打下了可靠的基礎。

(2)斷開連接:

參加交換數據的雙方中的任何一方(客戶端或服務端)都可以關閉連接。TCP斷開連接分四步,也稱為四次握手,具體過程如下:

  1. 服務器向客戶端發送FIN和ACK位置1的TCP報文段。
  2. 客戶端向服務器返回ACK位置1的TCP報文段(此時已經單向斷開了連接)。
  3. 客戶端向服務端發送FIN和ACK位置1的TCP報文段。
  4. 服務端向客戶端返回ACK位置1的TCP報文段。

在TCP斷開連接的過程中,有一個半關閉的概念,TCP的一方(通常是客戶端)可以終止發送數據,但仍然可以接受數據,稱為半關閉。主要是用在客戶端不需要發送數據了,會發送一個FIN報文段,半關閉這個連接,服務器發送ACK報文段接受半關閉,服務端會繼續傳輸數據,而客戶端只發送ACK確認,不再發送任何數據。當服務端把所有的數據發送完畢時,就發送FIN報文段,客戶端再發送ACK報文段,這樣就斷開了TCP連接。

為什麽TCP協議終止連接要四次?

1、當客戶端確認發送完數據且知道服務端已經接受完了,想要關閉發送數據口(當然確認信號還是可以發),就會發FIN給服務端。

2、服務端收到客戶端發送的FIN,表示收到了,就會發送ACK回復。

3、但這時服務端可能還在發送數據,沒有想要關閉數據口的意思,所以FIN與ACK不是同時發送的,而是等到服務端數據發送完了,才會發送FIN給客戶端。

4、客戶端收到服務端發來的FIN,知道服務端的數據也發送完了,回復ACK, 客戶端等待2MSL以後,沒有收到B傳來的任何消息,知道服務端已經收到自己的ACK了,客戶端就關閉連接,服務端也關閉連接了。

TCP協議詳解(TCP建立連接與斷開連接)