抓包不丢包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校验和错误导致,网闸修改校验和字段之后问题解决(估计是网闸这边可以修改协议栈信息,操作系统可裁剪)

 

你可能感兴趣的:(抓包不丢包udp系统层丢包)