广播有效但未设置广播地址

广播有效但未设置广播地址

快速提问

获取广播地址的良好做法是使用类似ioctl()或的系统调用getifaddrs(),或者由于以下两个原因它们是否已经过时/无用?

  1. 我可以在网络掩码和 IP 之间进行二进制或运算
  2. 广播地址并不总是被设置的

细节

我正在使用一些 UDP 广播代码,既在我的 Arch Linux 机器上,也在一些 Ubuntu Docker 容器上。

我看到一些接口设置了广播地址,例如 Arch Linux 上的我的 wifi 接口(来自$ ip addr):

inet 192.168.0.11/24 brd 192.168.0.255 范围全局 wlp4s0

有些则没有,例如eth0Ubuntu Docker 容器上的界面:

inet 172.17.0.5/16 范围全局 eth0

但是,如果我发送数据包172.17.255.255它们实际上被广播了到网络上的其他机器。

这个问题据说不需要手动设置广播地址。并且这里,有人似乎暗示 Docker 故意不设置广播地址,出于某种我不明白的原因。

所以我开始疑惑:检测网络接口的广播地址的正确方法是什么?

答案1

似乎广播地址在某种程度上是接口定义中的“独立”字段(至少在我尝试过的一些 Linux 系统上是这样),但它不应该用于定向广播,因为它可能会被取消设置。

如果未设置,广播地址会被诸如此类的命令错误地读取为“0.0.0.0” ioctl(),最终导致这个情况

因此我想再次提一下ip addr质疑并支持广播地址应根据 ip 和网络掩码计算的想法。广播地址应仅被视为命令(例如或 )输出的指示ifconfig

相关内容