广播地址有两种,SO_BROADCAST 这个选项为什么必须打开,本机的套接字绑在哪里才能收到广播?局域网上每秒到底有多少广播?这篇用本机和 en0 上的真实流量一一验证。
受限广播 255.255.255.255:SO_BROADCAST 未打开 → 失败 [Errno 13] Permission denied 受限广播 255.255.255.255:SO_BROADCAST 打开 → 发送成功(8 字节) 本网段的定向广播地址:SO_BROADCAST 未打开 → 失败 [Errno 13] Permission denied 本网段的定向广播地址:SO_BROADCAST 打开 → 发送成功(8 字节) getsockopt(SO_BROADCAST) 默认值 0(0 = 关)。对单播地址发包不需要这个选项
广播必须先打开 SO_BROADCAST,否则内核返回 Permission denied;单播不需要。
以太网目的 MAC ff:ff:ff:ff:ff:ff,IP 目的 255.255.255.255(受限广播),源地址是本机,TTL 64,帧长 49 字节(IP 总长 35) 以太网目的 MAC ff:ff:ff:ff:ff:ff,IP 目的 本网段的定向广播地址,源地址是本机,TTL 64,帧长 50 字节(IP 总长 36) route get 255.255.255.255:接口 en0,标志 <UP,HOST,DONE,LLINFO,WASCLONED,BROADCAST,IFSCOPE> route get 定向广播地址:接口 en0,标志 <UP,HOST,DONE,LLINFO,WASCLONED,BROADCAST,IFSCOPE> 两种广播的以太网目的地址都是 ff:ff:ff:ff:ff:ff,同一网段所有设备的网卡都会收下并交给 IP 层;区别在 IP 目的:受限广播永远不会被路由器转发,定向广播理论上可以被转发到目标子网(现在的路由器默认都不转发)
255.255.255.255 是受限广播,不会离开本网段;子网最后一个地址是定向广播。两者在以太网上都是 ff:ff:ff:ff:ff:ff。
发 定向广播:0.0.0.0:收到;本机 en0 地址:没收到;定向广播地址:收到;127.0.0.1:没收到;255.255.255.255:绑定失败(Can't assign requested address) 发 受限广播:0.0.0.0:收到;本机 en0 地址:没收到;定向广播地址:没收到;127.0.0.1:没收到;255.255.255.255:绑定失败(Can't assign requested address) 也就是说广播只会交给绑定了通配地址(或恰好是那个广播地址)的套接字;绑在本机单播地址或 127.0.0.1 上的收不到
只有绑定了通配地址 0.0.0.0(或恰好是那个广播地址)的套接字才能收到广播;绑在本机单播地址 / 127.0.0.1 上的收不到。
30 秒共 828 个广播帧(373406 字节,平均 27.6 帧/秒、99.6 Kbit/s):IPv4 UDP 529;ARP 271;其它 0x9998 15;其它 0x2589 8;其它 0x002e 4;其它 0x3689 1 IPv4 UDP 广播的目的端口:5353(mDNS) 384;137(NetBIOS 名字服务) 84;12476(?) 22;5684(?) 17;51007(?) 9;138(NetBIOS 数据报) 3;68(DHCP 客户端端口) 3;161(?) 2 每个广播帧都会打断同一网段里每一台设备的网卡 / 内核,即使它们不关心——这就是广播的代价,组播(下一篇)让不关心的设备可以在网卡层就丢掉
局域网 30 秒有 828 个广播帧,每一台设备都要处理;这是下一篇组播要解决的问题。