看网络问题的第一件事是看接口:ifconfig 里一长串的 flags、options、netmask 到底是什么意思?十六进制的掩码怎么变成 /22?一台机器为什么有二十多个网络接口?netstat 的收发计数怎么看?这篇用本机的真实输出逐项拆开。
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=6460<TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM> ether xx:xx:xx:xx:xx:xx inet6 fe80::…%en0 prefixlen 64 secured scopeid 0xe inet <本机局域网IP> netmask 0xfffffc00 broadcast <本机局域网IP> nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active flags=0x8863 逐位拆开:0x1(UP) + 0x2(BROADCAST) + 0x20(SMART) + 0x40(RUNNING) + 0x800(SIMPLEX) + 0x8000(MULTICAST);与 ifconfig 打印的 <UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> 一致
flags 是一个位图:UP 表示管理上启用,RUNNING 表示链路层可用,BROADCAST / MULTICAST / SIMPLEX 描述能力。这里 0x8863 逐位拆开与 ifconfig 打印的名字完全一致。
掩码 0xfffffc00 = 255.255.252.0 = /22(32 位里前 22 位是 1,后 10 位是 0) 网络号 = 地址 AND 掩码 = <本机局域网IP>/22;网络里共 1024 个地址,可用主机 1022 个(去掉全 0 的网络号与全 1 的广播地址) ifconfig 给出的广播地址 <本机局域网IP> = 网络号 OR (NOT 掩码) = <本机局域网IP> —— 两者相同 本机地址落在网络内的第 356 个位置(从网络号算起);同一网段的另一台主机地址与本机 AND 掩码后得到同一个网络号,才被当作“直连” 对照一个示例 10.1.2.200/22:网络号 10.1.0.0,广播 10.1.3.255,可用主机 1022 个,地址范围 10.1.0.1 ~ 10.1.3.254
十六进制掩码 0xfffffc00 就是 255.255.252.0,前缀长度 22。网络号 = 地址 AND 掩码,广播 = 网络号 OR 掩码取反,可用主机 = 2^(32−前缀) − 2。
接口 23 个,按名字前缀分:en×7, utun×4, anpi×3, lo×1, gif×1, stf×1, bridge×1, ap×1, awdl×1, llw×1, pktap×1, nan×1
lo × 1 回环
en × 7 以太网 / Wi-Fi / 雷电网桥适配器 (networksetup: Ethernet Adapter (en4), Ethernet Adapter (en5), Ethernet Adapter (en6), Thunderbolt 1, Thunderbolt 2, Thunderbolt 3, Wi-Fi)
utun × 4 用户态隧道(VPN、iCloud 专用中继等)
awdl × 1 Apple 无线直连(AirDrop)
llw × 1 低延迟 WLAN(Apple 内部)
bridge × 1 桥接(雷电网桥) (networksetup: Thunderbolt Bridge)
gif × 1 通用隧道
stf × 1 6to4 隧道
anpi × 3 Apple 网络(以太网适配器相关)
ap × 1 软件 AP
nan × 1 Wi-Fi 感知
pktap × 1 抓包伪接口
UP 且有 IPv4 地址的接口: ['lo0', 'en0'],其余接口要么没有 IPv4(只有 IPv6 链路本地或没地址)、要么没 UP一台 Mac 上有 23 个接口:以太网 / Wi-Fi、雷电网桥、各种隧道(utun、gif、stf)、AirDrop 的 awdl 和抓包伪接口,真正承载 IPv4 业务的通常只有 lo0 和一个 en。
Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes en0 1500 <Link#14> xx:xx:xx:xx:xx:xx 92164107 0 65511630277 52187398 0 11132179573 0 en0 1500 fe80::… fe80::… 92164107 - 65511630277 52187398 - 11132179573 - en0 1500 <本机局域网IP>/22 <本机局域网IP> 92164107 - 65511630277 52187398 - 11132179573 - Name Mtu Network Address Ipkts Ierrs Ibytes Opkts Oerrs Obytes lo0 16384 <Link#1> 143749654 0 187269674455 143749654 0 187269674455 0 同一个接口出现多行:一行是链路层(<Link#N> + MAC),每个地址再各占一行,计数是整个接口共用的
netstat -I 的计数属于整个接口,多行(链路层、IPv6、IPv4)只是地址的展开;lo0 的收发包数相同。
lo0: IPv4 地址 1 个,IPv6 地址 2 个,flags=UP,LOOPBACK,RUNNING,MULTICAST,mtu=16384 en0: IPv4 地址 1 个,IPv6 地址 1 个,flags=UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST,mtu=1500 utun0: IPv4 地址 0 个,IPv6 地址 1 个,flags=UP,POINTOPOINT,RUNNING,MULTICAST,mtu=1500 awdl0: IPv4 地址 0 个,IPv6 地址 1 个,flags=UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST,mtu=1500 bridge0: IPv4 地址 0 个,IPv6 地址 0 个,flags=UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST,mtu=1500 大多数 UP 的接口会有一个 IPv6 链路本地地址(fe80::/10);bridge0 这种没有被配置的是例外。IPv4 的 169.254.x.x 是没有 DHCP 时的自分配地址(见 DHCP / 特殊地址两篇)
一个接口可以有多个地址,尤其是 IPv6 的链路本地、全局、临时地址并存;这台机器上 en0 有 1 个 IPv4 和 1 个 IPv6。