當前的大部分網絡卡都支援tcp segmentation offload功能,tcp的分片解除安裝到物理網絡卡由硬體完成。
tcp在傳送資料報時(tcp_transmit_skb),設定gso_size的值作為分片的長度,其大小等於當前tcp連線的mss值。
static inline int tcp_skb_mss(const struct sk_buff *skb)
static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, gfp_t gfp_mask)
*/ skb_shinfo(skb)->gso_segs = tcp_skb_pcount(skb);
skb_shinfo(skb)->gso_size = tcp_skb_mss(skb);
}
函式tcp_set_skb_tso_segs將當前的mss值賦予tcp_gso_size,其在tcp傳送路徑中呼叫。
static void tcp_set_skb_tso_segs(struct sk_buff *skb, unsigned int mss_now)
else
}
另外,要使用tso功能,物理網絡卡必須同時支援tcp的校驗和解除安裝功能,否者,禁止網絡卡的tso功能。
static netdev_features_t netdev_fix_features(struct net_device *dev, netdev_features_t features)
}
軟體計算部分資料的校驗和(checksum_partial),比如ip偽頭部,其它的tcp資料都交由網絡卡來處理,以下的tcpdup抓包,可以看到由於不是完整的校驗和,顯示checksum不正確。
在本機上使用tcpdump抓包,看到的報文長度超過網絡卡裝置的mtu值,如下長度4336,而網絡卡裝置僅有1500位元組大小mtu,原因就在於tcp的分片是利用網絡卡的tso功能進行的,而tcpdump抓到的是分片之前的資料報:
out e4:3a:6e:0a:51:31 ethertype ipv4 (0x0800), length 4352: (tos 0x0, ttl 64, id 12630, offset 0, flags [df], proto tcp (6), length 4336)
192.168.1.128.40074 > 192.168.10.128.40443: flags [.], cksum 0x9e33 (incorrect -> 0x2c8a), seq 869:5153, ack 1009, win 242, options [nop,nop,ts val 382868 ecr 188877580], length 4284
使用如下命令ethtool -k,可檢視網絡卡ens38的tso功能是否使能:
$ ethtool -k ens38
features for ens38:
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off
tx-tcp6-segmentation: off [fixed]
udp-fragmentation-offload: off [fixed]
$ ethtool -k ens38 tso off
$
如上命令,使用ethtool工具關閉網路裝置ens38的tso功能之後,再次tcpdump抓包,這次顯示的報文長度都是小於1500的資料報了。
核心版本 linux-4.15
乙太網卡TSO技術
一 簡介 tso tcp segment offload 技術是一種利用網絡卡的少量處理能力,降低cpu傳送資料報負載的技術,需要網絡卡硬體及驅動的支援。二 原理 在不支援tso的網絡卡上,tcp層向ip層傳送資料會考慮mss,使得tcp向下傳送的資料可以包含在乙個ip分組中而不會造成分片,mss是...
4招幫你解除安裝隱藏的網絡卡
1 登錄檔編輯 開啟硬體裝置管理器,點選選單 檢視 顯示隱藏的裝置 這時裝置列表中就顯示出了舊的硬體清單,開啟 網路介面卡 右鍵選擇半透明的舊網絡卡進行 解除安裝 然後點選 操作 掃瞄硬體改動 網絡卡也恢復沒有 2的原狀 另外,刪除登錄檔中舊網絡卡型號及tcp ip設定的項也可以達到效果,位置在 h...
用兩塊網絡卡實現網絡卡路由的功能
一 關於路由器 假設現在有網段1 192.168.1.n 接到hub1 和網段2 192.168.2.n 接到hub2 兩個網段,分別連線到兩個集線器 hub 上,而這兩個hub之間又被直接相互連線著。現在要求兩個網段之間能夠相互ping通,並且可以通過 網路上的芳鄰 互訪。由於路由器 較高,因此,...