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

linux 系统 UDP问题分析思路

最近工作中遇到某个服务器应用程序 UDP,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考。 在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。...此外,linux 系统也提供了各个网络协议的丢信息,可以使用 netstat -s 命令查看,加上 --udp 可以只看 UDP 相关的报文数据: [root@holodesk02 GOD]# netstat...Linux 系统丢 linux 系统丢的原因很多,常见的有:UDP 报文错误、防火墙、UDP buffer size 不足、系统负载过高等,这里对这些丢原因进行分析。...如果遇到丢比率非常大的情况,请先检查防火墙规则,保证防火墙没有主动 drop UDP 报文。 UDP buffer size 不足 linux 系统在接收报文之后,会把报文保存到缓存区中。...因为缓存区的大小是有限的,如果出现 UDP 报文过大(超过缓存区大小或者 MTU 大小)、接收到报文的速率太快,都可能导致 linux 因为缓存满而直接丢的情况。

7K42

Linux 系统 UDP问题分析思路

Linux 系统丢 linux 系统丢的原因很多,常见的有:UDP 报文错误、防火墙、UDP buffer size 不足、系统负载过高等,这里对这些丢原因进行分析。...UDP 报文错误 如果在传输过程中UDP 报文被修改,会导致 checksum 错误,或者长度错误,linux 在接收到 UDP 报文时会对此进行校验,一旦发明错误会把报文丢弃。...如果遇到丢比率非常大的情况,请先检查防火墙规则,保证防火墙没有主动 drop UDP 报文。 UDP buffer size 不足 linux 系统在接收报文之后,会把报文保存到缓存区中。...因为缓存区的大小是有限的,如果出现 UDP 报文过大(超过缓存区大小或者 MTU 大小)、接收到报文的速率太快,都可能导致 linux 因为缓存满而直接丢的情况。...) 1 drops at igmp_rcv+e1 (0xffffffff817b4c41) 通过这些信息,找到对应的内核代码处,就能知道内核在哪个步骤中把报文丢弃,以及大致的丢原因。

15.6K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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

    79100

    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.2K00

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

    本系列文章1-4,来源于陈莉君老师公众号“Linux内核之旅” 1....数据发送宏观视角 从宏观上看,一个数据从用户程序到达硬件网卡的整个过程如下: 使用系统调用(如 sendto,sendmsg 等)写数据 数据穿过socket 子系统,进入socket 协议族(protocol...UDP 协议对应的 prot 变量为 udp_prot,定义在 net/ipv4/udp.c: struct proto udp_prot = { .name = "UDP", .owner...(dest)); 该系统调用穿过Linux 系统调用(system call)层,最后到达net/socket.c中的这个函数: /* * Send a datagram to a given...sendmsg()函数作为分界点,处理逻辑从 AF_INET 协议族通用处理转移到具体的 UDP 协议的处理。 5. 总结 了解Linux内核网络数据发送的详细过程,有助于我们进行网络监控和调优。

    4.2K51

    UDP协议编程_udp c语言

    udp | find "9999" netstart -anbp udp | findstr 9999 linux下发给服务端数据 echo "123abc" | nc -u 172.0.0.1 9999...self.heartbeat,name="heartbeat").start() threading.Thread(target=self.run,name="client").start() #发送心跳...心跳,就是一端定时发往另一端的信息,一般每次数据越少越好。心跳时间间隔约定好就行。 ack即响应,一端收到另一端的消息后返回的确认信息。...也可以双向都发心跳的,用的更少。 UDP协议的应用 UDP是无连接协议,它基于以下假设: 网络足够好 消息不会丢 不会乱序 但是,即使是在局域网,也不能保证不丢,而且的到达不一定有序。...DNS协议,数据内容小,一个就能查询到结果,不存在乱序,丢,重新请求解析。 一般来说,UDP性能优于TCP,但是可靠性要求高的场合的还是要选择TCP协议。

    2.8K30

    socket网络编程(六)——心跳问题

    1、为何需要心跳 问大家一个问题,如果客户端和服务端长时间没有相互发送数据的话,那么我们怎么来判断这个连接是否存在的呢?...跳之所以叫心跳是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。...所以说心跳是一种保证服务端和客户端持续连接的一种机制,心跳可以服务端发到客户端,当然也可以客户端发到服务端,但是一般出于效率的考虑,都是选择客户端发到服务端。...2、心跳的具体实现 首先,还是先不扯其他的太多理论知识,我先扔出代码,然后结合代码讲解心跳原理,本人是比较喜欢这种学习方式,带着疑问去学习,如果大家不习惯的话,可以先跳过以下的代码,先看代码下方的讲解部分...说实话,心跳的代码部分并没有很难理解的地方,主要还是在思路这一方面,掌握了思路,代码都很容易实现。

    30910

    TCP socket心跳示例程序

    即定时发送一个自定义的结构体(心跳),让对方知道自己还活着,以确保连接的有效性。...在TCP socket心跳机制中,心跳可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能更大。...服务端主线程采用 select 实现多路IO复用,监听新连接以及接受数据心跳),子线程用于检测心跳: 如果主线程接收到的是心跳,将该客户端对应的计数器 count 清零; 在子线程中,每隔3秒遍历一次所有客户端的计数器...下面是Linux下一个socket心跳的简单实现: /*************************************************************************...可以看出,客户端启动以后发送了15次心跳,然后停止发送心跳。在经过一段时间后(3s*5),服务器就判断该客户端掉线,并断开了连接。

    3.6K20

    UDP协议抓分析

    (3)UDP信息的标题很短,只有8个字节,相对于TCP的20个字节信息的额外开销很少。 (4)吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和目标端主机性能的限制。...因为这里使用了捕获过滤器,仅捕获UDP 在PC上执行QQ程序,这时候只需要简单地登陆一下,将会捕获到大量的UDP数据; 在wireshark中查看抓记录 其中,我们会看到许多...QICQ协议,这里的QICQ协议表示是运行的QQ程序; 在分析UDP数据之前我们先介绍一下格式,以清楚地理解每个 UDP数据报首部格式如下: 源端口:用来传输数据的端口 目标端口:...数据将要被传输到的端口 数据报长度:数据报的字节长度 校验和:用来确保UDP首部和数据到达时的完整性 数据:被UDP封装进去的数据,包含应用层协议头部和用户发出的数据 查看捕获的UDP数据。...其中源MAC地址为52:ce:c2:12:8b:ef,目标MAC地址为94:db:da:3e:8f:cf。 以下信息是IPV4首部信息。

    3.5K20

    Swoole中的长连接和心跳

    ,可以使用心跳进行维持 心跳是什么? 顾名思义就是心脏的跳动,可以用来判断一个事物的生和死,Swoole 中的心跳是指用来判断一个连接是正常还是断开的 fd 是什么?...心跳机制就是业务层来提供一个连接是否存活的一个方法,让系统能判定一个连接是否失效 一般有两种实现方式: 客户端定时发送一个心跳,告诉服务器我还活着,服务器定时检测所有客户端列表,看他们最后一个心跳的时间是否过长...第一种方案,对服务器和网络的压力更小,而且更具有灵活性,但需要客户端配合定时发送心跳 第二种方案,对服务器和网络压力更大,不建议使用 在 Swoole 中如何实现?...(允许丢几个) 在客户端发送心跳 使用定时器定时向服务端发送心跳 Swoole\Timer::tick(3000, function () use ($client) { $data = "...任何个人或团体,未经允许禁止转载本文:《Swoole中的长连接和心跳》,谢谢合作!

    1.9K40

    C#UDP编程

    这样就会导致某些UDP协议数据包在传送的过程中丢失,尤其网络质量不令人满意的情况下,丢失数据的现象会更严重。这就是为什么在网络上传输重要数据不采用UDP协议的原因。...二.C#发送、接收UDP数据使用的主要类及其用法 用Visual C#实现UDP协议,最为常用,也是最为关键的类就是UdpClient,UdpClient位于命名空间System.Net.Sockets...中,Visual C#发送、接收UDP数据都是通过UdpClient类的。...C#使用UdpClient类发送UDP数据 在具体使用中,一般分成二种情况: (1) 知道远程计算机IP地址: Send方法的调用语法如下: publicint Send ( byte[] dgram...C#使用UdpClient类接收UDP数据: 接收UDP数据使用的是UdpClient中的Receive方法,此方法的调用语法如下: publicbyte [] Receive ( ref IPEndPoint

    1.2K10

    Wireshark抓:详解udp协议

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

    5.9K21

    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

    UDP的FPGA实现(中) | UDP段、IP、MAC帧结构

    理论上,包含报头在内的数据报的最大长度为65535字节,实际上,UDP的MTU一般为1500,这与CDMA/CS机制有关系,即使巨型也不会超过65535,在基于USO和UFO层次时,可对UDP进行拆处理...(board:00_0a_35_10_fe_c0) 源MAC地址: 长度为6个字节,指明帧的发送者。...(pc:f0_76_1c_82_4e_d8) 长度/类型(type/length): 帧的数据字段长度,为2个字节,里面包含的信息用来标志航一层使用的什么协议,一边接收端把接收到的MAC帧的数据备份山交给上一层的这个协议...UDP在该形式下不能拆!这与CDMA/CS机制有关系,即使巨型也不会超过65535,在基于USO和UFO层次时,可对UDP进行拆处理。...(这1472即为可使用的字节数) 所以在普通局域网环境下,将UDP的数据控制在1472字节下最好。在intel上标准MTU的值为576字节,一般就是512字节一个,大数据使用分包—封包处理。

    3.1K30

    UDP发送大型文件_不丢

    先上图 1:如果对文件要求不高的话 ,可以使用UDPUDP在实际测试中,丢还是听验证的,但是效率高 2:如果文件必须完整,还是使用TCP 。...要是能实现手机发送文件给设备就好了,毕竟大家都是用手机的,不然太浪费时间了 ,因为当时用的是腾讯的Im来实现即时通讯的,利用外网来发送文件, 那么问题就来了 ,这么大 ,要多久才能发完 ,那就用局域网来发送文件吧 ,第一个想到的就是UDP...来实现 ,测试中发现DUP丢问题特别明显,当时死活都找不到原因 ,后来把发送的次数和接受的次数对比打印了一下 ,命名发送了2k次,接收端只接受了500次,OK ,问题就是发送太快了 ,那么就让发送端发慢一点...丢 } if (dataPacket !...'}'; } } 5:另一个对象 package com.example.administrator.canchatdemo.entity; /** * UDP

    4.6K20
    领券