首先要說兩個概念:
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的路徑不一定相同)。