我有一个程序尝试通过 UDP 连接嵌入式设备。嵌入式设备只有一个链路本地地址 (169.254.。);Linux 主机有一个普通(DHCP、RFC1918)地址,由 ubuntu natty 上的 NetworkManager 管理。此本地连接配置为“仅将此连接用于本地网络上的资源”。我的程序在一个套接字上发送一个广播数据包,然后在单播套接字(绑定到本地地址,未连接)上等待传入的信标数据包
有时,我发现 Linux 程序无法接收来自嵌入式设备的链路本地地址的数据包。Wireshark 显示它们到达传入接口并且格式正确,但未收到它们。但是,从 RFC1918 本地地址本地发送和发送到 RFC1918 本地地址的数据包都已收到,来自同一网络上的其他 RFC1918 主机的数据包也是如此。
我还发现,重新启动后,这种情况通常会自行纠正;我可以再次从链路本地地址接收数据包。有时,只需等待一段时间,它也会自行纠正。
是否存在一些模糊的路由设置或其他可能导致传入数据包丢失的情况?传出数据包工作正常(可能是因为我在发送数据包时绕过了路由)。
与最后一起自发恢复的情况相关,我在日志中发现了这一点:
Jul 13 20:58:01 hakase NetworkManager[933]: <info> (eth0): DHCPv4 state changed preinit -> reboot
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 4 of 5 (IP4 Configure Get) scheduled...
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 4 of 5 (IP4 Configure Get) started...
Jul 13 20:58:01 hakase NetworkManager[933]: <info> address 192.168.0.148
Jul 13 20:58:01 hakase NetworkManager[933]: <info> prefix 24 (255.255.255.0)
Jul 13 20:58:01 hakase NetworkManager[933]: <info> gateway 192.168.0.1
Jul 13 20:58:01 hakase NetworkManager[933]: <info> nameserver '192.168.0.1'
Jul 13 20:58:01 hakase NetworkManager[933]: <info> domain name 'mshome.net'
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Scheduling stage 5
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 5 of 5 (IP Configure Commit) scheduled...
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Done scheduling stage 5
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 4 of 5 (IP4 Configure Get) complete.
Jul 13 20:58:01 hakase NetworkManager[933]: <info> Activation (eth0) Stage 5 of 5 (IP Configure Commit) started...
Jul 13 20:58:01 hakase avahi-daemon[862]: Joining mDNS multicast group on interface eth0.IPv4 with address 192.168.0.148.
Jul 13 20:58:01 hakase avahi-daemon[862]: New relevant interface eth0.IPv4 for mDNS.
Jul 13 20:58:01 hakase avahi-daemon[862]: Registering new address record for 192.168.0.148 on eth0.IPv4.
Jul 13 20:58:02 hakase NetworkManager[933]: <info> Policy set 'Auto dfn3' (wlan0) as default for IPv4 routing and DNS.
Jul 13 20:58:02 hakase NetworkManager[933]: <info> (eth0): device state change: 7 -> 8 (reason 0)
Jul 13 20:58:02 hakase NetworkManager[933]: <info> Activation (eth0) successful, device activated.
Jul 13 20:58:02 hakase NetworkManager[933]: <info> Activation (eth0) Stage 5 of 5 (IP Configure Commit) complete.
Jul 13 20:58:03 hakase postfix/master[1245]: reload -- version 2.8.2, configuration /etc/postfix
[these next two lines are likely associated with the wireshark session I have running]
Jul 13 20:58:09 hakase kernel: [37294.962058] device eth0 left promiscuous mode
Jul 13 20:58:10 hakase kernel: [37295.323279] device eth0 entered promiscuous mode
Jul 13 20:58:11 hakase ntpdate[23459]: adjust time server 91.189.94.4 offset -0.024960 sec
Jul 13 21:02:40 hakase dhclient: DHCPREQUEST of 192.168.0.148 on eth0 to 192.168.0.1 port 67
Jul 13 21:02:40 hakase dhclient: DHCPACK of 192.168.0.148 from 192.168.0.1
Jul 13 21:02:40 hakase dhclient: bound to 192.168.0.148 -- renewal in 248 seconds.
Jul 13 21:02:40 hakase NetworkManager[933]: <info> (eth0): DHCPv4 state changed reboot -> renew
Jul 13 21:02:40 hakase NetworkManager[933]: <info> address 192.168.0.148
Jul 13 21:02:40 hakase NetworkManager[933]: <info> prefix 24 (255.255.255.0)
Jul 13 21:02:40 hakase NetworkManager[933]: <info> gateway 192.168.0.1
Jul 13 21:02:40 hakase NetworkManager[933]: <info> nameserver '192.168.0.1'
Jul 13 21:02:40 hakase NetworkManager[933]: <info> domain name 'mshome.net'
[at approximately one second later the connection to the link-local device was established]
这种“重启”状态是否与问题有某种联系?
答案1
在 Linux 主机上静态分配本地地址,看看这个问题是否会消失。将 DHCP 排除在外。最坏的情况是,当它停止工作时,您不会得到“自发恢复”的效果,但至少您可以将对 DHCP 的担忧从您的列表中消除。
而且,如果您愿意,请尝试另外分配一个 169.254/16 地址,看看是否有帮助。
答案2
这里有很多复杂的信息,我看到的唯一问题是:“是否存在一些模糊的路由设置或其他可能导致传入数据包丢失的东西?”
你真正的问题是什么?我将回答这个问题:“我正尝试从 192.168.1.101 联系 169.254.100.15。为什么我无法联系它?”
套接字通信通过 TCP 进行,对吗?
为了使不同子网上的两个主机能够相互通信,需要对它们进行路由。
链路本地地址 (169.254.0.0/16) 从未被路由(http://en.wikipedia.org/wiki/Link-local_address)。
您无法从任何其他子网与 169.254.0.0/16 上的地址通话。 无论如何都不可能。现在不行,将来也永远不行。
此外:我只是认为您可以研究使用环回并将数据包发送到这样的接口。
答案3
您的输出让我印象深刻的是您的 IP 在 248 秒内更新。
那么你的问题是在这 248 秒之后开始的吗?
如果是这样,则 dhcp-client 可能会在更新时进行一些不必要的配置更改。
时间框架如此之短有什么原因吗?
答案4
尝试运行avahi-autoipd
让您的机器为自己分配一个 169.254/16 地址,然后您应该能够与本地网络上 169.254/16 中的其他主机通信。