UDP内核发包流程

这篇具有很好参考价值的文章主要介绍了UDP内核发包流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

工作中遇到客户反馈,上层应用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发包流程

UDP内核发包流程
当配额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则与中断\异常相关。

时延大的问题可能是软中断调度问题。文章来源地址https://www.toymoban.com/news/detail-436502.html

到了这里,关于UDP内核发包流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE5 独立程序的网络TCP/UDP服务器与客户端基础流程

    引擎源码版,复制EngineSourcePrograms路径下的BlankProgram空项目示例。 重命名BlankProgram,例如CustomTcpProgram,并修改项目名称。  修改.Build.cs内容 修改Target.cs内容     修改Private文件夹内.h.cpp文件名并修改.cpp内容 刷新引擎 在项目.Build.cs中加入模块  .cpp 客户端.cpp 未完待续。。

    2024年01月17日
    浏览(42)
  • Linux 网络发包流程

    哈喽大家好,我是咸鱼 之前咸鱼在《Linux 网络收包流程》一文中介绍了 Linux 是如何实现网络接收数据包的 简单回顾一下: 数据到达网卡之后,网卡通过 DMA 将数据放到内存分配好的一块 ring buffer 中,然后触发硬中断 CPU 收到硬中断之后简单的处理了一下(分配 skb_buffer ),

    2024年02月12日
    浏览(24)
  • springboot企业客户信息反馈平台springboot39

    大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路,向着优秀程序员前行! 🍅更多优质项目👇🏻👇🏻可

    2024年02月07日
    浏览(29)
  • AI 反馈强化学习的工作原理

            AI反馈强化学习(RLAIF)是一种监督技术,它使用“宪法”来使像ChatGPT这样的AI助手更安全。在本指南中了解您需要了解的有关 RLAIF 的所有信息。 瑞安·奥康纳         近几个月来,大型语言模型 (LLM) 因其编写代码、起草文档等能力而备受关注。人们还观察到

    2024年02月01日
    浏览(71)
  • 基于Java企业客户信息反馈平台详细设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作 ✌ 主要内容: SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P

    2024年01月24日
    浏览(29)
  • 业务需要咨询?开发遇到 bug 想反馈?开发者在线提单功能上线!

    大家是否遇到过下列问题—— 在开发的时候,遇到 bug 需要反馈… 有合作意向的时候,想更多了解业务和相关产品… 在接入的时候,需要得到专业技术支持… 别急,荣耀开发者服务平台在线提单功能上线了~ 处理问题分类说明:业务咨询、产品咨询、技术支持、问题 BUG 反馈

    2024年02月10日
    浏览(35)
  • 开关电源-TL431与光耦组成的电压反馈电路-TL431工作过程分析

    #开关电源#开关电源最基本的要求是输入电压变化时,输出电压保持恒定,而与此相关的测试如电压调整率、负载调整率等也是衡量开关电源性能的重要指标,实现输出电压恒定的方式是反馈,即输出电压的改变可以反馈至电源管理芯片FB脚(feedback),再通过调节开关管的脉

    2023年04月14日
    浏览(28)
  • Linux内核--网络协议栈(二)UDP数据包发送

    一、引言 二、数据包发送 ------2.1、数据发送流程 三、协议层注册 ------3.1、socket系统调用 ------3.2、socket创建 ------3.3、协议族初始化 ------3.4、对应协议的socket创建 ------------3.4.1、sock ------3.5、协议注册 四、通过套接字发送网络数据 ------4.1、inet_sendmsg 本文首先从宏观上概述了

    2024年01月15日
    浏览(29)
  • ASR项目实战-交付过程中遇到的内核崩溃问题

    当前参与交付的语音识别产品服务,算法模块基于经典的Kaldi,算法中的一部分运行在GPU之上。 算法团队采用的是声学模型+语言模型的1-pass方案。这个方案的特点在于,语言模型数据文件(HCLG文件)的大小,和训练语料的丰富程度正相关,即语言文本的语料越多,经过训练

    2024年02月03日
    浏览(52)
  • visual studio 2022换背景遇到的问题

    如果要自定义背景图,则可以下载ClaudialIDE 1.在拓展-点击拓展管理-右上角搜索background-点击下载ClaudialIDE-加载完之后需要关闭vs界面进行下载,下载失败,弹出“由于出现以下错误 无法安装一个或多个扩展”。 解决:点右边的详细信息能够直接跳转到微软的介绍页上,这里也

    2024年02月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包