我們來看下關於網卡特性的解釋,不過記住GSO和GRO兩個特性就好。
TSO(TCP Segmentation Offload),是利用網卡對TCP數據包分片,減輕CPU負荷的一種技術,也有人叫 LSO (Large segment offload) ,TSO是針對TCP的,UFO是針對UDP的。如果硬件支持 TSO功能,同時也需要硬件支持的TCP校驗計算和分散/聚集 (Scatter Gather) 功能。如果網卡支持TSO/GSO,可以把最多64K大小的TCP payload直接往下傳給協議棧,此時IP層也不會進行segmentation,網卡會生成TCP/IP包頭和幀頭,這樣可以offload很多協議棧上的內存操作,節省CPU資源,當然如果都是小包,那么功能基本就沒啥用了。
GSO(Generic Segmentation Offload),GSO是TSO的增強 ,GSO不只針對TCP,對任意協議。比TSO更通用,推遲數據分片直至發送到網卡驅動之前,此時會檢查網卡是否支持分片功能(如TSO、UFO),如果支持直接發送到網卡,如果不支持就進行分片后再發往網卡。
LRO(Large Receive Offload),通過將接收到的多個TCP數據聚合成一個大的數據包,然后傳遞給網絡協議棧處理,以減少上層協議棧處理 開銷,提高系統接收TCP數據包的能力。
GRO(Generic Receive Offload),跟LRO類似,克服了LRO的一些缺點,更通用。后續的驅動都使用GRO的接口,而不是LRO。
在系統中可以通過ethtool命令來進行查看,如下:
#ethtool -k eth0
generic-segmentation-offload: on
generic-receive-offload: on
TSO、UFO、GSO是對應網絡發送, LRO、GRO是在接收方向上。
我們只需要記住GSO/GRO兩個關鍵字就好了,因為GSO是TSO/UFO的升級,GRO是LRO的升級。