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