TCP的MSS 最大分段 以及MTU

2021-05-24 07:06:01 字數 2233 閱讀 8926

mtu : maxitum transmission unit 最大傳輸單元

mss : maxitum segment size 最大分段大小

pppoe : ppp over ethernet(在乙太網上承載ppp協議)

[分析過程]

先說說這mtu最大傳輸單元,這個最大傳輸單元實際上和鏈路層協議有著密切的關係,讓我們先仔細回憶一下ethernetii幀的結構 dmac(目的mac)+smac(源mac)+type(type域)+data+crc

由於乙太網傳輸電氣方面的限制,每個乙太網幀都有最小的大小 64bytes最大不能超過1518bytes ,對於小於或者大於這個限制的乙太網幀我們都可以視之為錯誤的資料幀,一般的乙太網**裝置 會丟棄這些資料幀。

(注:小於64bytes的資料幀一般是由於乙太網衝突產生的「碎片」或者線路干擾或者壞的乙太網介面產生的,對於大於1518bytes的數 據幀我們一般把它叫做giant幀,這種一般是由於線路干擾或者壞的乙太網口產生)

由於乙太網ethernetii最大的資料幀是1518bytes這樣,刨去乙太網幀的幀頭(dmac目的mac位址 48bit=6bytes+smac源mac位址48bit=6bytes+type域2bytes) 14bytes和幀尾crc校驗部分 4bytes(這個部門有時候大家也把它叫做fcs),那麼剩下承載上層協 議的地方也就是data域最大就只能有1500bytes這個值我們就把它稱之為mtu 。這個就是網路層協議非常關心的地方,因為網路層協 議比如ip協議會根據這個值來決定是否把上層傳下來的資料進行分片。就好比乙個盒子沒法裝下一大塊麵包,我們需要把麵包切成片,裝在多個盒子裡面一樣的道 理。

當兩台遠端pc互聯的時候,它們的資料需要穿過很多的路由器和各種各樣的網路媒介才能到達對端,網路中不同媒介的mtu各不相同,就好比一長段的水管,由不同粗細的水管組成(mtu不同)通過這段水管最大水量就要由中 間最細的水管決定。

對於網路層的上層協議而言(我們以tcp/ip協議族為例)它們對水管粗細不在意它們認為這個是網路層的事情。網路層ip協議會檢查每個從上層 協議下來的資料報的大小,並根據本機mtu的大小決定是否作「分片」處理。分片最大的壞處就是:

對於udp協議而言,這個協議本身是無連線的協議,對資料報的到達順序以及是否正確到達不甚關心,所以一般udp應用對分片沒有特殊要求。

對於tcp協議而言就不一樣了,這個協議是面向連線的協議,對於tcp協議而言它非常在意資料報的到達順序以及是否傳輸中有錯誤發生。所以有些 tcp應用對分片有要求---不能分片(df)。

pppoe

所謂pppoe 就是在乙太網上面跑ppp協議,有人奇怪了,ppp協議和ethernet不都是鏈路層協議嗎?怎麼乙個鏈路層跑到另外乙個鏈路層上面去了,難道公升級成網 絡層協議了不成。其實這是個誤區:就是某層協議只能承載更上一層協議。

為什麼會產生這種奇怪的需求呢?這是因為隨著寬頻接入(這種寬頻接入一般為cable modem或者xdsl或者乙太網的接入)由於乙太網缺乏認證計費機制而傳統運營商是通過ppp協議來對撥號等接入服務進行認證計費的,所以就出了這麼一 個怪胎:pppoe。

pppoe帶來了好處,也帶來了一些壞處,比如:二次封裝耗費資源,降低了傳輸效能等等,最大的壞處就是pppoe導致mtu變小了乙太網的 mtu是1500,再減去ppp的包頭包尾的開銷(8bytes),就變成1492。

這個時候就需要我們調整一下主機的mtu,通過降低主機的mtu,這樣我們就能夠順利地進行通訊了。

當然對於tcp應用而言還有另外的解決方案。

mssmss最大傳輸大小的縮寫,是tcp協議裡面的乙個概念。

mss就是tcp資料報每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能tcp協議在建立連線的時候通常要協商雙方的mss值,這個值 tcp協議在實現的時候往往用mtu值代替(需要減去ip資料報包頭的大小20bytes和tcp資料段的包頭20bytes)所以往往mss為1460 。通訊雙方會根據雙方提供的mss值得最小值確 定為這次連線的最大mss值。

我們回過頭來看前言裡面的那個問題,我們試想一下,如果我們在中間路由器上把每次tcp連線的最大mss進行調整這樣使得通過pppoe鏈路的 最大mss值加上資料報頭包尾不會超過pppoe的mtu大小1492這樣就不會造成無法通訊的問題.所以上面的問題可以通過ip tcp adjust-mss 1452來解決。

當然問題也可以通過修改pc機的mtu來解決。

TCP中的MSS解讀

mss 是tcp選項中最經常出現,也是最早出現的選項。mss選項佔4byte。mss是每乙個tcp報文段中資料字段的最大長度,注意 只是資料部分的字段,不包括tcp的頭部。tcp在三次握手中,每一方都會通告其期望收到的mss mss只出現在syn資料報中 如果一方不接受另一方的mss值則定位預設值5...

TCP傳輸的單個報文最大位元組(MSS和MTU)

1448位元組是實際場景下,單個tcp包的實際運載能力。也就是說,實際場景下,上層呼叫send 1000kb 下層會把這1000kb封裝成多個tcp包進行傳送。單個tcp包每次打包1448位元組的資料進行傳送。詳細的tcp在傳輸情景wireshark截圖如圖1 圖1每個tcp包在理論上應該能打包更多...

程序的四大分段

在乙個終端 ubuntu 上,在執行乙個程序時 如.a.out 此時他會開闢乙個空間。此空間被粗略的分為四個段。如下圖所示 注意 常量屬於 段 將 編譯成二進位製流檔案,存放在 段。在乙個程序中,他的全域性變數,靜態變數以及常量全部存放在資料段。當乙個函式執行時,在棧段會為它分配乙個空間。main是...