TCP/IP 詳解卷一 - TCP CWR、ECE、URG、ACK、PSH、RST、SYN、FIN控制位


from:https://blog.csdn.net/u012243115/article/details/43487461

        TCP 和 UDP 都使用相同的網絡層 IP,但是與 UDP 不同的是,TCP 是面向連接的、可靠的字節流協議。因此,在傳輸數據之前通信雙方必須建立一個 TCP 連接。TCP 通過檢驗和、序列號、確認應答、重發機制、連接管理以及窗口控制等機制實現可靠性傳輸。

TCP通過以下方式提供可靠性:

1.        應用數據被分割成 TCP 認為最合適發送的數據塊,即進行TCP 分段。這點與 UDP 完全不同,應用程序產生的UDP 數據報長度將保持不變,在 IP 層將 UDP 數據報加上IP 首部后,必要時對其進行 IP 分片。

2.        當 TCP 發出一個報文段后,它會啟動一個定時器,等待目的端確認收到這個報文段,如果沒能及時收到該確認信息,則將重發這個報文段。即超時重傳。

3.        當 TCP 接收端收到連接另一端的 TCP 報文段時,它將發送一個確認,這個確認不是立即發送的,通常會推遲幾分之一秒。即確認應答(ACK)。

4.        TCP 將保持它首部和數據的校驗和。這是一個端到端的校驗和,目的是檢查數據在傳輸過程中的任何變化。如果收到的報文段的校驗和有差錯,TCP 將丟棄該報文段,同時不發送確認收到的消息,從而使發送端超時重發。

5.        由於 TCP 報文段作為 IP 數據報來傳輸,IP 數據報的到達可能會失序,因此 TCP 報文段的到達也可能失序,如果必要,TCP 將對收到的數據進行重排序,將收到的數據以正確的順序交給應用層。 

6.        由於 IP 數據報有可能發生重復,TCP 的接收端必須丟棄重復的數據。

7.        TCP 能提供流量控制。TCP 連接的每一方都有固定大小的緩沖空間,TCP 的接受端只允許另一端發送接收端緩沖區所能接納的數據,這將防止較快主機致使較慢主機的緩沖區溢出。即流量控制。

 

TCP 首部

 

    TCP數據被封裝在一個IP數據報中,如圖所示:

TCP 首部,不如不計任選字段,它通常是20個字節。如下圖所示:

        TCP 首部比 UDP 首部復雜很多,並且沒有表示包長度和數據長度的字段,可由 IP 層獲取 TCP 的包長度,並由 TCP 包長度可知數據的長度。下面對 TCP 首部的個字段進行簡單介紹:

源端口號:表示發送端端口號,字段長 16 位;

目標端口號:表示接收端端口號,字段長 16 位;

每個 TCP段都包含源端和目的端的端口號,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端 IP地址和目的端 IP地址唯一確定一個 TCP連接。

序列號:字段長 32 位,占4個字節,序號的范圍為[0,4284967296]。由於TCP是面向字節流的,在一個TCP連接中傳送的字節流中的每一個字節都按順序編號,首部中的序號字段則是指本報文段所發送的數據的第一個字節的序號。另外,序號是循環使用的,當序號增加到最大值時,下一個序號就又回到了0。

確認應答:字段長 32 位,當ACK標志位為1時有效,表示期望收到的下一個報文段的第一個數據字節的序號。確認號為N,則表明到序號N-1為止的所有數據字節都已經被正確地接收到了。

首部長度(數據偏移):該字段表示 TCP 所傳輸的數據部分應該從 TCP 包的哪個位置開始計算,可以把它看作是 TCP 首部的長度。該字段長 4 位,單位是 4 字節(即 32 位)。不包括選項字段的話,TCP 首部長度為 20 個字節,因此,數據偏移字段可設置為 5。反之,若該字段值為 5,那么說明從 TCP 包的一開始到 20 字節為止都是 TCP 首部,余下的部分為 TCP 數據;

保留:該字段主要是為了以后擴展時使用,其長度為 4 位,一般設置為 0,但即使收到的包在該字段不為 0,此包也不會被丟棄;

控制位:字段長為 8 位,每一位從左到右分別為 CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。這些控制標志也叫做控制位。當他們的對應位上值為 1 時,具體含義如下:

CWR:CWR 標志與后面的 ECE 標志都用於 IP 首部的 ECN 字段,ECE 標志為 1 時,則通知對方已將擁塞窗口縮小;

ECE:若其值為 1 則會通知對方,從對方到這邊的網絡有阻塞。在收到數據包的 IP 首部中 ECN 為 1 時將 TCP 首部中的 ECE 設為 1.;

URG:該位設為 1,表示包中有需要緊急處理的數據,對於需要緊急處理的數據,與后面的緊急指針有關;

ACK:該位設為 1,確認應答的字段有效,TCP規定除了最初建立連接時的 SYN 包之外該位必須設為 1

PSH:該位設為 1,表示需要將收到的數據立刻傳給上層應用協議,若設為 0,則先將數據進行緩存;

RST:該位設為 1,表示 TCP 連接出現異常必須強制斷開連接;

SYN:用於建立連接,該位設為 1,表示希望建立連接,並在其序列號的字段進行序列號初值設定;

FIN:該位設為 1,表示今后不再有數據發送,希望斷開連接。當通信結束希望斷開連接時,通信雙方的主機之間就可以相互交換 FIN 位置為 1 的 TCP 段。每個主機又對對方的 FIN 包進行確認應答之后可以斷開連接。不過,主機收到 FIN 設置為 1 的 TCP 段之后不必馬上回復一個 FIN 包,而是可以等到緩沖區中的所有數據都因為已成功發送而被自動刪除之后再發 FIN 包;

窗口大小:該字段長 16 位,用於通知從相同 TCP 首部的確認應答號所指位置開始能夠接收的數據大小(8 位字節)。TCP 不允許發送超過該窗口大小的數據。若窗口為 0,則表示可以發送窗口探測,以了解最新的窗口大小,但這個數據必須是 1 個字節;

檢驗和:TCP 的檢驗和與 UDP 檢驗和一樣,也是采用偽首部,但是 TCP 的檢驗和無法關閉。TCP 偽首部的信息和 UDP 一樣,包括:源 IP 地址、目的 IP 地址、填充、協議號以及 TCP 包長度;

緊急指針:該字段為 16 位。只有在 URG 控制位為 1 時有效。該字段的數值表示本報文段中緊急數據的指針。從數據部分的首位到緊急指針所在的位置為止是緊急數據。因此,緊急指針是指出了緊急數據的末尾在報文段中的位置; 

 

通過序列號與確認應答提高可靠性

 

        在TCP中,當發送端的數據到達接收主機時,接收端主機會返回一個已收到消息的通知。這個消息叫做確認應答(ACK)。

        TCP通過肯定的確認應答(ACK)實現可靠的數據傳輸。當發送端將數據發出之后會等待對端的確認應答。如果有確認應答,說明數據已經成功大道對端。反之,則數據丟失的可能性很大。        

        未收到確認應答並不意味着數據一定丟失。也有可能是數據對方已經收到,只是返回的確認應答在途中丟失。這種情況也會導致發送端因沒有收到確認應答,而認為數據沒有達到目的地,從而進行重發。

        此外,也有可能因為一些其他原因導致確認應答延遲到達,在源主機重發數據以后才到達的情況也屢見不鮮。此時,源發送主機只要按照機制重發數據即可。但是目標主機這時會反復收到相同的數據。而為了對上層應用提供可靠的傳輸,必須的放棄重復的數據包。為此,就必須引入一種機制,它能夠識別是否已經接收到數據,又能判斷是否需要接收。

        上述這些確認應答處理、重發機制以及重發控制等功能都可以通過序列號實現。序列號是按順序給發送數據的每一個字節(8位字節)都標上號碼的編號。接收端查詢接收數據TCP首部中的序列號和數據長度,將自己下一步應該接收的序列號作為確認應答返送回去。就這樣通過序列號和確認應答號,TCP可以實現可靠傳輸。

重發超時如何確定

 

        重發超時是指在重發數據之前,等待確認應答到來的那個特定時間間隔。如果超過了這個時間仍未收到確認應答,發送端將進行數據重發。重發超時一般都是0.5秒的整數倍,由於最初的數據包還不知道往返時間,所以其重發超時一般設置為6秒左右。數據被重發之后若還是收不到確認應答,則進行再次發送。此時,等待確認應答的時間將會以2倍、4倍的指數函數延長。此外,數據也不會被無限、反復地重發。達到一定重發次數以后,如果仍沒有任何確認應答返回,就會判斷為網絡或對端主機發生了異常,強制關閉連接。並且通知應用通信異常強行終止。

 

連接管理

 

        TCP提供面向有連接的通信傳輸。面向有連接是指在數據通信開始之前先做好通信兩端之間的准備工作。

        UDP是一種面向無連接的通信協議,因此不檢查對端是否可以通信,直接將UDP包發送出去。TCP與此相反,它會在數據通信之前,通過TCP首部發送一個SYN包作為建立連接的請求等待確認應答。如果對端發來確認應答,則認為可以進行數據通信。如果對端的確認應答未能到達,就不會進行數據通信。此外,在通信結束時會進行斷開連接的處理。

        可以使用TCP首部用於控制的字段來管理TCP連接。一個連接的建立與斷開,正常過程至少需要來回發送7個包才能完成。


 

窗口控制

 

        TCP 傳輸數據是以 1 個段為單位,每發送一個段進行一次確認應答的處理,這樣使通信時包的往返時間很長導致降低通信性能。為了解決這個問題,TCP 引入了窗口控制,確認應答不再是以每個分段,而是以更大的單位進行確認,這樣縮短轉發時間,也就是說,發送端主機在發送了一個段之后不必要一直等待確認應答,而是繼續發送數據段。窗口大小是指無需等待確認應答而可以發送數據的最大值。   

         采用窗口控制機制必須實現緩沖區,在圖 4 中,窗口內的數據即便是沒有收到確認應答也可以發送出去。此外從該窗口中能看到的數據是因其某種數據已在傳輸中丟失,所以發送端才能接收到確認應答,這種情況下需要進行重發。為此,發送端主機在等到確認應答返回之前,必須在緩沖區中保留這部分的數據。在滑動窗口以外的部分包括尚未發送的數據和已經確認對端已經收到的數據。當數據發出后若如期收到確認應答就可以不用進行重發,此時數據可以從緩沖區中刪除。收到確認應答后,將窗口滑到確認應答中的序列號的位置,這樣可以順序地將多個段同時發送提供通信性能。這種機制也稱為滑動窗口機制。

 

流量控制

 

        流量控制可以讓發送端根據接收端的實際接受能力控制發送的數據量。它的具體操作是,接收端主機向發送端主機通知自己可以接收數據的大小,於是發送端會發送不會超過該大小的數據,該限制大小即為窗口大小,即窗口大小由接收端主機決定。TCP 首部中,專門有一個字段來通知窗口大小,接收主機將自己可以接收的緩沖區大小放在該字段中通知發送端。當接收端的緩沖區面臨數據溢出時,窗口大小的值也是隨之改變,設置為一個更小的值通知發送端,從而控制數據的發送量,這樣達到流量的控制。

 

擁塞控制

 

        一般來說,計算機網絡都處在一個共享的環境。因此,有可能因為其他主機之間的通信使得網絡擁堵。在網絡出現擁堵時,如果突然發送一個較大量的數據,極有可能會導致整個網絡癱瘓。TCP為了防止網絡擁塞,TCP 采用了一種慢啟動算法,對發送數據量進行控制。為了調節發送端的數據發送量,引入了擁塞窗口,在慢啟動時,將這個擁塞窗口設為 1 個數據段發送數據,之后每收到一次確認應答,擁塞窗口的值就加 1。在發送數據包時,將擁塞窗口的大小與接收端主機通知的窗口大小進行比較,然后選擇較小的值來控制數據量的發送。

版權聲明:轉載請注明出處。 https://blog.csdn.net/u012243115/article/details/43487461


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM