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

TCP 首部比 UDP 首部復雜很多,并且沒有表示包長度和數(shù)據(jù)長度的字段,可由 IP 層獲得 TCP 的包長度,并由 TCP 包長度可知數(shù)據(jù)的長度。下面對 TCP 首部的個字段進行簡單介紹:
- 源端口號:表示發(fā)送端端口號,字段長 16 位;
- 目標端口號:表示接收端端口號,字段長 16 位;
- 序列號:字段長 32 位,是指發(fā)送數(shù)據(jù)的位置,即標識從發(fā)送端向接收端發(fā)送的字節(jié)流。每發(fā)送1次數(shù)據(jù),就累加1次該數(shù)據(jù)字節(jié)數(shù)的大小。序列號不會從 0 或 1 開始,而是在建立連接時由計算機生成的隨機數(shù)作為其初始值,通過 SYN 包傳給接收端主機。然后再將每轉發(fā)過去的字節(jié)數(shù)累加到初始值上表示數(shù)據(jù)的位置。另外,在建立連接和斷開連接時發(fā)送的 SYN 包和 FIN 包雖然其實不攜帶數(shù)據(jù),但是也會作為1個字節(jié)增加對應的序列號。由此可知,建立 TCP 連接是為了初始化序列號;
- 確認應對:字段長 32 位,是指下1次應當收到的數(shù)據(jù)的序列號。實際上,它是指已收到確認應對號減1為止的數(shù)據(jù)。發(fā)送端收到確認應對后可以認為在這個序列號之前的數(shù)據(jù)都已被正常接收;
- 首部長度(數(shù)據(jù)偏移):該字段表示 TCP 所傳輸?shù)臄?shù)據(jù)部份應當從 TCP 包的哪一個位置開始計算,可以把它看做是 TCP 首部的長度。該字段長 4 位,單位是 4 字節(jié)(即 32 位)。不包括選項字段的話,TCP 首部長度為 20 個字節(jié),因此,數(shù)據(jù)偏移字段可設置為 5。反之,若該字段值為 5,那末說明從 TCP 包的1開始到 20 字節(jié)為止都是 TCP 首部,余下的部份為 TCP 數(shù)據(jù);
- 保存:該字段主要是為了以后擴大時使用,其長度為 4 位,1般設置為 0,但即便收到的包在該字段不為 0,此包也不會被拋棄;
- 控制位:字段長為 8 位,每位從左到右分別為 CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。這些控制標志也叫做控制位。當他們的對應位上值為 1 時,具體含義以下:
- CWR:CWR 標志與后面的 ECE 標志都用于 IP 首部的 ECN 字段,ECE 標志為 1 時,則通知對方已將堵塞窗口縮小;
- ECE:若其值為 1 則會通知對方,從對方到這邊的網絡有阻塞。在收到數(shù)據(jù)包的 IP 首部中 ECN 為 1 時將 TCP 首部中的 ECE 設為 1.;
- URG:該位設為 1,表示包中有需要緊急處理的數(shù)據(jù),對需要緊急處理的數(shù)據(jù),與后面的緊急指針有關;
- ACK:該位設為 1,確認應對的字段有效,TCP 規(guī)定除最初建立連接時的 SYN 包以外該位必須設為 1;
- PSH:該位設為 1,表示需要將收到的數(shù)據(jù)立刻傳給上層利用協(xié)議,若設為 0,則先將數(shù)據(jù)進行緩存;
- RST:該位設為 1,表示 TCP 連接出現(xiàn)異常必須強迫斷開連接;
- SYN:用于建立連接,該位設為 1,表示希望建立連接,并在其序列號的字段進行序列號初值設定;
- FIN:該位設為 1,表示今后不再有數(shù)據(jù)發(fā)送,希望斷開連接。當通訊結束希望斷開連接時,通訊雙方的主機之間就能夠相互交換 FIN 位置為 1 的 TCP 段。每一個主機又對對方的 FIN 包進行確認應對以后可以斷開連接。不過,主機收到 FIN 設置為 1 的 TCP 段以后沒必要馬上回復1個 FIN 包,而是可以等到緩沖區(qū)中的所有數(shù)據(jù)都由于已成功發(fā)送而被自動刪除以后再發(fā) FIN 包;
- 窗口大小:該字段長 16 位,用于通知從相同 TCP 首部的確認應對號所指位置開始能夠接收的數(shù)據(jù)大小(8 位字節(jié))。TCP 不允許發(fā)送超過該窗口大小的數(shù)據(jù)。若窗口為 0,則表示可以發(fā)送窗口探測,以了解最新的窗口大小,但這個數(shù)據(jù)必須是 1 個字節(jié);
- 檢驗和:TCP 的檢驗和與 UDP 檢驗和1樣,也是采取偽首部,但是 TCP 的檢驗和沒法關閉。TCP 偽首部的信息和 UDP 1樣,包括:源 IP 地址、目的 IP 地址、填充、協(xié)議號和 TCP 包長度;
- 緊急指針:該字段為 16 位。只有在 URG 控制位為 1 時有效。該字段的數(shù)值表示本報文段中緊急數(shù)據(jù)的指針。從數(shù)據(jù)部份的首位到緊急指針所在的位置為止是緊急數(shù)據(jù)。因此,緊急指針是指出了緊急數(shù)據(jù)的末尾在報文段中的位置;
序列號與確認應對
在 TCP 中,當發(fā)送真?zhèn)€數(shù)據(jù)到達接收端主機時,接收端主機會返回1個已收到消息通知,該消息就是確認應對(ACK)。TCP 通過確認應對和序列號實現(xiàn)可靠的數(shù)據(jù)傳輸,若發(fā)送端發(fā)出數(shù)據(jù)以后得到接收真?zhèn)€確認應對,則表示該數(shù)據(jù)已成功到達接收端,否則可能丟失數(shù)據(jù)。

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

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