【问题标题】:Broadcast address validation广播地址验证
【发布时间】:2022-05-01 07:38:29
【问题描述】:

如何验证广播IP地址?

  • IP地址:192.168.36.226
  • 网络掩码:255.255.255.0
  • 广播:192.168.36.255

是否可以提供任何广播地址(假设为 1.2.3.4)。如果是,对与其他网络的通信有何影响。

【问题讨论】:

标签: broadcast


【解决方案1】:

IP 地址和网络掩码确定广播地址。您不能只使用任何广播地址,否则任何需要广播流量的东西都不起作用。

网络掩码指定子网的大小。 255.255.255.0 的网络掩码通常表示为 /24,这意味着 IP 地址的前 24 位指定网络 ID,其中后 8 位用于单个主机。 192.168.0.100/24 是网络上的主机,ID 为192.168.0.0,广播地址为192.168.0.255。网络中可用的最高值是广播地址。

10.1.2.3/8的广播地址是10.255.255.255。其十进制子网掩码为255.0.0.0

【讨论】:

    【解决方案2】:

    正如 Brad 所说,如果您有网络掩码,那么计算广播地址就非常容易。您只需交换所有位并与主 IP 地址进行 OR。

    现在不推荐使用 255.255.255.0 等掩码。相反,您应该在 IP 上使用多个位。例如:192.168.36.226/24

    数字 24 表示从最高有效位开始的 1 的数量。这与使用 128 位的 IPv6 的原理相同。因此,使用 IPv6 时,这些数字通常要大得多

    计算 IPv4 掩码的一种方法是使用 -1 和 32 - size(我们的例子是 32 - 24 = 8):

    size = 24;  // somehow you get this number...
    ...
    unsigned int mask = -1;
    shift = 32 - size;
    mask <<= shift; // C++ operator, in C write: mask = mask << shift;
    

    现在您可以通过翻转掩码的所有位并将其与 IP 进行 ORing 来计算广播地址:

    broadcast_bits = ~mask;
    broadcast_ip = ip | broadcast_bits;
    

    我认为 IPv6 做同样的事情,但使用 128 位。 IPv6 也不提供多播(匹配 224.0.0.0/4 的 IP)。

    如果您的问题是关于查找以太网或类似网卡接口中定义的广播地址,那么上面的代码不是您感兴趣的。相反,您想列出接口,列出每个 IP 地址在每个接口上定义(在某些系统上,一个接口上最多可以有 65536 个 IP)。该列表包括广播 IP 地址和主 IP 地址以及掩码。换句话说,你可以这样做:

    if(my_ip & mask == interface->ip & mask)
    {
        if(my_ip == interface->broadcast_ip)
        {
            return interface;
        }
    }
    return nullptr;
    

    通过以下方式访问接口列表:

    struct ifaddrs * ifa_start(nullptr);
    getifaddrs(&ifa_start);
    for(struct ifaddrs * ifa(ifa_start); ifa != nullptr; ifa = ifa->ifa_next)
    {
        if((ifa->ifa_flags & IFF_BROADCAST) != 0
        && ifa->ifa_broadaddr != nullptr)
        {
            // found the broadcast address of that interface
        }
    }
    

    有了这些信息,您应该能够找到上面使用的地址和掩码。请注意,所有接口可能不支持广播(我认为不太可能)。

    有关完整实现,请参阅libaddr (C++)。接口实现见libaddr/iface.cpp

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 2011-02-28
      • 1970-01-01
      • 2010-12-02
      • 2010-10-16
      • 1970-01-01
      • 2014-09-04
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多