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數據段時,由發送端計算校驗和,當到達目的地時又進行一次校驗和計算。若這兩次的校驗和一致,則說明數據基本是正確的,否則將認為該數據已被破壞,接受端將丟棄該數據。
?:選項:在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斷開連接分四步,也稱為四次握手,具體過程如下:
- 服務器向客戶端發送FIN和ACK位置1的TCP報文段。
- 客戶端向服務器返回ACK位置1的TCP報文段(此時已經單向斷開了連接)。
- 客戶端向服務端發送FIN和ACK位置1的TCP報文段。
- 服務端向客戶端返回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建立連接與斷開連接)