udp发送ip端口发送不可达

默认分类,linux,ubuntu 2022-01-12 862 次浏览 次点赞

arp

众所周知,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

本文由 Jay 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处,点赞1

还不快抢沙发

添加新评论