coleyao 发表于 2019-6-13 16:48:27

请教内网和内网设备间UDP可靠通讯的问题

   问题的现象是这样的:一台电脑可以访问外网,其IP地址为192.168.10.158,网关192.168.10.1,电脑需要使用UDP方式访问局域网内另一个网络设备,这台设备的IP地址是192.168.10.25,出现的现象是大多数时间电脑UDP访问是正常的,但偶尔会出现发出的UDP数据到达不了IP地址是192.168.10.25的网络设备,如果将交换机上连接外网的RJ45拔掉,软件重启一下,则内网之间UDP通讯是正常的。
现在想请教一下,有没有办法只通过设置网络地址的软件设置类的办法而不动硬件,使得内网和外网相互之间不干涉,都可以正常运行?

zxq6 发表于 2019-6-13 17:13:00

目前也遇到该问题,看看高手如何解答。

智涅 发表于 2019-6-13 17:26:43

1、将交换机上连接外网的RJ45拔掉
2、软件重启一下
这两个都是恢复正常的必要条件??
集线器换成路由器试试会这样么?

aozima 发表于 2019-6-13 17:42:39

有ARP欺骗吧,各个点抓包看一下。

coleyao 发表于 2019-6-13 18:38:16

本帖最后由 coleyao 于 2019-6-13 18:39 编辑

智涅 发表于 2019-6-13 17:26
1、将交换机上连接外网的RJ45拔掉
2、软件重启一下
这两个都是恢复正常的必要条件??


这两个条件是确保电脑发出的UDP包不会被发到外网上去(与外网断开物理连接并且软件重启后检测到的网络环境不含外网相应的网络地址,如果只是断开外网,软件不重启,有可能软件还会用之前的配置发出数据包)。
另外奇怪的是以前运行了大概一个月左右,没有反映过这样的问题,这次用新的5台设备替换掉老的2台设备之后就出现了这样的问题,按理说不管是接多少设备,不会影响UDP通讯的,实际上UDP是1对1通讯,接收到UDP包的设备再将数据包通过485转发出去,无UDP通讯的设备都是从机,只是接收RS485数据包。

散装805 发表于 2019-6-13 18:39:42

“设备”需不需要连接外网,不需要的话换个IP段

coleyao 发表于 2019-6-13 18:43:00

本帖最后由 coleyao 于 2019-6-13 18:46 编辑

散装805 发表于 2019-6-13 18:39
“设备”需不需要连接外网,不需要的话换个IP段

设备不连外网,电脑是需要外网的,电脑那边改成和设备同样的网段或是自动设定IP地址好像都有UDP数据包泄漏到外网的情况,按理说内网设备相互之间通讯是应该非常可靠的。

智涅 发表于 2019-6-13 18:56:54

本帖最后由 智涅 于 2019-6-13 18:58 编辑

那按交互机工作原理,它是把数据转到外网的端口去了,所以你PC没收到。你外网的而网口拔掉后它重新更新了端口映射表然后又可以收到了。
但是你说“如果软件不重启,有可能软件还会用之前的配置发出数据包”
你的软件有什么配置?你目标IP还有端口不是固定的么?


编辑原因:长时间用微信习惯Ctrl加回车进行换行

coleyao 发表于 2019-6-13 19:01:37

智涅 发表于 2019-6-13 18:56
那按交互机工作原理,它是把数据转到外网的端口去了,所以你PC没收到。你外网的而网口拔掉后它重新更新了端 ...

 有可能是因为用了交换机的原因,现在的网路设备基本上很少用集线器了,都是交换机,要是集线器的话,相当于群发,应该就不存在一个集线器上的设备收不到另一个挂在同一个集线器上的设备的数据包的情况!

智涅 发表于 2019-6-13 19:02:31

coleyao 发表于 2019-6-13 19:01
 有可能是因为用了交换机的原因,现在的网路设备基本上很少用集线器了,都是交换机,要是集线器的话,相 ...

嗯集线器是群发,交换机会根据端口映射表转发

vtte 发表于 2019-6-13 19:43:05


看来还有很多人不清楚网络数据包的发送流程啊,就楼主的同网段udp单播包来说:
1、发送方会查本机arp表,没有的话先发一个arp包,这个包是广播方式发送的,局域网内所有设备都会收到,用来查询目的ip地址的MAC地址。
2、发送的arp包里带有发送方的MAC地址,交换机会记录这个MAC,成为MAC和物理端口映射表的一部分,目标设备也会记录这个MAC地址,成为arp表的一部分。
3、非目的设备会忽略这个包,目的设备会回应一个包,这个回应的包同样会被交换机和源设备记录。
4、有目的MAC后,设备才会将真正要发的包发出去,发出去的包到交换机后,交换机会根据之前建立的MAC和端口映射表进行转发,其它端口的设备并不会收到这个包。就楼主说的担心将数据包发到外网去,根本不可能。

就楼主的情况来说,因为UDP本身就是无连接的不可靠协议,丢数据太正常了,这里列几个可能:
1、交换机转发也有吞吐量的,负载高的情况下就有可能丢包;
2、硬件也有可能造成丢包,网卡、网线、水晶头质量不好等;
3、有arp欺骗的情况,数据可能被发到其它设备上去了;
4、目的设备如果吞吐量大也有可能丢包。

vtte 发表于 2019-6-13 19:44:48

所以使用UDP需要用户自己处理好丢包、粘包、顺序等问题。

xujihu 发表于 2019-6-13 19:47:19

会不会是网络设备的问题,网络设备打开了广播接收接收到外网广播,

cody 发表于 2019-6-13 19:54:53

UDP本身就允许丢包的

coleyao 发表于 2019-6-13 21:18:12

cody 发表于 2019-6-13 19:54
UDP本身就允许丢包的

   UDP协议是允许丢包没错的,但是从电脑发出的数据包如果是使用网卡直连的方式与网络设备进行通讯,因为没有重新拆包和打包的过程,理论上是不存在丢包和数据包次序错乱的现象的,因此对于因使用交换机导致的UDP数据偶然丢失,我认为换成集线器应该是可以解决问题,当然集线器之所以被淘汰,也是有它的缺点在,不过在当前的应用场合似乎集线器反而比交换机更适合(即局域网内广播方式传输数据,导致带宽利用率低)!

McuPlayer 发表于 2019-6-13 22:03:53

本帖最后由 McuPlayer 于 2019-6-13 22:21 编辑

失败的时候,是UDP包全丢了,还是丢包率升高?
Ping一下,看看能不能响应,ICMP包跟UDP包差不多,看能不能到达

交换机工作在二层上,以MAC地址为参考的数据链路层

---------------------------------------------------------------------------
IPV4的MTU最小值为576,扣除一些头尾,500个字节的UDP包在经过交换机的时候,不会被重新打包,而是直接包级转发

-------------------------------------------------------------------------------
用双网卡电脑,做一个桥,抓包分析
分别插入到电脑网口端,设备网口端,看看数据在哪里丢的

coleyao 发表于 2019-6-14 08:00:23

McuPlayer 发表于 2019-6-13 22:03
失败的时候,是UDP包全丢了,还是丢包率升高?
Ping一下,看看能不能响应,ICMP包跟UDP包差不多,看能不能 ...

ping过,响应时间有点偏长,快的时候30ms左右,慢的时候会到600mS左右,但没有丢的现象,至于时间长,应该是和我单片机的响应速度慢有关系,通讯芯片是SPI接口的,单片机之前没有专门对网络响应时间优化过!

snowy 发表于 2019-6-14 08:05:34

应该是数据包增多,mcu又繁忙的情况下导致的。可以考虑换带vlan的交换机,电脑配置双网卡或者支持vlan的网卡。让mcu的环境纯净,另外就是w5100 w5500之类的硬件tcpip是不是好一些?

modbus 发表于 2019-6-14 09:06:07

想可靠还是用TCP,否则就得自己处理好丢包等问题

coleyao 发表于 2019-6-14 09:13:34

modbus 发表于 2019-6-14 09:06
想可靠还是用TCP,否则就得自己处理好丢包等问题

这次先把交换机换成集线器测试看看,如果没问题就这样用了,下次再有新项目再考虑用TCP协议,其实也不是不喜欢用TCP协议,只是TCP协议相对UDP协议单片机处理起来稍微要麻烦一点,网口驱动芯片的库里是带简单的TCP通讯Demo的,是我没估计到UDP通讯的丢包率在局域网内也会这么高!

modbus 发表于 2019-6-14 11:11:02

用UDP想要达到TCP的可靠性,自己处理起来可能更麻烦,所做的工作也要多得多
页: [1]
查看完整版本: 请教内网和内网设备间UDP可靠通讯的问题