關(guan)于GRO、GSO、TSO、UFO、LRO等概念,網上有很多解(jie)釋,但個人感覺都解(jie)釋得不(bu)很清(qing)楚。這里個人做個總結,希望能幫助到需要(yao)幫助的人。
| 縮寫 | 概念 | 解釋 |
| TSO |
TCP Segmentation Offload |
利用(yong)網卡對TCP數據包(bao)進行(xing)分片,也叫做(zuo)LSO。而當網卡支持TSO時(shi),TCP層會逐漸增大(da)mss(總(zong)是整數倍(bei)數增加(jia)),當TCP層向(xiang)下發(fa)送大(da)塊數據時(shi),僅僅計算TCP頭,網卡接到到了IP層傳(chuan)下的大(da)數 據包(bao)后自己重新分成若干個IP數據包(bao),添(tian)加IP頭(tou),復(fu)制TCP頭(tou)并且重新計(ji)算(suan)校驗(yan)和等(deng)相關(guan)數據,這樣就把一(yi)部(bu)分(fen)CPU相關的處(chu)理(li)工作轉移到由網卡來處(chu)理(li)。 內(nei)核TCP/IP協議棧也必(bi)須(xu)考慮下發包數和實際包數不(bu)一(yi)致的情(qing)況,例(li)如(ru)處(chu)理(li)擁塞控制算(suan)法時必(bi)須(xu)做一(yi)些(xie)特殊的處(chu)理(li)等等。 可(ke)見,TSO執(zhi)行的(de)是TCP分段,而不是分片! |
| UFO |
UDP Segmentation Offload |
利(li)用網(wang)卡對UDP數據(ju)(ju)包進(jin)行(xing)(xing)分片。UFO全稱(cheng)是(shi)UDP fragmentation offload。從名字可以看出(chu),這是(shi)針對UDP的(de)優化(hua)。但是(shi)不像(xiang)TCP,UDP沒(mei)有(you)Segmentation的(de)過程,用戶程序發給UDP多長的(de)數據(ju)(ju)(當然要控(kong)制在64K以內),UDP都會(hui)轉給IP層(ceng)。IP層(ceng)會(hui)根據(ju)(ju)MTU進(jin)行(xing)(xing)Fragmentation。UFO使(shi)得網(wang)絡設備,例如網(wang)卡,可以將一個超(chao)(chao)長的(de)UDP數據(ju)(ju)段(超(chao)(chao)過MTU),分成多個IPv4分片(fragment)。因為在網(wang)卡做了(le)(le),所以,CPU的(de)運算(suan)量被節省下(xia)來了(le)(le)。 注(zhu)意:這(zhe)里(li)是(shi)IP層分片,并不(bu)復制UDP頭(tou)。 |
| GSO |
Generic Segmentation Offload |
GSO是(shi)TSO的增(zeng)強(qiang) ,GSO不只(zhi)針對(dui)(dui)TCP,對(dui)(dui)任意協議。比TSO更通用(yong),推遲數據分片(pian)(pian)直至(zhi)發送到網卡(ka)驅動之前,此時會檢(jian)查網卡(ka)是(shi)否支持(chi)分片(pian)(pian)功(gong)能(如TSO、UFO),如果支持(chi)直接發送到網卡(ka),如果不支持(chi)就(jiu)進行分片(pian)(pian)后再(zai)發往(wang)網卡(ka)。 |
| LRO |
Large Receive Offload |
通過將接收到的多個TCP數據聚合成一個大的數據包,然后傳遞給網絡協議棧處理,以減少上層協議棧處理 開銷,提高系統接收TCP數據包的能力。注意,這個也是段的(de)聚合,而非片的(de)聚合。 |
| GRO |
Generic Receive Offload |
跟LRO類似,克服了LRO的一些缺點,更通用。后續的驅動都使用GRO的接口,而不是LRO。 |
總結:
- 對于TCP而言(yan),無論是TSO還(huan)是(shi)LRO,都是(shi)工作(zuo)在4層的。是分段而不是分片。
- UFO被合并到了(le)GSO。
- LRO由(you)于不(bu)好實現,已經從很多(duo)網卡上刪除了(le)(也就(jiu)是說,很多(duo)網卡是不(bu)支持LRO的,這(zhe)部(bu)分功(gong)能在GRO中(zhong)被覆蓋)。
-
GRO、GSO在虛擬機上(shang)同樣有效(xiao)。TCP在大量發包的情況下,可以看(kan)出效果(guo)。
- 當前多(duo)數(shu)硬件(jian)都不(bu)支持分片聚合,故,所謂的URO其實(shi)是不(bu)存在(zai)的。而對于(yu)TCP而言,也(ye)只是聚合分段(duan),分片聚合一般(ban)也(ye)是不(bu)存在(zai)的。
參(can)考(kao)鏈(lian)接:
//zhuanlan.zhihu.com/p/44683790