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

淺談TCP協議(建立與斷開連接)

bubuko -- 數據通信 地址 img 正式 功能 返回 沒有

TCP是面向連接的,可靠的進程到進程通信的協議。
TCP提供全雙工服務,即數據可在同一時間雙向傳輸,每一個TCP都有發送緩存,用來臨時存儲數據。
TCP將若幹個字節構成一個分組,成為報文段(segment)
TCP報文段封裝在IP數據報中:
技術分享圖片
TCP報文段的首部格式如圖:
技術分享圖片
首部長度為20--60字節,
源端口號:他是16位字段,為發送方進程對應的端口號。
目標端口號:他是16位字段,對應的是接收端的進程,接收端收到數據段後,根據這個端口號來確定把數據送給那個應用程序的進程。
序號:當TCP從進程接收數據字節時,就把他們存儲在發送緩存中,並對每一個字節進行編號,編號的特點如下:
編號不一定從0開始,一般會產生一個隨機數作為第一個字節的編號,成為初始序號(ISN)
TCP每個方向的編號都是互相獨立的。
當字節都被編上號後,TCP就給每個報文段指派一個序號,序號就是該報文段中的第一個字節的編號
當數據到達目的後,接收端會按照這個序號吧把數據重新排列,保證數據的正確性
確認號:對發送端的確認信息,用它來告訴發送端這個序號之前的數據段都已經收到,如確認號是X,就是表示前X-1個數據段都已經收到
首部長度:用它可以確定首部數據結構的字節長度。一般情況下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字節的可選信息
TCP連接:
TCP是面向連接的協議,它在源點和終點之間建立一條虛連接。TCP報文段封裝成IP數據報後,每一個IP數據報可以走不同的路徑到達終點,因此收到的IP數據報可能不按順序到達,甚至可能丟失或損壞。如果一個報文段沒有按順序到達,那麽TCP保留它,然後等待它之前的報文段到達;如果一個報文段丟失或損壞,那麽TCP就要重傳。總之,TCP保證報文段是有序的。
在數據通信之前,發送端與接收端要先建立連接;等待數據發送結束後,雙方再斷開連接。TCP連接的每一方都是由一個IP地址和一個端口號組成的。
TCP建立連接的過程稱之為三次握手:
三次握手可以理解為兩個人在打電話
A:你好,我是A,能聽見說話麽
B:聽到了,我是B,你能聽見我說話嗎
A:可以的
第一次握手:客戶端使用一個隨機的端口號向服務器端的80/443端口發送建立連接的請求,此過程的典型標誌就是TCP的SYN控制位為1,其他五個控制位全為0。

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

第三次握手:客戶端收到了服務端的回復(包含請求和確認),也要向服務端回復一個確認信息,此過程的典型標誌就是TCP的ACK控制位為1,其他五個控制位全為0,而且確認序列號是服務端的初始序列號+1。
技術分享圖片
上圖中Seq表示請求序列號,ACK表示確認序列號,SYN和ACK為控制位,可以看出SYN位只有在請求建立連接時才被設置為1。

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

TCP斷開連接:

參加交換數據的雙方中的任何一方(客戶端或服務端)都可以關閉連接。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協議(建立與斷開連接)