先來一張全景圖,3 秒快速了解整篇文章的內容。
初始傳輸層
前面說過,傳輸層的作用是建立應用程序間的端到端連接,為數據傳輸提供可靠或不可靠的通信服務。傳輸層有兩個重要協議,分別是 TCP 和 UDP。TCP 是面向連接的可靠傳輸協議,UDP 是無連接的不可靠傳輸協議。
傳輸層協議
一個 IP 地址可以標識一臺主機,IP 報文頭部有一個字段,用來標識上層協議類型。根據這個字段的協議號,來識別 IP 傳輸的數據是 TCP 還是 UDP 。IP 用協議號 6 標識 TCP ,用協議號 17 標識 UDP 。但一臺主機可能同時有多個程序,傳輸層的 TCP 和 UDP ,為了識別上一層的應用程序類型,使用端口號來識別具體的程序,從而使這些程序可以復用網絡通道。
協議號和端口號
二層的幀通信和三層的包通信都是無連接的、不可靠的通信方式,四層的 TCP 卻是一種可靠的通信方式。如果幀在傳輸中丟失,通信雙方的二層功能模塊發現不了;如果包在傳輸中丟失,通信雙方的三層功能模塊發現不了。燃鵝,一個 TCP 段丟失了,TCP 模塊一定能夠發現。一個 TCP 段的丟失,意味著一個 IP 包的丟失,因為 TCP 段是封裝在 IP 包里的;同理,一個 IP 包的丟失,意味著一個幀的丟失。因此,二層和三層通信的不可靠性在 TCP 這里得到補償。
數據封裝
應用程序其實就是 TCP/IP 的應用協議,應用協議大多以客戶端/服務端的形式運行。客戶端( Client ,使用服務的一方。)是請求的發起端。而服務端( Server ,提供服務的程序或主機。)則是請求的處理端。作為服務端的程序有必要提前啟動,隨時準備接收客戶端的請求。否則即使有客戶端的請求發過來,也無法進行處理。
Client/Server模式
確認一個請求究竟是發給哪一個服務端,可以通過收到數據包的目的端口號輕松識別。當收到 TCP 的建立連接請求時,如果目的端口號是 22 ,則轉給 SSH ,如果是 80 則轉給 HTTP 。
>TCP
TCP 是面向連接的、可靠的流協議。流就是不間斷的數據,當應用程序采用 TCP 發送消息時,雖然是按順序發送,但接收端收到是沒有間隔的數據流。比如,在發送端應用程序發送了 10 次 100 字節的數據,那么在接收端,應用程序可能會收到一個 1000 字節連續不間斷的數據。
可靠傳輸
TCP 為提供可靠性傳輸,實行順序控制、重發控制機制。此外還有流量控制、擁塞控制、提高網絡利用率等眾多功能。
>UDP
**UDP **是不具有可靠性的協議,可靠性功能交給上層的應用去完成。UDP 雖然可以確保發送數據的大小,比如:發送端應用程序發送一個 100 字節的消息,那么接收端應用程序也會以 100 字節為長度接收數據。但不能保證數據一定會到達。因此,應用有時會根據需要進行重發處理。
不可靠傳輸
>TCP 和 UDP 的區別
TCP 是可靠的傳輸協議,一定會優于 UDP 嗎?其實不然,TCP是面向連接的,并且具備順序控制、重發控制等機制,可以為應用提供可靠傳輸。而 UDP 主要用于對高速傳輸和實時性有較高要求的通信。比如:通過 IP 電話進行通話。如果使用 TCP ,數據如果丟失會重發,這樣就無法流暢地傳輸通話的聲音,導致無法進行正常交流。而采用 UDP ,它不會進行重發處理。也就不會有聲音大幅度延遲到達的問題。即使有部分數據丟失,也只會影響小部分的通話。因此,TCP 和 UDP 需要根據應用的目的選擇使用。
端口號
數據鏈路層和網絡層的地址,分別是 MAC 地址和 IP 地址。MAC 地址用來標識同一網段中不同的設備,IP 地址標識網絡中的主機或路由器。傳輸層的地址就是端口號,端口號用來識別同一臺主機中不同的應用程序,也被稱為程序地址。
一臺主機可以同時運行多個程序,比如 WWW 服務的 Web 瀏覽器、電子郵箱客戶端等程序都可同時運行。傳輸層協議正是利用這些端口號,識別主機正在進行通信的應用程序,并準確的傳輸數據。
端口號
僅僅通過目的端口來識別某一個通信是不準確的。兩臺主機訪問的目的端口號 80 相同,可以根據源端口號區分這兩個通信。
目的端口號和源端口號相同,但是兩臺主機的源 IP地址不同;IP 地址和端口號都一樣,只是協議號不同。這些情況,都會認為是兩個不同的通信。
因此,網絡通信中通常采用 5 個信息來識別一個通信。它們是源 IP 地址、目的 IP 地址、協議號、源端口號、目的端口號。只要其中一項不同,就會認為是不同的通信。
會話五元素
TCP/UDP 的端口號是一個 16 位二進制數,端口號范圍為 0 ~ 65535 。在實際進行通信時,要事先確定端口號。確定端口號的方法分為兩種:
1)標準端口號
這種方法也叫靜態方法。它是指每個應用程序都有指定的端口號。HTTP 、TELNET 、FTP 等常用的應用程序所使用的端口號是固定的,這些端口號又稱為知名端口號。知名端口號范圍是 0 ~ 1023 。
除了知名端口號外,還有一些端口號也被正式注冊,稱為注冊端口。它們分布在 1024 ~ 49151 之間。
標準端口號
2)時序分配法
這種方法也叫動態分配法。服務端有必要確定監聽的端口號,但是接受服務的客戶端不需要確定端口號。
客戶端應用程序不用設置端口號,由操作系統進行分配。操作系統可以為每個應用程序分配不沖突的端口號。比如:每需要一個新的端口號時,就在之前分配號碼的基礎上加 1 。這樣,操作系統就可以動態管理端口號了。
動態分配的端口號范圍是 49152 ~ 65535 之間。
UDP
UDP ,全稱 User Datagram Protocol 。UDP 不提供復雜的控制機制,利用 IP 提供面向無連接的、不可靠的通信服務。并且它是將應用程序發來的數據,在收到的那一刻,立即按照原樣發送到網絡上的一種機制。
即使在網絡出現擁堵的情況下,UDP 也無法進行流量控制。傳輸途中出現丟包,UDP 也不負責重發。當出現包的到達順序錯誤時也沒有糾正的功能。如果需要這些細節控制,那么需要交由上層的應用程序去處理。也可以說,是損失信息傳輸的可靠性來提升信息傳輸的效率。
UDP 的特點如下:
UDP 是無連接的:UDP 發送數據前不與對方建立連接。
UDP 不對數據進行排序:UDP 報文的頭部沒有數據順序的信息。
UDP 對數據不發送確認,發送端不知道數據是否被正確接收,也不會重發數據。
UDP 傳送數據比 TCP 快,系統開銷也少。
UDP 缺乏擁塞控制機制,不能夠檢測到網絡擁塞。
由于 UDP 面向無連接,它可以隨時發送數據。再加上 UDP 本身的處理既簡單又高效,因此常用于以下幾個方面:
包總量較少的通信( DNS 、SNMP 等)
只在局域網使用的應用通信
廣播通信(廣播、多播)
UDP知名端口號
TCP
UDP 將部分控制轉移給應用程序去處理,只提供作為傳輸層協議的最基本功能。與 UDP 不同,TCP 是對傳輸、發送、通信進行控制的協議。
主要特點如下:
三次握手建立連接:確保連接建立的可靠性。
端口號:通過端口號識別上層協議和服務,實現網絡的多路復用。
完整性校驗:通過計算校驗和,保證接收端能檢測出傳輸過程中可能出現的錯誤。
確認機制:對于正確收到的數據,接收端通過確認應答告知發送方,超出一定時間后,發送方將重傳沒有被確認的段,確保傳輸的可靠性。
序列號:發送的數據都有唯一的序列號,標識了每一個段。接收端可以利用序列號實現丟失檢測、亂序重排等功能。
窗口機制:通過可調節的窗口,TCP 接收端可以告知希望的發送速度,控制數據流量。
TCP 實現了數據傳輸時各種控制功能,可以進行丟包時的重發控制,還可以對次序錯誤的分包進行順序控制。作為一種面向有連接的協議,只有在確定對端存在時,才會發送數據,從而可以控制通信流量的浪費。由于 UDP 沒有連接控制,即使對端不存在或中途退出網絡,數據包還是能夠發送出去。
1)連接
連接是指網絡中進行通信的兩個應用程序,為了相互傳遞消息而專有的、虛擬的通信線路,也叫做虛擬電路。
一旦建立了連接,進行通信的應用程序只使用這個虛擬線路發送和接收數據,就可以保障信息的傳輸。應用程序可以不用考慮 IP 網絡上可能發生的各種問題,依然可以轉發數據。TCP 則負責連接的建立、斷開、保持等管理工作。
連接
為了在不可靠的 IP 通信實現可靠性傳輸,需要考慮很多事情,數據的破壞、丟包、重復以及分片順序混亂等問題。TCP 通過校驗和、序列號、確認應答、重發控制、連接管理以及窗口控制等機制實現可靠性傳輸。
TCP知名端口號
>序列號和確認應答
在 TCP 中,當發送端的數據到達接收主機時,接收端主機會返回一個已收到的消息。這個消息叫做確認應答( ACK )。
正常數據傳輸
TCP 通過確認應答實現可靠的數據傳輸。當發送端將數據發出后,會等待對端的確認應答。如果有確認應答,說明數據已經成功到達對端。否則,數據可能已經丟失。
在一定時間內沒有等到確認應答,發送端會認為數據已經丟失,并進行重發。這樣,即使有丟包,仍能保證數據到達對端,實現可靠傳輸。
數據丟失
未收到確認應答,不一定是數據丟失。也可能對端已經收到數據,返回的確認應答在途中丟失,也會導致發送端重發。此外,也可能確認應答延遲到達,發送端重發數據后才收到。
確認應答丟失
每一次傳輸數據時,TCP 都會標明段的起始序列號,以便對方確認。在 TCP 中并不直接確認收到哪些段,而是通知發送方下一次應該發送哪一個段,表示前面的段已經收到。比如:收到的確認應答序列號是 N + 1 時,表示 N 以及 N 之前的數據都收到了。
序列號和確認應答
由于每一個段都有唯一的編號,這樣的話,當接收端收到重復的段時容易發現,數據段丟失后也容易定位,亂序后也可以重新排列。
>超時重發
超時重發是指在重發數據之前,等待確認應答到來的那個間隔時間。如果超過 RTT(往返時間),仍未收到確認應答,發送端將進行數據重發。
往返時間
數據被重發后,若還收不到確認應答,則再次發送。這時,等待確認應答的時間將會以 2 倍、4 倍的指數函數增長。數據也不會無限地重發,達到一定的重發次數后,還沒收到確認應答,就會認為網絡或對端主機發送異常,強制關閉連接,并通知應用通信異常強行終止。
RTT 時間是一個非常重要的參數。過大的 RTT 會導致 TCP 重傳非常慢,降低傳輸的速度;過小的 RTT 會導致 TCP 頻繁重傳,降低資源的使用效率。在實際情況下,通過實時跟蹤數據往返的時間間隔來動態調整 RTT 的數值。
>連接管理
TCP 提供面向有連接的通信傳輸,面向有連接是指在數據通信前做好通信兩端的準備工作。在數據通信前,發送一個 SYN 包作為建立連接的請求。如果對端發來確認應答,則認為可以開始數據通信。如果對端的確認應答未能到達,就不會進行數據通信。在通信結束時,會使用 FIN 包進行斷開連接的處理。
SYN 包和 FIN 包是通過 TCP 頭部的控制字段來管理 TCP 連接。一個連接的建立與斷開,正常過程至少需要來回發送 7 個包才能完成。建立一個 TCP 連接需要發送 3 個包,這個過程叫作三次握手。斷開一個 TCP 連接需要發送 4 個包,這個過程也稱作四次揮手。創建一個 TCP 連接,會產生一個 32 位隨機序列號,因為每一個新的連接使用一個新的隨機序列號。
連接管理
>三次握手
主機 A 想向主機 B 發送數據,TCP 模塊通過三次握手建立連接 TCP 會話。
三次握手,是指 TCP 會話建立過程中共交換了 3 個 TCP 控制段,它們分布是 SYN 段、SYN + ACK 段、ACK 段。
詳細過程如下:
發送端主機 A 向接收端主機 B 發出 SYN 段,表示發起建立連接請求,同時把自己的狀態告訴主機 B 。將段的序列號設為 a ,SYN 置位,表示 SYN 管理段。
主機 B 收到連接請求后,回應 SYN + ACK 段,將序列號設為 b ,確認號設為 a + 1 ,同時將 SYN 和 ACK 置位。
主機 A 收到主機 B 的連接確認后,發送 ACK 段再次進行確認,確認會話的建立,將 ACK 置位。主機 A 收到確認號是 a + 1 、序列號是 b 的段后,發送序列號為 a + 1 、確認號為 b + 1 的段進行確認。
主機 B 收到確認報文后,連接建立。雙方可以開始傳輸數據。
三次握手
經過 3 次握手后,A 和 B 之間其實是建立了兩個 TCP 會話,一個是從 A 指向 B 的 TCP 會話,另一個是從 B 指向 A 的 TCP 會話。A 發送的 SYN 段,表示 A 請求建立一個 從 A 指向 B 的 TCP 會話,目的是控制數據能夠正常、可靠的從 A 傳輸到 B 。B 在收到 SYN 段后,會發送一個 SYN + ACK 段作為回應。SYN + ACK 的含義是:B 一方面同意了 A 的請求,另一方面也請求建立一個從 B 指向 A 的 TCP 會話,這個會話目的是控制數據能夠正確、可靠的從 B 傳輸到 A 。A 收到 SYN + ACK 段后,回應一個 ACK ,表示同意 B 的請求。
>四次揮手
當 TCP 數據段的傳輸結束時,雙方都需要發送 FIN 段和 ACK 段來終止 TCP 會話。這個方式叫做四次揮手,詳細過程如下:
主機 A 想要終止連接,發送序列號為 p 的段,FIN 置位,表示 FIN 管理段。
主機 B 收到主機 A 發送的 FIN 段后,發送 ACK 段,確認號為 p + 1 ,同時關閉連接。
主機 B 發送序列號為 q的段,FIN 置位,通知連接關閉。
主機 A 收到主機 B 發送的 FIN 段后,發送 ACK 段,確認號為 q + 1 ,同時關閉連接。TCP 連接至此結束。
四次揮手
TCP 會話的終止分為兩個部分。首先 A 發送 FIN 控制段,請求終止從 A 到 B 的 TCP 會話。B 回應 ACK 段,表示同意 A 的終止會話請求。A 收到 B 的 ACK 段后,才開始終止這個會話。同理,B 也會向 A 發起請求,終止從 B 到 A 的 TCP 會話。
>單位段
經過傳輸層協議封裝后的數據稱為段。在建立 TCP 連接時,可以確定數據段的大小,也就是最大消息長度( MSS )。TCP 在傳輸大量數據時,是以 MSS 的大小將數據進行分割發送,重發也是以 MSS 為單位。
MSS分片
MSS 是在三次握手時,由兩端主機計算出來的。兩端主機在發出建立連接的請求時,會在 TCP 頭部寫入 MSS 值。然后在兩者間選擇較小的值使用。MSS 默認值為 536 字節,理想值是 1460 字節,加上 IP 頭部 20 字節和 TCP 頭部 20字節,剛好在 IP 層不會被分片。
MSS協商
>窗口控制
TCP 是以 1 個段為單位,每發一個段進行一次確認應答。如果包的往返時間越長,通信性能就越低。
按數據包確認應答
為解決這個問題,TCP 引入了窗口的概念。確認應答不再是每個分段,而是以窗口的大小進行確認,轉發時間被大幅度的縮短。窗口大小就是指無需等待確認應答,而可以繼續發送數據的最大值。窗口大小是一個 16 位字段,因此窗口最大是 65535 字節。在 TCP 傳輸過程中,雙方通過交換窗口的大小來表示自己剩余的緩沖區( Buffer )空間,以及下一次能夠接受的最大數據量,避免緩沖區的溢出。
滑動窗口
發送數據中,窗口內的數據即使沒有收到確認應答也可以發送出去。如果窗口中的數據在傳輸中丟失,也需要進行重發。因此,發送端主機在收到確認應答前,必須在緩沖區保留這部分數據。
收到確認應答后,將窗口滑動到確認應答中的序列號位置。這樣可以按順序將多個段同時發送,這種機制也被稱為滑動窗口控制。
滑動窗口控制
>窗口控制和重發控制
在使用窗口控制時,如果出現確認應答未能返回的情況,數據已經到達對端,是不需要再進行重發的。然而,在沒有使用窗口控制時,沒收到確認應答的數據是會重發的。而使用了窗口控制,某些確認應答即使丟失也無需重發。
窗口控制重發
如果某個報文段丟失,接收主機收到序號不連續的數據時,會為已經收到的數據返回確認應答。即使接收端收到的包序號不是連續的,也不會將數據丟棄,而是暫時保存至緩沖區。出現報文丟失時,同一個序號的確認應答將會被重復發送。如果發送端收到連續 3 次同一個確認應答,就會將對應的數據進行重發。這種機制比超時管理更高效,也被稱為高速重發機制。
高速重發控制
>流控制
接收端處于高負荷狀態時,可能無法處理接收的數據,并丟棄數據,就會觸發重發機制,導致網絡流量無端浪費。
為了防止這種情況,TCP 提供一種機制可以讓發送端根據接收端的實際接收能力控制發送的數據量,這就是流控制。它的具體操作是,接收端主機通知發送端主機自己可以接收數據的大小,于是發送端會發送不超過這個限度的數據。這個限度的大小就是窗口大小。
TCP 頭部中有一個字段用來通知窗口大小。接收主機將緩沖區大小放入這個字段發送給接收端。當接收端的緩存不足或處理能力有限時,窗口大小的值會降低一半,從而控制數據發送量。也就是說,發送端主機會根據接收端主機的指示,對發送數據的量進行控制,也就形成了一個完整的 TCP 流控制。
若接收端要求窗口大小為 0 ,表示接收端已經接收全部數據,或者接收端應用程序沒有時間讀取數據,要求暫停發送。
流控制
如果窗口更新的報文丟失,可能會導致無法繼續通信。為避免這個問題,發送端主機會時不時的發送一個叫窗口探測的數據段,此數據段僅含一個字節以獲取最新的窗口大小信息。
>擁塞控制
有了 TCP 的窗口控制,收發主機之間不再以一個數據段為單位發送確認應答,也能夠連續發送大量數據包。在網絡出現擁堵時,如果突然發送一個較大量的數據,有可能會導致整個網絡癱瘓。
為了防止這個問題出現,在通信開始時,就會通過一個叫慢啟動的算法得出的數值,對發送數據量進行控制。
慢啟動
為了在發送端調節發送數據的量,需要使用擁塞窗口。在慢啟動時,將擁塞窗口的大小設置為 1 MSS 發送數據,之后每收到一次確認應答( ACK ),擁塞窗口的值就加 1 。在發送數據包時,將擁塞窗口的大小與接收端主機通知的窗口大小做比較,選擇它們當中較小的值發送數據。這樣可以有效減少通信開始時連續發包導致網絡擁堵,還可以避免網絡擁塞的發生。
TCP 和 UDP 的對比
TCP和UDP對比
UDP 格式
UDP 段由 UDP 頭部和 UDP 數據組成。UDP 頭部有源端口號、目的端口號、長度、校驗和組成,UDP 頭部長度為固定的 8 字節。
UDP報文格式
源端口號:字段長 16 位,表示發送端 UDP 端口號。
目的端口號:字段長 16 位,表示接收端 UDP 端口號
長度:字段長 16 位,表示 UDP 頭部和 UDP 數據的總長度。
校驗和:字段長 16 位,是錯誤檢查的字段,包括 UDP 頭和 UDP 數據的內容計算得出,用于檢查傳輸過程中出現的錯誤。
TCP 格式
TCP 頭部比 UDP 頭部復雜得多,由一個 20 字節的固定長度加上可變長的選項字段組成。
TCP報文格式
源端口號:字段長 16 位,表示發送端 TCP 端口號。
目的端口號:字段長 16 位,表示接收端 TCP 端口號。
序列號:字段長 32 位,是指 TCP 段數據的位置序號。根據序列號來判斷是否存在重收、漏收、亂序等情況。
確認號:字段長 32 位,是指下一次應該收到的數據的序列號。收到這個確認號,表示這個確認號之前的數據都已經正常收到。
數據偏移:字段長 4 位,表示 TCP 數據從哪一位開始計算,也可以看作 TCP 頭部的長度。
保留:字段長 6 位,保留給以后擴展使用。
控制位:字段長 6 位,每 1 位標志位可以打開一個控制功能,也叫做控制位。從左到右分別是 URG 、ACK 、PSH 、RST 、SYN 、FIN 。
控制位
URG:標志位為 1 時,表示有需要緊急處理的數據。
ACK:標志位為 1 時,表示確認應答有效。
PSH:標志位為 1 時,表示將數據立即上傳給應用程序,而不是在緩沖區排隊。
RST:標志位為 1 時,表示 TCP 連接出現異常,必須強制斷開連接。
SYN:標志位為 1 時,表示請求建立連接,并設置序列號的初始值。
FIN:標志位為 1 時,表示數據發送結束,請求斷開 TCP 連接。
窗口:字段長 16 位,標明滑動窗口的大小,表示自己還能接收多少字節的數據。
校驗和:字段長 16 位,是錯誤檢查的字段,包括 TCP 頭和 TCP 數據的內容計算得出,用于檢查傳輸過程中出現的錯誤。
緊急指針:字段長 16 位,表示緊急數據的長度。當 URG 位為 1 時,這個字段才有效。
選項:字段的長度是可變的。通過添加不同的選項,實現 TCP 的一些擴展功能。
填充:如果 TCP 段的頭部不是 4 字節的整數倍,就填充一些 0 ,來保證頭部長度是 4 字節的整數倍。
數據:TCP 段的數據部分,不是 TCP 頭部內容,字段最大是 MSS 。
審核編輯:湯梓紅
-
網絡
+關注
關注
14文章
7599瀏覽量
89251 -
TCP
+關注
關注
8文章
1378瀏覽量
79302 -
UDP
+關注
關注
0文章
327瀏覽量
34043 -
傳輸層
+關注
關注
0文章
30瀏覽量
10934 -
Client
+關注
關注
0文章
10瀏覽量
8828
原文標題:33 張圖詳解 TCP 和 UDP :打通網絡和應用的中間人
文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論