linux 网卡gso,linux内核网络协议栈学习笔记:关于GRO/GSO/LRO/TSO等patch的分析和测试...

本文详细介绍了Linux内核中的TCP Segmentation Offload (TSO)、Generic Segmentation Offload (GSO)、Generic Receive Offload (GRO)和Large Receive Offload (LRO)技术。通过分析内核源码和实际测试,阐述了这些技术如何提高网络性能,特别是TSO在性能提升上的显著效果。同时,讨论了GRO的实现细节,包括skb的处理流程和合并策略。
摘要由CSDN通过智能技术生成

TSO,全称是TCP Segmentation Offload,我们知道通常以太网的MTU是1500,除去TCP/IP的包头,TCP的MSS (Max Segment Size)大小是1460,通常情况下协议栈会对超过1460的TCP payload进行segmentation,保证生成的IP包不超过MTU的大小,但是对于支持TSO/GSO的网卡而言,就没这个必要了,我们可以把最多64K大小的TCP payload直接往下传给协议栈,此时IP层也不会进行segmentation,一直会传给网卡驱动,支持TSO/GSO的网卡会自己生成TCP/IP包头和帧头,这样可以offload很多协议栈上的内存操作,checksum计算等原本靠CPU来做的工作都移给了网卡

GSO是TSO的增强 http://lwn.net/Articles/188489/ ,GSO不只针对TCP,而是对任意协议,尽可能把segmentation推后到交给网卡那一刻,此时会判断下网卡是否支持SG和GSO,如果不支持则在协议栈里做segmentation;如果支持则把payload直接发给网卡

ethtool -k lo

Offload parameters for lo:

rx-checksumming: on

tx-checksumming: on

scatter-gather: on

tcp segmentation offload: on

udp fragmentation offload: off

generic segmentation offload: on

generic-receive-offload: on

目前很多网卡都支持tso,但很少有支持ufo的,而gso/gro和网卡无关,只是内核的特性。gso用来delay segmentation,一直到 dev_hard_start_xmit 函数

int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,

struct netdev_queue *txq)

{

const struct net_device_ops *ops = dev->netdev_ops;

int rc;

unsigned int skb_len;

if (likely(!skb->next)) {

if (!list_empty(&ptype_all))

dev_queue_xmit_nit(skb, dev);

if (netif_needs_gso(dev, skb)) {

if (unlikely(dev_gso_segment(skb)))

goto out_kfree_skb;

if (skb->next)

goto gso;

}

......

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值