是否需要手动设置接口广播地址?

Pow*_*man 12 linux iproute2

我正在从旧的网络工具转换我的脚本:

ifconfig eth0 192.168.2.1 netmask 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

到iproute2:

ip link set eth0 up
ip addr add 192.168.2.1/24 dev eth0
Run Code Online (Sandbox Code Playgroud)

我注意到默认情况下新命令没有设置广播地址。

什么是:

1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 1c:6f:65:c5:d6:d7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 brd 192.168.2.255 scope global eth0
Run Code Online (Sandbox Code Playgroud)

就是现在:

1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 1c:6f:65:c5:d6:d7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.1/24 scope global eth0
Run Code Online (Sandbox Code Playgroud)

我可以将广播地址添加到ip addr命令中,但我想知道是否需要它?首先,这个广播地址是如何以及在哪里使用的?如果未设置,可能会破坏什么?其次,默认情况下,路由表看起来仍然具有正确的条目:

# ip route show table local dev eth0 scope link
broadcast 192.168.2.0  proto kernel  src 192.168.2.1 
broadcast 192.168.2.255  proto kernel  src 192.168.2.1 
Run Code Online (Sandbox Code Playgroud)

我什至无法测试它,因为现在没有人回复ping -b.

小智 6

该问题的正确答案是: ip addr add 192.168.2.1/24 brd + dev eth0

这就是iproute2定义网络接口广播地址的方式。


mgo*_*ven 5

广播地址无需手动设置,由IP网络和子网掩码自动确定。

  • 在我看来,你说的“没有必要设置广播地址”是对的,因为它总是可以从网络掩码和IP中推断出来。但在某些系统上(我在 docker 容器中尝试过 Ubuntu),可能会出现广播地址未设置的情况。因此我想知道为什么接口定义中存在这样的字段。换句话说,为什么我可以 `$ ip addr 192.168.0.4/16 Broadcast 1.2.3.4 dev &lt;dev&gt;` 呢?广播地址不应该是一个字段,但总是计算出来的,对吧? (2认同)