GSO/GRO常见疑问

概述

LRO是网卡硬件对小包合并大包的实现,GRO是软件版本的LRO,开启后,在不支持LRO的环境,skb在进入协议栈之前会进行报文合并,以减小协议栈处理的报文数,提高协议栈处理能力。
内核合并流程:npai_gro_receive->dev_napi_gro_receive->inet_gro_receive->tcp_gro_receive->skb_gro_receive
合并逻辑: 对每个一个报文在进入协议栈(netif_receive_skb)之前检查mac层、网络层、传输层头是否满足合并条件,如满足则在函数skb_gro_receive中进行合并。有超时机制对一直未满足合并
条件的报文送入协议栈。合并成功后,会在gro_complete系列函数分层设置各层头字段。(比如校验和字段需要更新)

GSO是TSO的软件实现,在queue_xmit_skb中发包时的validate_xmit_skb中处理,通过netif_needs_gso判断是否需要进行软件gso,只有硬件网卡不支持tso或者由于其他条件不能使用硬件
网卡tso时,才走gso流程。

GRO/GSO常见疑问:

1、报文缓存在哪里?
以nai_struct结构为单位对合并报文进行缓存,缓存在napi->gro_list链表上,每个gro_list最多缓存8个(MAX_GRO_SKBS)会话,超过后则将旧skb送入协议栈。缓存方式为
skb的非线性区(frag_list和nr_frag),一条会话只有一个skb挂在gro_list上,其他skb放在frag_list或nr_frag中

2、缓存报文何时送入协议栈?
缓存长度超过64k时
tcp头字段不满足条件时,如带syn、reset等标记、seq序号不连续等,此时将当前skb和gro_list上的同会话skb都送入协议栈处理。(即逻辑是只有一条流的skb一直满足合并规格时才会合并)

3、在什么位置合并?
在协议栈入口netif_receive_skb之前进行合并

4、gro是否涉及数据拷贝?
不涉及,多个合并的skb是以frag_list和nr_frags两个非线性区间方式连接在一起。(部分情况可能需要拷贝少量的报文头数据,比如第一个skb的线性区长度小于hdrlen)

5、合并成功后,skb头部哪些字段会变化?
skb->len, ip头校验和,tcp头校验和无需计算,改成skb->ip_summed=checksum_partial。
gso_size被赋值为首歌skb的len, gso_segs=gro_count

Virtio网卡与GSO/GRO

virtio:
内核register_netdev() 中默认开启gso和gro(不是tso/lro)特性NETIF_F_SOFT_FEATURES。

tap网卡的offload能力与virtio_net有关,qemu进程会设置tap网卡oflload,通过qemu进程的virtio_net_apply_guest_offloads接口完成
VIRTIO_NET_F_GUEST_TSO4表示guest可以接收宿主机tso报文,tap开启tso时等于tap不分包,直接把大包传给了虚拟机。
VIRTIO_NET_F_HOST_TSO4表示宿主机可以接收tso报文,此时guest内部可以将未分包的大数据直接传给宿主机。由宿主机转入协议中,如果通过最终物理口
发送,可能由最终物理课进行tso真实处理。

参考资料

GRO
https://blog.csdn.net/lucien_cc/article/details/11731463

GSO
https://blog.csdn.net/wangquan1992/article/details/128564019
https://blog.csdn.net/zgy666/article/details/106817333/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值