tyj07 发表于 2016-12-6 10:47:32

如何规避向一个无效IP发送UDP包

做了一套设备向目标IP发送UDP包,若是IP无效了则扩散的UDP包可能把网络里所有的设备堵死。本来想用ICMP不可达报文来判断目标IP是否有效,但是发现在正常传输过程中也会收到ICMP不可达报文而且数量还不少,不好用一定时间内收到多少ICMP报文来判定。而且途中若是经过多个交换机,其中有一个坏了板卡也收不到ICMP不可达报文。不知道有没有其他做法来确认目标IP设备是否正常工作,好让我判断是否该发送UDP包。

tyj07 发表于 2016-12-6 11:02:06

想着是不是可以定时ping设备来检测IP是否有效,RTT+LWIP ping其他设备有函数可以做么,接收IP的回复是在哪里?

kayatsl 发表于 2016-12-6 11:29:00

堵死是因为ARP超时后, 需要重新发 ARP请求去询问ip对应的mac, 但一直没回应, 所以所有udp包都处于pending队列等待 arp返回.

之前我试过一个看起来并不好的方法, 改了一下arp层的函数, 判断如果等待超时, 就清空对那个ip发送的所有包, 并且停止对这个ip发送数据.

当然, ping也可以, 但前提是对方的防火墙没有拦截ping包.

不过最直接还是探测 arp 是否能到达.

vtte 发表于 2016-12-6 11:32:20

你发的速度有多快?能把其它设备堵死?

tyj07 发表于 2016-12-6 11:35:06

kayatsl 发表于 2016-12-6 11:29
堵死是因为ARP超时后, 需要重新发 ARP请求去询问ip对应的mac, 但一直没回应, 所以所有udp包都处于pending队 ...

探测 arp 是否能到达需要怎么操作?抱歉,我对这块不太熟悉……是跟ICMP不可达报文类似的么?

NJ8888 发表于 2016-12-6 11:35:56

应用层应答机制,没响应做相关处理比如降低发送频率

kayatsl 发表于 2016-12-6 11:43:57

tyj07 发表于 2016-12-6 11:35
探测 arp 是否能到达需要怎么操作?抱歉,我对这块不太熟悉……是跟ICMP不可达报文类似的么? ...

其实并不大建议这么做.因为这样做会把底层封装好仅内部调用的函数给公开出来.

具体就是跑到最底层去, 用 arp_request() 的接口创建一个对你要发送的ip的 arp请求.

然后去读arp列表是否能收到对应的mac返回.

------------------------------------------------------------------

印象中有个开关去关闭 udp包对 arp请求的发送等待.
关闭后的话, 如果arp不可到达, 包也不会缓冲, 直接丢弃.

不过我也不确定有没有记错, 得找找.

tyj07 发表于 2016-12-6 11:48:02

NJ8888 发表于 2016-12-6 11:35
应用层应答机制,没响应做相关处理比如降低发送频率

是想若是无效IP就把发送断掉,关键是怎么检测,现在查到etharp_query函数可以检测,先试试。
页: [1]
查看完整版本: 如何规避向一个无效IP发送UDP包