TCP之1460MSS和1448負載

2022-01-20 09:48:13 字數 1579 閱讀 3990

1448位元組是實際場景下,單個tcp包的實際運載能力。也就是說,實際場景下,上層呼叫send(1000kb),下層會把這1000kb封裝成多個tcp包進行傳送。單個tcp包每次打包1448位元組的資料進行傳送。

詳細的tcp在傳輸情景wireshark截圖如圖1

圖1每個tcp包在理論上應該能打包更多資料才對,但是實際場景下tcp傳輸為什麼會以這個1448作為打包單位呢?

這個實際tcp單包傳輸1448位元組資料的根源在於「乙太網ethernet最大的資料幀是1518位元組」。

乙太網ethernet最大的資料幀是1518位元組。乙太網幀的幀頭14位元組和幀尾crc校驗4位元組(共佔18位元組),剩下承載上層協議的地方也就是data域最大就只剩1500位元組. 這個值我們就把它稱之為mtu。

我們來看看linux上mtu預設值,查證一下,如圖2

圖2這個mtu值可以修改,但是現在大部分計算機網路都被乙太網承載,所以修改這個值沒有什麼實際意義。

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

mss為1460是由1500-20(ip頭)-20(tcp頭)計算出的。

實際場景下,tcp包頭中會帶有12位元組的選項—-時間戳。

這樣,單個tcp包實際傳輸的最大量就縮減為1448位元組。1448=1500-20(ip頭)-32(20位元組tcp頭和12位元組tcp選項時間戳)

「每個tcp包在理論上應該能打包更多資料才對,但是實際場景下tcp傳輸為什麼會以這個1448作為打包單位呢?」

理論上,單個tcp包能打包的資料量遠遠多於1448位元組,現在為了適應mtu,只要在乙太網上跑tcp,系統就預設最大以1448位元組打包tcp。

假如我們用更大的資料量來打包會有什麼結果呢?

答案是降低了傳輸效率。

超過mtu的大包反而降低效率的原因如下:

ip層非常關心mtu,因為ip層會根據mtu來決定是否把上層傳下來的資料進行分片。就像一條運輸線路的承載能力是有限的,碰到大東西要運輸,只能把大東西拆開成為散件,分開運輸,到達目的地之後還必須能再次組裝起來。 當兩台遠端pc互聯的時候,它們的資料需要穿過很多的路由器和各種各樣的網路媒介才能到達對端,網路中不同媒介的mtu各不相同,就好比一長段的水管,由不同粗細的水管組成(mtu不同 :))通過這段水管最大水量就要由中間最細的水管決定。 對於網路層的上層協議而言(我們以tcp/ip協議族為例)它們對水管粗細不在意它們認為這個是網路層的事情。網路層ip協議會檢查每個從上層協議下來的資料報的大小,並根據本機mtu的大小決定是否作「分片」處理。分片最大的壞處就是降低了傳輸效能,本來一次可以搞定的事情,分成多次搞定,所以在網路層更高一層(就是傳輸層)的實現中往往會對此加以注意!

這個就是在乙太網上,tcp不發大包,反而傳送1448小包的原因。只要這個值tcp才能對鏈路進行效能最高的利用。

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

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

雜談網路協議之TCP和HTTPS

先來說說協議可靠性,比如兩人接通 後先要寒暄幾句,一方面出於尊重,更主要目的是確認身份嘛,防止聊了半天,發現聊錯物件了哈。一樣的道理,兩台機器想要通訊互傳資料之前,先要建立連線,連線過程大致描述為 a傳送seq a給b,b傳送ack a 1,seq b給a,a傳送ack b 1給b,連線建立完成。連...

TCP 控制欄位之 URG 和 PSH

urg urgent 緊急位 用來指示緊急指標有效。緊急指標是乙個正的偏移量,從第乙個位元組到指標的位置為 緊急資料,這些資料不進入緩衝區,直接交付給上層程序。urg標誌位為1時為有效,例如乙個正在執行的程式卻出現問題,使用鍵盤的中斷訊號,這就屬於緊急資料。當接收方發現緊急資料時,其的tcp就通知與...