《網絡協議》TCP 協議
來源:程序員人生 發布時間:2014-12-13 09:13:48 閱讀次數:2468次
概述
TCP 和 UDP 都使用相同的網絡層 IP,但是與 UDP 不同的是,TCP 是面向連接的、可靠的字節流協議。因此,在傳輸數據之前通訊雙方必須建立1個 TCP 連接。TCP 通過檢驗和、序列號、確認應對、重發機制、連接收理和窗口控制等機制實現可靠性傳輸。
TCP通過以下方式提供可靠性:
- 利用數據被分割成 TCP 認為最適合發送的數據塊,即進行 TCP 分段。這點與 UDP 完全不同,利用程序產生的 UDP 數據報長度將保持不變,在 IP 層將 UDP 數據報加上IP 首部后,必要時對其進行 IP 分片。
- 當 TCP 發出1個報文段后,它會啟動1個定時器,等待目的端確認收到這個報文段,如果沒能及時收到該確認信息,則將重發這個報文段。即超時重傳。
- 當 TCP 接收端收到發自連接另外一真個 TCP 報文段時,它將發送1個確認,這個確認不是立即發送的,通常會推延幾分之1秒。即確認應對。
- TCP 將保持它首部和數據的校驗和。這是1個端到真個校驗和,目的是檢查數據在傳輸進程中的任何變化。如果收到的報文段的校驗和有過失,TCP 將拋棄該報文段,同時不發送確認收到的消息,從而使發送端超時重發。
- 由于 TCP 報文段作為 IP 數據報來傳輸,IP 數據報的到達可能會失序,因此 TCP 報文段的到達也可能失序,如果必要,TCP 將對收到的數據進行重排序,將收到的數據以正確的順序交給利用層。
- 由于 IP 數據報有可能產生重復,TCP 的接收端必須拋棄重復的數據。
- TCP 能提供流量控制。TCP 連接的每方都有固定大小的緩沖空間,TCP 的接受端只允許另外一端發送接收端緩沖區所能接納的數據,這將避免較快主機導致較慢主機的緩沖區溢出。即流量控制。
TCP 首部
TCP 首部以下圖所示:

TCP 首部比 UDP 首部復雜很多,并且沒有表示包長度和數據長度的字段,可由 IP 層獲得 TCP 的包長度,并由 TCP 包長度可知數據的長度。下面對 TCP 首部的個字段進行簡單介紹:
- 源端口號:表示發送端端口號,字段長 16 位;
- 目標端口號:表示接收端端口號,字段長 16 位;
- 序列號:字段長 32 位,是指發送數據的位置,即標識從發送端向接收端發送的字節流。每發送1次數據,就累加1次該數據字節數的大小。序列號不會從 0 或 1 開始,而是在建立連接時由計算機生成的隨機數作為其初始值,通過 SYN 包傳給接收端主機。然后再將每轉發過去的字節數累加到初始值上表示數據的位置。另外,在建立連接和斷開連接時發送的 SYN 包和 FIN 包雖然其實不攜帶數據,但是也會作為1個字節增加對應的序列號。由此可知,建立 TCP 連接是為了初始化序列號;
- 確認應對:字段長 32 位,是指下1次應當收到的數據的序列號。實際上,它是指已收到確認應對號減1為止的數據。發送端收到確認應對后可以認為在這個序列號之前的數據都已被正常接收;
- 首部長度(數據偏移):該字段表示 TCP 所傳輸的數據部份應當從 TCP 包的哪一個位置開始計算,可以把它看做是 TCP 首部的長度。該字段長 4 位,單位是 4 字節(即 32 位)。不包括選項字段的話,TCP 首部長度為 20 個字節,因此,數據偏移字段可設置為 5。反之,若該字段值為 5,那末說明從 TCP 包的1開始到 20 字節為止都是 TCP 首部,余下的部份為 TCP 數據;
- 保存:該字段主要是為了以后擴大時使用,其長度為 4 位,1般設置為 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 段以后沒必要馬上回復1個 FIN 包,而是可以等到緩沖區中的所有數據都由于已成功發送而被自動刪除以后再發 FIN 包;
- 窗口大小:該字段長 16 位,用于通知從相同 TCP 首部的確認應對號所指位置開始能夠接收的數據大小(8 位字節)。TCP 不允許發送超過該窗口大小的數據。若窗口為 0,則表示可以發送窗口探測,以了解最新的窗口大小,但這個數據必須是 1 個字節;
- 檢驗和:TCP 的檢驗和與 UDP 檢驗和1樣,也是采取偽首部,但是 TCP 的檢驗和沒法關閉。TCP 偽首部的信息和 UDP 1樣,包括:源 IP 地址、目的 IP 地址、填充、協議號和 TCP 包長度;
- 緊急指針:該字段為 16 位。只有在 URG 控制位為 1 時有效。該字段的數值表示本報文段中緊急數據的指針。從數據部份的首位到緊急指針所在的位置為止是緊急數據。因此,緊急指針是指出了緊急數據的末尾在報文段中的位置;
序列號與確認應對
在 TCP 中,當發送真個數據到達接收端主機時,接收端主機會返回1個已收到消息通知,該消息就是確認應對(ACK)。TCP 通過確認應對和序列號實現可靠的數據傳輸,若發送端發出數據以后得到接收真個確認應對,則表示該數據已成功到達接收端,否則可能丟失數據。

超時重傳
超時重傳是指在重發數據之前,等待確認應對到來的那個特定的時間間隔。若發送端將數據發送出去以后,在特定的時間內沒有收到接收真個確認應對,則發送端會重新發送該數據,這就是超時重傳機制。
連接收理
TCP 協議是提供面向連接的通訊傳輸,面向連接是指雙方在進行傳輸數據之前必須建立連接。有關 TCP 的建立連接和釋放連接放在后面講授。
窗口控制
TCP 傳輸數據是以 1 個段為單位,每發送1個段進行1次確認應對的處理,這樣使通訊時包的來回時間很長致使下降通訊性能。為了解決這個問題,TCP 引入了窗口控制,確認應對不再是以每一個分段,而是以更大的單位進行確認,這樣縮短轉發時間,也就是說,發送端主機在發送了1個段以后沒必要要1直等待確認應對,而是繼續發送數據段。窗口大小是指無需等待確認應對而可以發送數據的最大值。

采取窗口控制機制必須實現緩沖區,在圖 4 中,窗口內的數據即使是沒有收到確認應對也能夠發送出去。另外從該窗口中能看到的數據是因其某種數據已在傳輸中丟失,所以發送端才能接收到確認應對,這類情況下需要進行重發。為此,發送端主機在等到確認應對返回之前,必須在緩沖區中保存這部份的數據。在滑動窗口之外的部份包括還沒有發送的數據已已確認對端已收到的數據。當數據發出后若如期收到確認應對就能夠不用進行重發,此時數據可以從緩沖區中刪除。收到確認應對后,將窗口滑到確認應對中的序列號的位置,這樣可以順序地將多個段同時發送提供通訊性能。這類機制也稱為滑動窗口機制。
流量控制
流量控制可讓發送端根據接收真個實際接受能力控制發送的數據量。它的具體操作是,接收端主機向發送端主機通知自己可以接收數據的大小,因而發送端會發送不會超過該大小的數據,該限制大小即為窗口大小,即窗口大小由接收端主機決定。TCP 首部中,專門有1個字段來通知窗口大小,接收主機將自己可以接收的緩沖區大小放在該字段中通知發送端。當接收真個緩沖區面臨數據溢出時,窗口大小的值也是隨之改變,設置為1個更小的值通知發送端,從而控制數據的發送量,這樣到達流量的控制。
堵塞控制
為了避免網絡堵塞,TCP 采取了1種慢啟動算法,對發送數據量進行控制。為了調理發送真個數據發送量,引入了堵塞窗口,在慢啟動時,將這個堵塞窗口設為 1 個數據段發送數據,以后每收到1次確認應對,堵塞窗口的值就加 1。在發送數據包時,將堵塞窗口的大小與接收端主機通知的窗口大小進行比較,然后選擇較小的值來控制數據量的發送。
參考資料:
《TCP/IP 詳解》
《圖解 TCP/IP》
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈