我是高级网络管理的新手,我想对 UDP 广播进行一些测试,所以我需要我的环回接口上的广播地址.机器处于离线状态,也就是说没有网络。
我如何才能实现这一点,ifconfig
而无需像评论中的一位用户建议的那样购买交换机。在 Linux 中,我只需使用 127.255.255.255,广播就可以正常工作,无需任何网络或任何交换机。如果我有网络,我显然可以使用 255.255.255.255。
你可以通过以下方法自己检查它是否在 linux 上运行但在 os/x 上不运行:
打开两个终端并在其上输入:
nc -u -l 55555
打开第三个终端,根据需要安装 socat 并输入:(如果你问 netcat 不支持广播)
echo -n "TEST" | socat - udp-datagram:127.255.255.255:55555,broadcast
你应该看到两个航站楼接收消息。
如果您尝试使用 127.0.0.1 进行相同的实验,则只有一个终端会按预期收到消息。
在 OS X 上执行相同的测试不会表现出相同的行为。
如果可能的话,我正在寻找一种用于广播的软件解决方案。
我无法使用多播(必须进行广播),也无法通过网络(机器离线)进行测试。
答案1
您无需“添加”广播地址。将流量引导至网络的广播地址。
广播地址是一个完全虚拟的概念,并且不应该在正常做法中被“添加”或以其他方式分配给任何主机。
上述规则的例外是指定广播地址(使用
ifconfig broadcast
),这在广播地址可能不标准的情况下完成。通常,如果您没有使用broadcast
ifconfig 选项,那么您会做一些奇怪的事情,并且可能错误的...
如果您想向 127.0.0.0/8(本地/环回)网络发送广播,理论上您可以简单地将流量引导至 127.255.255.255,但如果您尝试这样做,您会发现它不起作用,因为环回设备不支持BROADCAST
流量。
ifconfig lo0
你可以通过在 Mac 上运行来亲自检查这一点,它将产生如下输出:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.1 netmask 0xff000000
nd6 options=1<PERFORMNUD>
BROADCAST
请注意,标志字段中缺少。
使用指定的广播选项(地址)配置设备会导致地址被忽略。BSD 或 Linux(Debian)机器的行为类似,我希望其他平台也能如此,不过,如果BROADCAST
您仔细搜索,您可能会发现一个奇怪的方法,允许您在环回设备上设置标志。
讨论了这背后的逻辑在 FreeBSD 邮件列表帖子中不允许广播的另一种理由也在评论中进行了讨论此服务器故障答案,它提出了使用MULTICAST
(是通常由环回接口支持)。
具体来说,关于您的测试案例:您看到的不是预期的行为。我能够重现您的行为,但仅限于非常有限的几种情况。
为了进行更可靠的测试,以表明环回设备上的广播实际上不起作用在 Linux 上,请在方便的 Linux 机器上尝试以下测试用例(我的测试用例:Ubuntu 13.04):
在您的环回接口上配置第二个地址(第三、第四、第五个——您想要多少个都可以)。
启动一个 netcat 实例监听每个环回地址,例如 --
nc -u -l 127.0.0.1 5555
nc -u -l 127.0.0.2 5555
nc -u -l 127.0.0.3 5555
...等使用运行广播测试命令
socat
echo TEST | socat - udp-datagram:127.255.255.255:5555,broadcast
你会注意到没有任何您的 netcat 窗口收到消息(预期行为因为环回接口没有BROADCAST
在它的标志字段中公布对的支持),但是如果你直接向它们寻址 (例如echo TEST2 | socat - udp-datagram:127.0.0.2:5555
),它们会毫无问题地接收消息。
你要求的“解决方案”不存在(或者至少不应该工作)在任何平台上,除非环回接口支持BROADCAST
(可以通过flags
ifconfig 中的字段确定)——你正在谈论的平台不宣传对环回接口的广播支持,因此您无法执行您要求的操作。