哈嘍大家好,我是咸魚
今天我們來聊聊計算機網(wǎng)絡中的 MTU (Maximum Transmission Unit)
(資料圖片)
MTU(Maximum Transmission Unit)是指數(shù)據(jù)鏈路層中的最大傳輸單元
通俗點來講,MTU 是指數(shù)據(jù)鏈路層能夠傳輸?shù)淖畲髷?shù)據(jù)幀的大?。ㄒ宰止?jié)為單位)
以 CentOS 7 為例,可以通過 ifconfig
命令來查看 MTU 值
我們知道,數(shù)據(jù)在數(shù)據(jù)鏈路層中通常是以數(shù)據(jù)幀(Frame)的形式來傳輸
因為傳輸?shù)?Frame 不可能無限大(傳小的可以),那么一次傳多大的 Frame 最合適、最高效就成了一個需要考慮的問題
所以說我們要設定一個值(也就是 MTU),這個值用來限制 Frame 的大小
維基百科有這么一段話
Larger MTU is associated with reduced overhead. Smaller MTU values can reduce network delay.
由上面的話可以得出:
MTU越大,開銷越小
這句話是很容易理解的,更大的 Frame 意味著包含的有效數(shù)據(jù)也就更多
我一次能傳更多的數(shù)據(jù)了,那么傳輸次數(shù)就少了,在網(wǎng)絡上的開銷就變小了
較小的MTU值可以減少網(wǎng)絡延遲
這句話容易讓人引起困惑,為什么 MTU 值小能夠減少網(wǎng)絡延遲呢?
如果 MTU 設置的很大,意味著一次能傳更大的數(shù)據(jù)了,那占據(jù)鏈路的時間就會更長,所以總體上網(wǎng)絡延遲就會變大
而且如果一大段數(shù)據(jù)里面有一個 bit 出錯了,這一大段就會整個重傳,重傳的代價是很大的
那么 MTU 設置成多少合適呢?
為什么 MTU 的值是 1500?RFC 標準定義以太網(wǎng)的默認 MTU 值為 1500,為什么是 1500 ?
這是一個歷史遺留問題
早期的以太網(wǎng)使用共享鏈路的工作方式,為了保證 CSMA/CD(載波多路復用/沖突檢測)機制,規(guī)定了以太幀長度最小為 64 字節(jié),最大為 1518 字節(jié)
最小 64 字節(jié)是為了保證最極端的沖突能被檢測到,64 字節(jié)是能被檢測到的最小值
最大不超過 1518 字節(jié)是為了防止過長的幀傳輸時間過長而占用共享鏈路太長時間導致其他業(yè)務阻塞
所以說數(shù)據(jù)幀的最大長度被限制為 1518 字節(jié)(包括幀頭、幀尾和CRC校驗)
18 字節(jié)用于幀頭和幀尾,其中 CRC 校驗占據(jù) 4 字節(jié),剩下的 1500 字節(jié)就是最大數(shù)據(jù)載荷(Payload)
因此,1500 字節(jié)被定義為以太網(wǎng)數(shù)據(jù)幀中數(shù)據(jù)部分的最大長度(MTU)
雖然技術不斷發(fā)展,但這個規(guī)定一直沒有更改
發(fā)送數(shù)據(jù)大小超過 MTU 怎么辦?以太網(wǎng)經(jīng)過幾十年的發(fā)展,速度已經(jīng)從最初的10M被提升到了上百G,速度提高了上萬倍
在這樣高速度的傳輸數(shù)據(jù)中,如果還是延續(xù)經(jīng)典以太網(wǎng)的最大幀長不超過1518 字節(jié)的限制,那么在每秒中傳輸?shù)臄?shù)據(jù)包的個數(shù)將很大
于是一些廠商提出了巨型幀(Jumbo Frame)的概念,把以太網(wǎng)的最大幀長擴展到了9K
目前還沒有獲得 IEEE 標準委員會的認可,但是大多數(shù)的設備廠商都已經(jīng)開始支持
以太網(wǎng)的 MTU 默認值是 1500,如果發(fā)送 Frame 小于 MTU(例如 1000 字節(jié)),直接傳輸就行
如果大于 MTU(4000 字節(jié)),那就需要進行分片(Fragment)
即第一次發(fā)送 1500 字節(jié)(IP header 20 字節(jié) + Payload 1480 字節(jié))
第二次發(fā)送 1500 字節(jié)(IP header 20 字節(jié) + Payload 1480 字節(jié))
第三次 1000 字節(jié)(IP header 20 字節(jié) + Payload 980 字節(jié))
可能有小伙伴問,那我傳的數(shù)據(jù)大小不夠數(shù)據(jù)幀規(guī)定的最小 64 字節(jié)怎么辦?
答案是:在實際數(shù)據(jù)內(nèi)容后面添加填充數(shù)據(jù),使得數(shù)據(jù)包總長度達到最小長度要求。填充數(shù)據(jù)可以是任意無意義的字節(jié),例如全 0 或全 1 的數(shù)據(jù)
如何保證發(fā)送的數(shù)據(jù)不超過 MTU ?前面我們知道,如果發(fā)送的數(shù)據(jù)大于 MTU,則就會進行分片操作
要讓最終傳給數(shù)據(jù)鏈路層的 Frame 數(shù)據(jù)大小不超過 1500 bytes,就要保證上層中的每一層的數(shù)據(jù)都沒有超過這個大小
如果 MTU 是 1500,那么 IP 層就要保證 IP 層的 Packet 數(shù)據(jù)不超過 1480 bytes (1500 bytes – 20 bytes IP header),
對于 TCP 來說,它要保證每一個 Segment 數(shù)據(jù)大小不超過 1460 bytes (1460 bytes – 20 TCP header)
以 TCP 層(傳輸層)為例子, TCP 層是怎么知道發(fā)送的數(shù)據(jù)不會超過 MTU 呢?
IP 層(網(wǎng)絡層)問數(shù)據(jù)鏈路層數(shù)據(jù)最大傳輸單元( MTU )是多少
TCP 層會問 IP 層數(shù)據(jù)最大傳輸大?。∕aximum packet size)是多少
這樣 TCP 層就會知道自己的最大傳輸數(shù)據(jù)大小,叫做 MSS(Maximum segment size)
在 TCP 的握手階段,MSS(Maximum Segment Size)是用于指定TCP報文段中數(shù)據(jù)部分的最大長度
對于 TCP 來說,知道自己的 MSS 沒有什么用
例如作為接收端來說,收到的包大小取決于發(fā)送端,得讓發(fā)送端知道自己的 MSS 才行
所以在建立 TCP 連接時,雙方需要協(xié)商一個合適的 MSS 值,以便在數(shù)據(jù)傳輸過程中進行分片和重組
什么是 TSO前面我們介紹了什么是 MTU、MSS
如果你去抓一下包看看,你可能會遇到下面這種情況
明明協(xié)商了 MSS 為 1460 字節(jié),為什么數(shù)據(jù)居然有一萬多字節(jié)?
在建立 TCP 連接時,雙方需要協(xié)商一個合適的 MSS 值,以便在數(shù)據(jù)傳輸過程中進行分片
但是這個分片過程往往是簡單重復而且計算量比較大的,需要占用較多的 CPU 資源
所以網(wǎng)卡就會對內(nèi)核說:哥這種小事我來干就好了,不需要麻煩您
然后內(nèi)核就會把大包發(fā)給網(wǎng)卡,網(wǎng)卡來負責分片
這個叫做 TSO(TCP Segment Offload)
TSO(TCP Segmentation Offload)是一種網(wǎng)絡傳輸卸載技術,用于減輕主機的網(wǎng)絡數(shù)據(jù)包分段負擔,提高網(wǎng)絡傳輸性能
我們在抓包的時候看到是還在內(nèi)核里的包,后面網(wǎng)卡拆包的過程是看不到的
網(wǎng)卡不但能對發(fā)送的包進行 offload,也可以對接收的包進行 onload,簡單來說就是網(wǎng)卡會先把一些小的包積攢下來,然后合起來發(fā)送給內(nèi)核
# 查看網(wǎng)卡上面是否開啟 TSO 功能# on 表示開啟[root@root~]# ethtool -k <網(wǎng)卡名稱>tcp-segmentation-offload: on tx-tcp-segmentation: on tx-tcp-ecn-segmentation: on tx-tcp6-segmentation: on tx-tcp-mangleid-segmentation: off
最后總結一下:
MTU 是指數(shù)據(jù)鏈路層能夠傳輸?shù)淖畲髷?shù)據(jù)幀的大?。ㄒ宰止?jié)為單位)。由于歷史原因,MTU 的值最小為 64 字節(jié),最大為 1518 字節(jié)(Payload 則是 46~1500 字節(jié))
如果發(fā)送的數(shù)據(jù)大于 MTU,則就會進行分片操作;如果小于 MTU,就會在實際數(shù)據(jù)內(nèi)容后面添加填充數(shù)據(jù),使得數(shù)據(jù)包總長度達到最小長度要求
MSS(Maximum Segment Size)是用于指定 TCP 報文段中數(shù)據(jù)部分的最大長度。在建立 TCP 連接時,雙方需要協(xié)商一個合適的 MSS 值以便在數(shù)據(jù)傳輸過程中進行分片和重組
TSO(TCP Segmentation Offload)是一種網(wǎng)絡傳輸卸載技術。TSO 技術將分片過程從 CPU 轉移到網(wǎng)卡上的專用硬件,網(wǎng)卡負責將應用程序的大塊數(shù)據(jù)分段為適當大小的數(shù)據(jù)包,并添加 TCP 首部,然后直接發(fā)送到網(wǎng)絡上
關鍵詞: