網絡卡的TSO解除安裝功能

2021-09-09 08:04:18 字數 2108 閱讀 1624

當前的大部分網絡卡都支援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通,並且可以通過 網路上的芳鄰 互訪。由於路由器 較高,因此,...