首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 系统 UDP问题分析思路

Linux 系统丢 linux 系统丢的原因很多,常见的有:UDP 报文错误、防火墙、UDP buffer size 不足、系统负载过高等,这里对这些丢原因进行分析。...如果遇到丢比率非常大的情况,请先检查防火墙规则,保证防火墙没有主动 drop UDP 报文。 UDP buffer size 不足 linux 系统在接收报文之后,会把报文保存到缓存区中。...因为缓存区的大小是有限的,如果出现 UDP 报文过大(超过缓存区大小或者 MTU 大小)、接收到报文的速率太快,都可能导致 linux 因为缓存满而直接丢的情况。...在系统层面,linux 设置了 receive buffer 可以配置的最大值,可以在下面的文件中查看,一般是 linux 在启动的时候会根据内存大小设置一个初始值。...对于第一个问题,可以在应用程序初始化 socket 的时候设置 socket receive buffer 的大小,比如下面的代码把 socket buffer 设置为 20MB: uint64_t receive_buf_size

15.3K31

linux 系统 UDP问题分析思路

最近工作中遇到某个服务器应用程序 UDP,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考。 在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。...Linux 系统丢 linux 系统丢的原因很多,常见的有:UDP 报文错误、防火墙、UDP buffer size 不足、系统负载过高等,这里对这些丢原因进行分析。...因为缓存区的大小是有限的,如果出现 UDP 报文过大(超过缓存区大小或者 MTU 大小)、接收到报文的速率太快,都可能导致 linux 因为缓存满而直接丢的情况。...在系统层面,linux 设置了 receive buffer 可以配置的最大值,可以在下面的文件中查看,一般是 linux 在启动的时候会根据内存大小设置一个初始值。...对于第一个问题,可以在应用程序初始化 socket 的时候设置 socket receive buffer 的大小,比如下面的代码把 socket buffer 设置为 20MB: uint64_t receive_buf_size

7K42
您找到你想要的搜索结果了吗?
是的
没有找到

UDP流程

2、在传输层 udp_write() 调用本层的 udp_sendto() 完成功能。...udp_sendto() 完成 sk_buff 结构体相应的设置和报头的填写后会调用 udp_send() 来发送数据。...3、在网络层,函数 ip_queue_xmit() 的功能是将数据进行一系列复杂的操作,比如是检查数据是否需要分片,是否是多播等一系列检查,最后调用 dev_queue_xmit() 发送数据。...4、在链路层中,函数调用会调用具体设备提供的发送函数来发送数据,e.g. dev->hard_start_xmit(skb, dev);。具体设备的发送函数在协议栈初始化的时候已经设置了。...这里以 8390 网卡为例来说明驱动层的工作原理,在 net/drivers/8390.c 中函数 ethdev_init() 的设置如下: image.png image.png

77500

UDP流程

2、在传输层 udp_write() 调用本层的 udp_sendto() 完成功能。...udp_sendto() 完成 sk_buff 结构体相应的设置和报头的填写后会调用 udp_send() 来发送数据。...3、在网络层,函数 ip_queue_xmit() 的功能是将数据进行一系列复杂的操作,比如是检查数据是否需要分片,是否是多播等一系列检查,最后调用 dev_queue_xmit() 发送数据。...4、在链路层中,函数调用会调用具体设备提供的发送函数来发送数据,e.g. dev->hard_start_xmit(skb, dev);。具体设备的发送函数在协议栈初始化的时候已经设置了。...这里以 8390 网卡为例来说明驱动层的工作原理,在 net/drivers/8390.c 中函数 ethdev_init() 的设置如下: image.png image.png

1.1K00

Linux内核网络udp数据发送(一)

本系列文章1-4,来源于陈莉君老师公众号“Linux内核之旅” 1....前言 本文首先从宏观上概述了数据发送的流程,接着分析了协议层注册进内核以及被socket的过程,最后介绍了通过 socket 发送网络数据的过程。 2....数据发送宏观视角 从宏观上看,一个数据从用户程序到达硬件网卡的整个过程如下: 使用系统调用(如 sendto,sendmsg 等)写数据 数据穿过socket 子系统,进入socket 协议族(protocol...(dest)); 该系统调用穿过Linux 系统调用(system call)层,最后到达net/socket.c中的这个函数: /* * Send a datagram to a given...sendmsg()函数作为分界点,处理逻辑从 AF_INET 协议族通用处理转移到具体的 UDP 协议的处理。 5. 总结 了解Linux内核网络数据发送的详细过程,有助于我们进行网络监控和调优。

4.1K51

UDP协议抓分析

因此,应用程序需要选择合适的报文大小。...因为这里使用了捕获过滤器,仅捕获UDP 在PC上执行QQ程序,这时候只需要简单地登陆一下,将会捕获到大量的UDP数据; 在wireshark中查看抓记录 其中,我们会看到许多...QICQ协议,这里的QICQ协议表示是运行的QQ程序; 在分析UDP数据之前我们先介绍一下格式,以清楚地理解每个 UDP数据报首部格式如下: 源端口:用来传输数据的端口 目标端口:...其中,第四行信息是UDP协议的详细信息。 其中,以下内容表示这是第1570帧数据报的详细信息。其中大小为712个字节 以下内容表示以太网帧头部信息。...以下信息是被UDP封装进去的数据,其大小为47bytes 关于以上UDP首部格式,我们可以构造出下表: 嗯嗯~~就酱紫!!!

3.4K20

Linux内核网络UDP数据发送(四)——Linux netdevice 子系统

Linux 支持流量控制(traffic control)的功能,此功能允许系统管理员控制数据如何从机器发送出去。流量控制系统包含几组不同的 queue system,每种有不同的排队特征。...可以将 qdisc 视为调度程序, qdisc 决定数据的发送时间和方式。 Linux 上每个 device 都有一个与之关联的默认 qdisc。...协议层必须正确地设置此标志。当 flow 的所有 outstanding(需要确认的)数据都已确认时,TCP 协议层将设置此标志。当发生这种情况时,内核可以为此数据选择不同的 TX 队列。...UDP 协议层不设置此标志 ,因此 UDP 数据永远不会将 ooo_okay 设置为非零值。...如果使用 setsockopt 带 IP_TOS 选项来设置在 socket 上发送的 IP 的 TOS 标志( 或者作为辅助消息传递给 sendmsg,在数据级别设置),内核会将其转换为 skb-

3.3K11

Wireshark抓:详解udp协议

通过wireshark这个抓包工具抓取udp协议的报文进行详细的分析。dns默认是基于udp协议的。 访问一个域名的过程中,其实就是会做一个域名解析。域名解析用到的就是dns协议(应用层协议)。...下面就触发dns的流量,抓取报文看下udp协议的实现: ping一个域名,解析成ip地址,这个过程就会调用dns协议。...下面就是抓抓到的dns协议: 首先发了个这样的域名请求,然后网关承担域名解析的作用,回应一个这个域名对应的ip地址是什么。...这就是udp协议。...基于udp协议之上的是dns协议: 2.下面是网关给我回了一个域名解析: 双击第二个报文,查看详情: 也是基于一个udp协议的,因为是网关给我回的,所以源目ip和源目端口都给我调换过来了,其它的是没有变的

5.6K21

Linux内核UDP为什么效率低?能做什么优化?

现在很多人都在诟病Linux内核协议栈收效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK。...但是,即便Linux内核协议栈收效率真的很低,这是为什么?有没有办法去尝试着优化?而不是动不动就DPDK。 我们从最开始说起。...然而,在2.6.25版本内核中,Linux协议栈的UDP路径,转而采用了两层锁的backlog队列机制,和TCP一样的逻辑: low_lock_lock(sk) { spin_lock(sk->higher_level_spin_lock...当然,Linux内核协议栈无法摆脱这两点问题,也就回答了本文的题目中的第一个问题, “Linux内核UDP为什么效率低?” 。 不同的上下文异步操作同一份数据,锁是必不可少的。...,这买卖代价太大,毕竟Linux内核并非专职收的。

3.2K61
领券