Internet傳輸層

夏筱發表於2020-10-20

  Internet的傳輸層有兩個主要的協議,無連線的和麵向連線的各一個,兩個協議互為補充。無連線的協議是UDP,它除了給應用程式提供傳送資料包功能並允許他們在所需的層次之上架構自己的協議外,幾乎沒有做什麼特別的事情。面向連線的協議是TCP,該協議幾乎做了所有的事情。它建立連線,並通過重傳機制增加了可靠性,同時還進行流量控制和擁塞控制。

UDP

  User Datagram Protocol,為應用程式提供了一種無需建立連結就可以傳送資料包的方法。UDP傳輸的段(segment)由8bytes的頭和有效載荷構成。
在這裡插入圖片描述  當一個UDP資料包到來時,它的有效載荷被遞交給與目標埠相關聯的那個程式。可以把埠看作應用程式租來接收資料包的郵箱。當接收端必須將一個應答返回給源端時,源埠欄位是必須的。UDP長度欄位包含8bytes的頭和資料兩部分的總長度。

  UDP協議特別有用的一個領域是client-server應用開發。以這種方式使用UDP的一個應用是域名系統(DNS,Domain Name System)。

  UDP是一個實現RPC的良好基礎。

  UDP被廣泛應用於實時多媒體應用。RTP(Real-time Transport Protocol)就是一個在應用層實現的傳輸協議。

TCP

  Transmission Control Protocol 是為了在不可靠的網際網路絡上提供可靠的端到端的位元組流而專門設計的一個傳輸協議。網際網路絡與單個網路有很大的不同,因為互連網路的不同部分可能有截然不同的拓撲結構、頻寬、延遲、資料包大小和其他引數。TCP的設計目標是能夠動態地適應互連網路的這些特性,而且具備面對各種故障時的健壯性。

  每臺支援TCP的機器都有一個TCP傳輸實體,傳輸實體接收本地程式的使用者資料流,將他們分割成不超過64KB的分段(通常不超過1460bytes)。每個分段以IP資料包形式傳送。

  IP層並不保證資料包一定被正確遞交到地方,也不指示資料包的傳送速度有多快。正是TCP負責既要足夠快地傳送資料包,以便使用網路容量,但又不可以引起網路擁塞;而且TCP超時後,要重傳沒有遞交的資料包。即使被遞交的資料包,也可能存在錯序的問題,這也是TCP的責任,它必須把接收到的資料包重新裝配成正確的順序。

TCP服務模型

  TCP服務由傳送端和接收端建立一種稱為套接字(socket)的端點來獲得。為了獲得TCP服務,必須顯式地在一臺機器的套接字和另一臺機器的套接字之間建立一個連線,每個連線可以用(socket1,socket2)來表示。

  1024以下的埠號被保留,只能用作特權使用者啟動的標準服務,這些埠稱為知名埠。例如:FTP(20,21)、SSH(22)、SMTP(25)、HTTP(80)、HTTPS(443)等等。

  所有的TCP連線都是全雙工,點到點的。

  一個TCP連線就是一個位元組流,而不是訊息流。端到端之間不保留訊息的邊界。

  當一個應用將資料傳遞給TCP時,TCP可能立即將資料傳送出去,也可能將它緩衝起來,這完全由TCP軟體自己來決定。然而,有時候應用程式確實希望資料立即被髮送出去。為了強制將資料傳送出去,TCP有個PUSH標誌位,用於告訴TCP不要延遲傳輸。

TCP協議

  TCP實體使用的基本協議是具有動態視窗大小的滑動視窗協議。當傳送端傳送一段時,它啟動一個計時器。當該段到達接收方時,接收端的TCP實體返回一個攜帶了確認號和剩餘視窗大小的段,並且確認號的值等於接收端期望接收的下一個序號。如果傳送端的計時器在確認段到達之前超時,則傳送端再次傳送原來的段。

在這裡插入圖片描述
  每個段的起始位置都是一個20bytes的固定頭。其後跟著可選頭和使用者資料。

  上圖中的保留位(未使用)現在只剩4bits,有2bits也用作了flag位,也就是有8個flag位。

  • 源埠/目標埠:2bytes * 2
  • 序號(sequence number)和確認號(Acknowledgement number):4bytes * 2。序號為為當前端成功傳送的資料位數。確認號為當前端成功接收的資料位數+1。
  • TCP頭長度欄位指明瞭TCP頭包含了多少個32bits的字。
  • 8個flags位
    • CWR和ECE用作擁塞控制訊號。當TCP接收端收到了來自網路的擁塞指示後,就設定ECE以便給TCP傳送端傳送ECN-Echo訊號,告訴傳送端放慢傳送頻率。TCP傳送端設定CWR,給TCP接收端傳送CWR訊號,這樣接收端就知道傳送端已經放慢速率,不必再給傳送端傳送ECN-Echo訊號。
    • URG,如果使用了緊急指標就設定這個flag。
    • ACK被設定,表示確認號欄位是有效的。
    • PSH被設定,表示這是被PUSH的資料。特此請求接收端一旦收到資料後立即將資料遞交給應用程式,而不是緩衝起來。
    • RST用於重置一個已經變得很混亂的連線。
    • SYN被用於建立連線過程。在連線請求中,SYN=1和ACK=0;在連線應答中,SYN=1和ACK=1。表示CONNECTION REQUEST和CONNECTION ACCEPTED。
    • FIN被設定,表示傳送端已經沒有資料需要傳輸了。用來釋放一個連線。
  • 視窗大小欄位指定了從被確認的位元組算起可以傳送多少個位元組。0表示接收端沒有空間存放資料了,希望傳送端停止傳送資料。接收端可以通過傳送一個具有同樣確認號但是非0視窗大小欄位的段來通知傳送端繼續傳送段。
  • 校驗和。它校驗的範圍包括頭、資料、以及概念性偽頭,偽頭協議號為TCP(6),校驗和必須強制執行。
  • 選項欄位必須32bits的倍數。
    • MSS:允許每臺主機指定它願意接受的最大段長
    • Window scale:允許傳送端和接收端在連線建立階段協商視窗尺度因子。雙方使用尺度因子將視窗大小欄位向左移位最多14bit。因此允許視窗最大可達2**30個位元組。
    • Timestamp:攜帶傳送端發出的時間戳,並被接收端回應。一旦在連線建立階段啟用了它,那麼每個資料包都要包含這個選項。可以用來估計多久之後資料包可以被認為丟失。還可以被用作32位序列號的邏輯擴充套件,根據時間戳丟棄入境段,從而解決序號迴繞的問題。
    • SACK(Selective ACK):使得接收端可以告訴傳送端已經接收段的序號範圍,這是對確認號的補充。

TCP連線建立

  TCP使用三次握手來建立連線。
  為了建立一個連線,某一段(比如伺服器)必須依次執行LISTEN和ACCEPT原語,然後被動地等待入境連線請求。
   傳送端(比如客戶端)執行CONNECT原語,同時說明它希望連線的IP地址和埠號、他願意接受的最大TCP段長,以及一些可選的使用者資料(比如口令)等引數。CONNECT原語傳送一個SYN=1,ACK=0的TCP段,然後等待接收端(比如伺服器)的響應。
  當這個段到大接收端,那裡的TCP實體檢查是否有一個程式已經等待目標埠欄位指定的埠上執行了LISTEN。如果沒有,則它傳送一個RST=1的應答報文,拒絕客戶的連線請求。如果某個程式在該埠監聽,如果它接收則傳送回一個確認段。

在這裡插入圖片描述

TCP連線釋放

  為了釋放一個連線,任何一方都可以傳送一個設定了FIN標誌位的TCP段,這表示它已經沒有資料要傳送了。當FIN段被確認後,這個方向上的連線就被關閉,不再傳送任何資料。然而,另一個方向上或許還在繼續傳送資料。當兩個方向都關閉了之後,連線才算徹底釋放。所以,通常需要2個FIN段和2個ACK段(但第一個ACK可以和第二個FIN在一個段裡)。

  雖然TCP通常採用對稱釋放方式來斷開連線,許多Web伺服器給客戶端傳送一個RST段,導致突然關閉連線,這種方式更像非對稱釋放。Web伺服器之所以這麼做,是因為它知道資料交換已經結束,所以它可以給客戶端傳送一個警告,然後驟然關閉連線。如果客戶端收到這樣的警告,它會釋放它的連線狀態;如果沒收到,最終它也會意識到伺服器不再與自己交談,並釋放連線。

參考

UDP協議的詳細解析
TCP 詳解

相關文章