一 背景

同事说告警报文没办法接收了, 程序同时向本机发送 UDP 告警和另外一台机器发送 UDP 报文,结果显示,本机 UDP 是正常收到的,远程的机器收不到 UDP 报文的.

二 问题分析

2.1 基本分析

程序同时发送到本地应用和远程应用的,虽然是不同的 IP 和端口,但是是同一个逻辑,所以程序的本身的问题可能性比较小,先测试下是否为网络问题:

  • 先用 ping 测试下,由于 ping 被禁止了,所以没有测试出什么来.

  • 利用nc -ul xxx 在远程机器新建一个 udp 监听端口,应用程序所在机器,通过nc -u x.x.x.x xxx 连接后,通过输入一些字符,来看看远程机器是否有屏显,结果本次测试正常,说明网络是通的.

  • 继续在远程的机器抓包,发现不是没有收到,而是收到的包相对来说比较小,大小为 400 多个字节左右,均是这种小于 1 千个字节的.

  • 在发送告警的机器通过 tcpdump 抓包: tcpdump -i eth1 udp port xxxx -A -nn 发现有类似于以下内容的告警:

21:01:39.000550 IP (tos 0x0, ttl 64, id 63736, offset 0, flags [+], proto UDP (17), length 1500)xxx.xxx.xxx.xxx.59019 > xxx.xxx.xxx.xxx.documentum: UDP, bad length 6902 > 1472

首先,我们来看下这个 1472 是怎么来的,在以太网环境中,以太网的帧的 body 大小为 46 字节到 1500 字节之间,本次是处于 IPV4 的环境,IP 包头大小为 20 个字节,所以还剩下 1480 字节;UDP 的协议的报文头长度为 8 个字节,所以剩下的 udp 的包体长度为 1480-8 = 1472 个字节,具体展示如下图: 格式如下:

UDP报文格式

上述告警意思是因为我们环境下网卡的 MTU 设置为 1500 个字节,如下:

[root@localhost ~]# ifconfig
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

因为发送的 UDP 报文长度大于可以传输的安全长度 1472 个字节,这不代表不能发送,只是因为大于了帧的最大传输长度,所以在 IP 层需要进行分包,一旦网络环境不好,分包产生了丢失问题,会造成 IP 的组包失败,从而导致 UDP 的报文丢失.

不过鉴于 Internet 上的标准 MTU 值为 576 字节,所以建议在进行 Internet 的 UDP 编程时,最好将 UDP 的数据长度控制在 (576-8-20)548 字节以内

还可以通过netstat -su进行监控:

[root@localhost ~]# netstat -su
IcmpMsg:InType0: 141039InType3: 72945InType8: 1616InType13: 1OutType0: 1616OutType3: 777474OutType8: 141039OutType14: 1
Udp:4039279 packets received123325 packets to unknown port received.67020 packet receive errors4229636 packets sent67020 receive buffer errors0 send buffer errors
UdpLite:
IpExt:InNoRoutes: 2InMcastPkts: 26InBcastPkts: 723113InOctets: 27500413848629OutOctets: 27491308862298InMcastOctets: 832InBcastOctets: 287040162InNoECTPkts: 126755848707InECT0Pkts: 16

2.2 尝试解决

既然 MTU 太小了,那么尝试修改下两端的 MTU 最大值,MTU 是取整个路由的 MTU 最小值,我们尝试把两端的 MTU 增大下:

ifconfig eth1 mtu 9000 up

两端 MTU 增加后,仍然会报错,那么可能的原因是中间路由设备设置的 MTU 比较小,查看下,由于主机上没有 traceroute 命令来跟踪,尝试使用另外一个命令:

tracepath xxx.xxx.xx.xx.xx

类似于 traceroute,可以追踪路由,结束后打印 MTU 值. 还可以带个端口,测试这个 UDP 端口.

[root@localhost ~]# tracepath 1xx.xx.xx.2xx/100011?: [LOCALHOST]                                         pmtu 15001:  xx.xx.xx.xx                                         0.502ms reached1:  xx.xx.xx.xx                                          0.323ms reachedResume: pmtu 1500 hops 1 back 1

在实际环境中,由于中间很多路由都看不到,而且让中间的所有路由都改 MTU 值不是太现实.

在 MTU 为 1500 字节的情况下,如果发送的 UDP 报文大于 MTU,比如发送 8000 个字节,如果包缓存足够,且分包按照正确的顺序到来,通过 recvfrom(9000) 还是可以收到一个完整的 UDP 包的. 如果 IP 分片丢失,校验失败,包就会丢弃.recvfrom(9000)将阻塞.

2.3 更改 socket 缓冲区大小

为防止 socket 缓冲区溢出造成的问题,特意增加了 socket 的缓冲区.cat /proc/sys/net/core/rmem_defaultcat /proc/sys/net/core/rmem_max可以查看 socket 缓冲区的缺省值和最大值。可以通过echo xxx >/proc/sys/net/core/rmem_default的方法来临时修改,也通过更改/etc/sysctl.conf 文件添加以下配置来修改:

net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=262144
net.core.wmem_max=262144

修改完成后记得运行以下命令来生效:

sysctl -p

但是在本次仍然没起到效果.

2.4 最终解决方法

最终解决方法是绕过了这个问题,直接改了接口,不采用 UDP 发送了,而是采用文件采集形式. 这是一次不成功的经验,有这方面经验的朋友,可以留言交流下还有什么原因造成这种问题.

三 诗词欣赏

阵雨
夏令欣逢细雨濛,花轩廊下看斜风。
天光忽觉流云散,忙向东边盼彩虹。夏
雨后偷闲竹椅横,葡萄架下梦初成。
荷风偏扰昏昏睡,偶送鸣蛙四五声。

一次UDP收不到问题排查相关推荐

  1. UDP收/发广播包原理及步骤

    UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用 ...

  2. 如何快速优化 Linux 内核 UDP 收包效率? | CSDN 博文精选

    作者 | dog250 责编 | 郭芮 出品 | CSDN 博客 现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈 ...

  3. Linux内核UDP收包为什么效率低?能做什么优化?

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK. 但是,即便Linux内核协议栈收包 ...

  4. 一文搞懂Linux内核怎么提升UDP收包的效率

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK. 但是,即便Linux内核协议栈收包 ...

  5. linux 系统 UDP 丢包问题分析思路

    转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

  6. Linux系统 UDP 丢包问题分析思路和修改网卡缓存

    最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,我在排查过程中基本都是通过使用 tcpdump 在出现问题的各个环节上进行抓包.分析在那个环节出现问题.针对性去排查解决问题 ...

  7. java udp丢包_linux 系统 UDP 丢包问题分析思路

    最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考. 在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程. ●  首先网络报文通 ...

  8. Linux内核UDP性能优化(超详细讲解)

    现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPDK. 但是,即便Linux内核协议栈收包 ...

  9. linux下udp丢包和传输延迟,如何测试UDP数据包的丢包率和延迟

    iperf也可以用于UDP数据包吞吐量.丢包率和延迟指标,但是由于UDP协议是一个非面向连接的轻量级传输协议,并且不提供可靠的数据传输服务,因此对UDP应用的关注点不是传输数据有多快,而是它的丢包率和 ...

最新文章

  1. 一张心酸得不想起名字的照片,人艰就别拆了好吗 | 每日趣闻
  2. CTFshow 文件包含 web78
  3. CRMEB开发文档及目录结构
  4. windows下安装vundle
  5. Go语言学习资料整理
  6. 全球芯片厂商今年设备支出将再增10% 超过980亿美元
  7. android p 游戏调节器,游戏调节器(Game Tuner)
  8. 如何用git将本地项目push到GitHub上?
  9. linux7编译mysql5.7安装,CentOS 7.4 使用源码包编译安装MySQL 5.7.20
  10. 如何做好大型数据中心的运维
  11. ckpt转pb,batch normalzition 出现的ValueError问题
  12. php 有request,请问,php中的$_REQUEST是什么意思啊?
  13. atitit.web ui 结构建模工具总结
  14. weibo.cn html5,微博爬虫:爬取微博正文、关注人
  15. 阿里数据中台维度建模规范、维度模型设计及模型实施方法论
  16. 每天一条Linux命令(12) hostnam (超详细)
  17. 【5G核心网】5GC核心网之网元SMF
  18. 访问weblogic控制台报错的问题处理
  19. office2007版本信息
  20. 一文搞定Vmware下共享文件夹

热门文章

  1. 如何在图片上添加水印?快把这些方法收好
  2. 默克推进下一代抗体药物偶联物疗法;美国FDA受理君实生物特瑞普利单抗治疗鼻咽癌的上市申请 | 医药健闻...
  3. 简要描述CSS 中的定位机制。
  4. android glide缺少方法,android - 无法膨胀且找不到类android支持设计的行为BottomSheetBehavior - 堆栈内存溢出...
  5. python随手记自动记账_随手记 怎么实现自动记账
  6. 微信认证300元发票获取
  7. 自定义View——弹性滑动
  8. 如何通过手机APP远程控制PLC
  9. diskpart(diskpart转换GPT)
  10. 解一元二次方程lisp_lisp语言编写lisp程序解二元一次方程组和一元二次方程组应该怎么做​...