MTU MSS PDU SDU

昀溪發表於2018-09-02

首先要說兩個概念:

PDU:協議資料單元,計算機網路各層對等實體間交換的單位叫做PDU,不同層的PDU名稱不同

名稱
應用層 資料
傳輸層 段 segment
網路層 資料包 package
鏈路層 幀 frame
物理層 位元 bit

 

 

 

 

 

 

SDU:服務資料單元,它是指PDU的實際載荷(payload)

PDU和SDU有什麼關係呢?

在每一層都有PDU和SDU,在本層中SDU加上額外協議資訊構成本層的PDU,行話是同一層內的SDU是本層PDU的靜荷載(payload),不同層之間,上層的PDU是下層的SDU。在上次向下層傳輸資料的時候,上層使用下層提供的資料介面給下層傳遞資料,而不同層之間的PDU轉換是由下層完成的(這個轉換是說對上一層傳遞過來的PDU進行包裝變成本層的PDU也就是變成符合本層協議對資料的格式要求)。如果上層PDU超過下層SDU,那麼本層就要把資料 切割成若干適合的片段再給下層(對本層的SDU切割,然後每個切割後的SDU加上本層的協議資訊構成一個本層的PDU傳遞給下層,本層的PDU大小必須不能大於下一層的SDU)。

 

本層的PDU是由下層的SDU大小決定的,所以一直往下走就到了資料鏈路層,那麼上次傳遞過來的單個PDU不能超過鏈路層的SDU,而鏈路層的PDU叫做幀,在乙太網中它的MTU是1500,所以上層傳遞過來的單個PDU不能超過1500位元組,IP首部站20個位元組,TCP首部佔20個位元組,那由此得出TCP層的SDU為1460位元組(也叫做MSS,最大訊息長度),PDU為1480位元組;IP層SDU為1480而PDU為1500.

TCP的MSS不是固定的它受對端影響,在TCP傳輸中MSS是通訊雙方協商而來的。下面看一下不同鏈路的MTU大小

資料鏈路 MTU bytes 總長度 bytes
IPv4 65535  
IPv6 65575  
乙太網 1500 1518
FDDI 4352 4500
IEEE 802.3 1492 1581
PPPoE 1492  

 

 

 

 

 

 

 

傳輸層本身是沒有長度限制的,但是在TCP首部的MSS選項中是一個16位欄位最大值為65535位元組,IP層也是是65535位元組,所以它倆很合適,只是受到鏈路層影響才會導致傳輸層訊息要分段以及IP報文要分片。因為乙太網預設MTU1500,如果真有一個65535的IP報文的話那麼它顯然無法封裝到單個幀裡,所以就需要進行切割。這種切割可以在傳送端完成也可以在傳送過程中完成(路由器),但是重組肯定是在接收端。所以TCP/IP為了提高效率儘量避免IP分片和重組,所以TCP就根據MSS和MTU限定每個傳輸層的PDU大小,這樣每一個PDU就是一個完整的PDU在傳送過程中不會再被切割,接收端的傳輸層收到這些段之後進行資料重組,實際上MSS的目的也就是為了告訴對端我的重組緩衝區大小是多少。所以這也就是為什麼在傳輸層有一個MSS的東西存在了,一句話就是向對端TCP告知對端在每個分段中能傳送的最大TCP資料量,這個MSS是在雙方建立TCP連線時協商出來的。MSS經常設定成MTU減去IP和TCP首部的固定長度,在乙太網中是1460位元組。

總結來看,MTU是死的由具體鏈路決定,而MSS是不固定的透過協商而來。但兩個通訊雙方協商出來的MSS不會大於路徑MTU(通訊雙發路徑中最小的MTU,因為通訊雙方走的路可能不同,也就是A到B的路徑與B到A的路徑不一定相同)。