抓包不丢包udp系统层丢包

问题描述:两个不同的应用程序,分别运行在linux服务器A,linux服务器B,跨网段进行udp数据传输,中间经过一种网闸设备(一种安防行业的跨网段的网络设备),服务器A发送数据,服务器B接收数据,服务器B抓包有数据,但是层用程序没有收到。

排查思路如下:

1、对应用程序调用系统接口的recv处进行写文件操作,将接收到的数据写入到文件中,发现文件为空,初步认为应用层没有收到数据

2、将接收数据的接口处打断点进行调试,和上面一样,没有进入断点,因此认为应用层没有收到数据

3、进行ping包测试,双向ping测试,都是ok,然后查看iptables -L路由列表,发现为空,因此认为没有防火墙

4、写了一个小的demo进行测试,分别运行udp client和udp svr,将client运行在和服务器B同一个网段的linux服务器C上面,然后svr运行在服务器B上面,发现服务器B能接受到udp数据。

5、猜测可能和操作系统协议栈有关,因此将服务器B替换成服务器D(windows server服务器),然后服务器A向服务器D推送udp数据,测试发现同样的D服务器也接收不到数据

6、经过4、5两步测试,初步认为服务器B系统层没有什么问题

7、根据unix的四层网络模型,应用层没有收到数据,那么往下查看udp层是否收到数据,linux下通过命令cat /proc/net/snmp |grep Udp查看Recv Udp Packets(netstat -s也可以,同时适用于windows),可以看到udp接收的数据报的接收计数值,发现服务器A在向B发送数据的时候,Udp recv packets计数值一直不变,过滤cat /proc/net/snmp|grep Ip发现ip包计数值一直在增大,然后同时在服务器B上面抓包,发现Ip包接收计数值30s的时间增加了6000+的udp报文,然后Ip计数值也是大概这个数值。多次反复测试,发现抓包得到的udp数据报文和系统Ip计数值增加的数量基本一致,因此结论是Ip层接受到数据,但是Udp层将数据过滤掉导致

8、针对上面的结论进行分析,出现上面的情况有可能是由于udp存在一个校验,udp报文长度是8字节,最后两个字节是Udp校验和,覆盖UDP首部和UDP数据。UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。针对这种情况进行分析,写了一个demo进行验证,发现确实接收端接收到数据校验和是错误的(可以关闭校验,但是发现centos系统上面不支持对应的套接字选项,因此没有关闭接收端校验),将这个信息反馈给网闸开发人员,最后对方确认确实是udp校验和错误导致,网闸修改校验和字段之后问题解决(估计是网闸这边可以修改协议栈信息,操作系统可裁剪)

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值