首页 > 其他分享 >UDP内核发包流程

UDP内核发包流程

时间:2023-05-08 13:45:41浏览次数:39  
标签:UDP udp send 网卡 发包 内核 skb

背景

工作中遇到客户反馈,上层应用UDP固定间隔100ms发包,但本地tcpdump抓包存在波动,有的数据包之间间隔107ms甚至更多,以此重新梳理了下udp的发送流程。

udp发包流程

udp发包流程

udp_sendmsg

UDP corking 是一项优化技术,允许内核将多次数据累积成单个数据报发送。在用户程序中有两种方法可以启用此选项:

使用 setsockopt 系统调用设置 socket 的 UDP_CORK 选项
程序调用 send,sendto 或 sendmsg 时,带 MSG_MORE 参数

如果没设置UDP_CORK,直接发送到ip层,根据客户只是偶尔出现时延过高的情况,可以确定UDP_CORK并没有被设置,udp这里应该是直接下发的,udp_send_skb之后直接到ip层,排除udp_sendmsg导致时延波动问题

int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
{
... ...
/* Lockless fast path for the non-corking case. */
	if (!corkreq) {
		struct inet_cork cork;

		skb = ip_make_skb(sk, fl4, getfrag, msg, ulen,
				  sizeof(struct udphdr), &ipc, &rt,
				  &cork, msg->msg_flags);
		err = PTR_ERR(skb);
		if (!IS_ERR_OR_NULL(skb))
			err = udp_send_skb(skb, fl4, &cork);
		goto out;
	}
... ...
}

qdisc发包流程

qdisc
当配额quota < 0 || need_resched时将触发软中断,否则将直接进行发包。
quota 对应 net.core.dev_weight,可通过sysctl进行更改。

网卡及驱动

如果网卡慢,会导致网卡队列满返回BUSY,数据包重新入队,tcpdump将抓到重复的数据包。客户并未反馈该现象,排除网卡及网卡驱动。

总结

未配置UDP_CORK的情况下,上层udp应用send调用包含两个路径,一个是send直接到网卡驱动进行发送,另一个是send到网络设备子系统__dev_queue_skb,然后由软中断调用继续发送。
决定直接发还是由软中断发的条件是,net.core.dev_weight和 need_resched(需要强制调度),可以通过sysctl -a | grep weight查看其默认值。

对于__qdisc_run来讲,dev_weight代表循环次数,可尝试适当增大这个值,但可能会导致上层应用发送时延增加。
sysctl net.core.dev_weight=4096

need_resched则与中断\异常相关。

时延大的问题可能是软中断调度问题。

标签:UDP,udp,send,网卡,发包,内核,skb
From: https://www.cnblogs.com/forwards/p/17381458.html

相关文章

  • linux 内核回收
    内核主要有4种LRU链表:enum lru_list{LRU_INACTIVE_ANON = LRU_BASE,LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,LRU_UNEVICTABLE,NR_LRU_LISTS};inactive......
  • 主流的浏览器内核是哪几个?
    1.Trident内核:微软开发,代表为IE浏览器;2.Gecko内核(Firefox内核):Netscape6开始采用的内核,后来的MozillaFireFox(火狐浏览器)也采用了该内核,Gecko的特点是代码完全公开;3.Webkit内核:苹果开发,代表为Safari、Chrome和360浏览器;4.Presto内核:OperaSoftware开发,代表为Opera的7到12.17版......
  • linux 内核空间内存分布
    虚拟地址空间划分linux通过宏“PAGE_OFFSET”将4GB的虚拟地址空间(32bit平台)划分成内核地址空间和进程地址空间两部分。“PAGE_OFFSET”的值支持通过Kconfig配置,其默认的值是“0xC0000000”。下面以经典的“PAGE_OFFSET=0xC0000000”来看下linux对虚拟地址空间的详细划分。Linux......
  • UDP广播相关知识,chatGPT回答的
    1路由器和交换机哪个成环会引起广播风暴路由器和交换机都可能引起广播风暴,但是在成环的情况下,交换机更容易引起广播风暴。当交换机形成环路时,广播帧会在网络中不断循环,并且不断地复制并增加它们的数量,最终导致网络拥塞甚至崩溃。为了避免这种情况,网络管理员应该采取措施,例如使用S......
  • 查看Linux系统版本内核命令大全
    目录命令一:查看当前系统发行版本详细信息命令二:查看当前系统内核信息命令三:查看当前系统版本信息命令四:查看CPU相关信息命令五:查看系统位数Linux系统内核、发行版本有很多,那么如何查看当前Linux系统的内核信息、Linux系统发行版本等信息呢?Linux百科网分享查询Linux系统详细信息的方......
  • Linux Centos7内核升级
    LinuxCentos7内核升级现在主流的centos应该都是centos7了,从centos7.2开始,内核版本为3.10,越往后内核版本越高。高版本的内核修复了许多的低版本内核的bug,因此,系统是需要提高内核版本的,从而提高安全性,稳定性,并增加更多的功能。Linux是支持多版本内核共存的,无非是系统启动的时候应......
  • Linux内核调试的方式以及工具集锦
    原文链接 https://blog.csdn.net/gatieme/article/details/68948080  ......
  • [小工具] modinfo - 快速查看内核模块文件信息
    有时候忘了加载模块时参数的名称,可以通过modinfo获取.示例:$modinfo/lib/modules/3.5.0-22-generic/kernel/drivers/media/video/gspca/gspca_mr97310a.kofilename:/lib/modules/3.5.0-22-generic/kernel/drivers/media/video/gspca/gspca_mr97310a.kolicense:......
  • 23 网络数据在内核中流转
    一次具体的网络收发过程:发送过程:应用程序准备好数据,调用用户态下的库函数,调用系统API接口函数,进入到内核态;内核态对应的系统服务函数会复制应用程序的数据到内核的内存空间中,然后将数据移交给网络协议栈,在网络协议栈中将数据层层打包;最后,包装好的数据会交给网卡驱动,网卡驱动程序......
  • Linux 内核组织(kernel.org)将关闭 FTP 服务
    Linux 内核组织(kernel.org)是一家建立于2002年的加利福尼亚公共福利公司,其目的是公开地免费分发Linux内核和其它开源软件。它接受Linux基金会的管理,包括技术、资金和人员支持,用以维护kernel.org 的运营。Linux内核组织是Linux内核发布的官方场所,在其站点上可以找......