bigywater.tech
网络协议 · 7

接口、地址与子网掩码:ifconfig / netstat 里每个字段的含义

看网络问题的第一件事是看接口:ifconfig 里一长串的 flags、options、netmask 到底是什么意思?十六进制的掩码怎么变成 /22?一台机器为什么有二十多个网络接口?netstat 的收发计数怎么看?这篇用本机的真实输出逐项拆开。

0x8863
en0 的 flags,拆开是 6 个标志位:UP、BROADCAST、SMART、RUNNING、SIMPLEX、MULTICAST
0xfffffc00 = /22
en0 的十六进制子网掩码,对应 1024 个地址、1022 个可用主机
23 个 / 2 个
这台机器的网络接口总数 / 同时 UP 且有 IPv4 地址的接口数(lo0、en0)

flags

实测 · 本机执行输出
  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。

分步演示

接口与地址
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64(Apple 芯片)/ Python 3.14.8 / tcpdump(libpcap)/ scapy 2.8 / dpkt / dnspython / h2 / aioquic / OpenSSL / curl 8.7.1;抓包在 lo0(环回)上做,少数实验用真实网卡 en0(这台机器上 en0 是 Wi-Fi,tcpdump 看到的是系统转成以太网格式的帧,所以文中的“以太网头”都指这个 14 字节的头)或访问公网(会在文章里注明);需要丢包 / 延迟 / 限速时,用一个只作用于 lo0 端口 9400-9499 的 dummynet 辅助脚本(netlab);所有服务端都是本机自己起的进程;时间戳取自 tcpdump 的 -tt,数字每次运行会有小幅抖动。接口信息通过 sysd.py 执行 ifconfig / netstat / networksetup(绕开 macOS 的本地网络隐私限制);MAC 地址、链路本地 IPv6 地址、局域网 IP 都做了遮盖;第二节同时用 10.1.2.200/22 这个示例数值说明算法
    • 没有验证:用 ifconfig alias 给接口加多个 IPv4 地址(需要 root);点对点接口(utun)的 netmask 含义;Linux 的 ip addr 输出格式;IPv6 前缀与作用域的细节(见 IPv6 一组);接口 flags 在其它 BSD 上的差异
    京ICP备2026067502号-1京公网安备11010502063487号