众所周知,udp是无连接的,所以忽略udp接收方状态,是否监听对应udp端口以及ip是否存在,直接向udp发送数据,会发生什么?
为了搞清楚这个问题,我们尝试在局域网建立收发设备,然后抓包分析。
端口不可达
从抓包来看,udp数据正常发出。对端设备回复icmp指示端口不可达。
ip 不可达
当我们把接收端设备关机,此时udp数据正常发出,直到arp连续三次请求失败。此时抓包显示udp包已经不发送了。
此时,我们跟踪sytem call 确定,发用户空间的sendto 接口仍然显示成功。
sendto(3, "012345679abcdef\0", 16, 0, {sa_family=AF_INET, sin_port=htons(54321), sin_addr=inet_addr("192.168.28.207")}, 16) = 16
此时通过查看arp缓存确定ip状态已经标记为INCOMPLETE
。
$ip neigh show
192.168.28.207 dev wlp0s20f3 INCOMPLETE
尝试手动更新arp缓存的mac地址和状态到REACHABLE
。
$sudo ip neigh change 192.168.28.207 lladdr dc:a6:32:3f:94:36 nud reachable dev wlp0s20f3
提示:对于如上命令和状态值详细可以参考man ip-neighbour
。
此时udp又重新发了出来。
值得一提的是,在路由器查看arp缓存,发现不管设备断开多久,状态都不会变更为INCOMPLETE
而始终是STALE
。
$ip neigh show
192.168.28.207 dev br-lan lladdr dc:a6:32:3f:94:36 STALE
还不快抢沙发