当我的机器没有网络时,如何使用ifconfig将广播IP添加到os/x下的loopback接口?

ban*_*ios 2 networking mac-osx udp ifconfig

我是高级网络管理的新手,我想用 UDP 广播做一些测试,所以我需要在我的环回接口上一个广播地址。机器离线,即没有网络。

我怎样才能做到这一点,ifconfig而不必在建议的评论中作为一名用户购买交换机。在 Linux 中,我所要做的就是使用 127.255.255.255 并且广播工作正常,无需任何网络或任何交换机。如果我有网络,显然我可以使用 255.255.255.255。


您可以通过以下方法自行检查它是否在 linux 上有效,但在 os/x 中无效:

  1. 打开两个终端并在它们上输入:

    nc -u -l 55555

  2. 打开第三个终端,必要时安装 socat 并输入:(以防您问 netcat 不支持广播

    echo -n "TEST" | socat - udp-datagram:127.255.255.255:55555,broadcast

  3. 您应该看到两个终端都收到了消息。

如果您对 127.0.0.1 尝试相同的实验,则只有一个终端会按预期收到消息。

在 OS X 上执行相同的测试不会表现出相同的行为。

如果可能的话,我正在寻找一种用于广播的软件解决方法。
我不能使用多播(它必须是广播),也不能通过网络(机器离线)进行测试。

vor*_*aq7 11

您没有“添加”广播地址。您将流量定向到网络的广播地址
广播地址是一个完全虚拟的概念,在正常实践中不应“添加”或以其他方式分配给任何主机。

上述规则的例外是指定广播地址(使用ifconfig broadcast),这是在广播地址可能是非标准的情况下完成的。通常,如果您天真地使用broadcastifconfig 选项,那么您正在做一些奇怪的事情,并且可能是错误的......

如果您想向 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>
Run Code Online (Sandbox Code Playgroud)

请注意BROADCASTflags 字段中的缺失。
使用指定的广播选项(地址)配置设备会导致地址被忽略。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
    ...etc

  • 使用运行您的广播测试命令 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(由flagsifconfig 中的字段确定)--您正在谈论的平台做不要在环回接口上宣传对广播的支持,因此您无法执行您所要求的操作。

  • 我在这里可能是错的,但我相信你必须绑定到 0.0.0.0 或广播 IP 才能获得广播。像您一样绑定到非广播 IP 将无法按预期工作。我同意环回不会通告广播标志,但它仍然在 127.255.255.255 上支持它。我不知道这是一个黑客攻击、一个错误还是一个功能。但看起来确实支持它。 (2认同)