外观
插上网线那一刻,网卡内部发生了什么?
阶段 1 · 物理层 · 第 6 课
你把一根六类双绞线一头插进电脑 A,另一头插进交换机。大约一秒钟后,网口旁边的绿色指示灯常亮,黄色指示灯开始偶尔闪烁。可有时你在系统里明明看到网卡写着 UP,电脑却依然断网,旁边还多了一个 NO-CARRIER 提示。
在第 1 课中,我们初步认识了网卡里的 MAC 和 PHY 两个角色。插上网线的那一秒钟,PHY 和对端交换机聊了什么?系统的“启用状态”和网线的“物理连通状态”又有什么区别?
学完本课后,你将能够:
- 画出并说出网卡内部从主机 PCIe 总线、MAC 控制器、PHY 收发器到外部接口的分工边界。
- 解释半双工与全双工的区别,以及以太网自动协商如何选定双方的速率和双工模式。
- 定位真实 Linux 输出中的管理状态(
UP/DOWN)与物理链路状态(LOWER_UP/NO-CARRIER),完成本阶段物理层实验。
1. 先看图:网卡里的 MAC 和 PHY 怎样交接棒?
一块以太网网卡(NIC)并不是铁板一块,它正好跨在数据链路层和物理层的交界线上。沿着上图从左往右看:
- 主机接口(PCIe):配合第 2 课讲过的 直接内存访问(DMA) 引擎,把待发送的以太网帧从主机内存(RAM)搬进网卡缓存。
- MAC 控制器(数据链路层功能):它只认得“帧”和“字节”。发送时,它给数据加上前导码、帧起始定界符,并在末尾算出帧校验序列(FCS);接收时,它检查帧是否完整、CRC 校验是否正确。
- MII / GMII / XGMII(介质无关接口):连接 MAC 与 PHY 的内部标准数字通道。为什么叫“介质无关”?因为有了这道标准接口,同一个 MAC 控制器右边既可以接铜缆电口 PHY,也可以接光纤模块,完全不用修改 MAC 逻辑。
- PHY 收发器(物理层功能):它不管帧里面写的是什么地址,只专心做三件事——执行第 4 课的线路编码与调制、在接收时从波形中恢复时钟和比特、以及与对端网口进行链路脉冲检测与自动协商。
- 网络变压器与物理接口(RJ45 / SFP):电口网线前通常会有一颗网络隔离变压器,用来耦合差分信号并阻挡外部浪涌高压,保护主板芯片。
2. 双工模式与自动协商:两端怎样达成默契?
一根网线插在千兆网卡和交换机之间,它们怎么知道对方支持 1000 Mb/s 还是 100 Mb/s?能不能两边同时说话?这就涉及双工模式和自动协商。
半双工(Half Duplex) vs 全双工(Full Duplex)
| 双工模式 | 通信方式与日常类比 | 适用场景与冲突特征 |
|---|---|---|
| 半双工(Half Duplex) | 像对讲机或单车道独木桥:同一时刻只能一方发、另一方收;若双方同时发就会发生碰撞(Collision) | 早期集线器(Hub)共享型以太网,或开放空间的 Wi-Fi 无线信道 |
| 全双工(Full Duplex) | 像打电话或双向双车道:收发使用独立的线对/光纤通道(或回波抵消技术),双方可以同时发送和接收 | 现代交换机点对点铜缆/光纤链路的标准工作模式,彻底消除了双绞线上的碰撞 |
自动协商(Auto-Negotiation)是怎么工作的?
当你把网线插好的瞬间,哪怕操作系统还没发送任何数据包,两端的 PHY 芯片就已经开始用**快速链路脉冲(FLP,Fast Link Pulse)**互报家门了:
- 互报能力清单:主机
eth0的 PHY 发出脉冲串说:“我支持1000M 全双工、100M 全/半双工、10M 全/半双工。”对端交换机端口也发回它所支持的清单。 - 按优先级取最大交集:双方比对清单,自动挑出双方都支持的最高性能档位(优先级从高到低依次为:
1000M 全双工 > 1000M 半双工 > 100M 全双工 > 100M 半双工 > 10M 全双工 > 10M 半双工)。 - 点亮物理链路:握手并完成时钟锁定后,PHY 向操作系统报告“物理载波已就绪(Link Up /
LOWER_UP)”,网口绿灯常亮!
工程避坑(双工不匹配): 如果一端人为强制关闭自协商并设为
100M 全双工,而另一端保持默认的“自动协商”,自协商端虽然能测出100M速率,但因为收不到对端的双工脉冲通告,会按标准安全退化为 100M 半双工!结果一端全双工、一端半双工,导致大量帧冲突与 CRC 错包,网速慢如蜗牛。因此:要么两端都开自动协商,要么两端手动指定完全相同的速率和全双工。
3. 实验 · 观察网卡管理状态、物理链路与协商速率
在网络排障中,第一步永远是确认物理层是否连通。下面我们通过 Linux 标准网络工具 ip 和网卡工具 ethtool,观察真实主机的网卡状态。
- 实验目的:区分网卡的管理状态(Administrative State)与物理链路状态(Physical Link State),读懂协商速率和双工模式。
- 拓扑与环境:Ubuntu 24.04 LTS(Linux Kernel 6.8,
iproute2-6.8.0,ethtool 6.7)。主机有两张千兆电口网卡:enp3s0(已插网线连入千兆交换机)和enp4s0(已启用但未插网线)。本实验为只读观察,不修改系统配置。 - 预期观察:插好网线的
enp3s0同时具备UP和LOWER_UP,速率为1000Mb/s Full;未插网线的enp4s0虽然管理状态是UP,但显示NO-CARRIER。
步骤 1:用 ip -br link 快速查看所有网卡状态
ip -br link(-br 表示 brief 简洁模式)是排查物理层最顺手的命令。它会按列输出“接口名、汇总状态、MAC 地址、标志集合”:
text
$ ip -br link
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
enp3s0 UP 52:54:00:1a:2b:3c <BROADCAST,MULTICAST,UP,LOWER_UP>
enp4s0 DOWN 52:54:00:1a:2b:3d <NO-CARRIER,BROADCAST,MULTICAST,UP>(注:上方为实验环境示例输出,MAC 地址已使用虚拟化保留前缀脱敏。)
请对照输出看尖括号 <...> 里的两个关键标志:
| 观察点与标志 | 代表哪一层 | 含义解释 | 在 enp3s0 中 | 在 enp4s0 中 |
|---|---|---|---|---|
<...,UP,...> | 操作系统(管理状态) | 管理员已在软件层面开启该网卡(相当于总开关已合上) | 有 UP(已启用) | 有 UP(已启用) |
LOWER_UP vs NO-CARRIER | 物理层 PHY(链路状态) | PHY 芯片是否检测到对端有效载波信号并完成同步 | LOWER_UP(物理连通) | NO-CARRIER(无物理信号) |
| 第 2 列汇总状态 | 综合可用状态 | 只有管理状态和物理层同时就绪,汇总列才显示 UP | UP | DOWN(因物理未通) |
步骤 2:用 ethtool 检查物理速率、双工与自协商细节
当 enp3s0 处于 LOWER_UP 时,它到底协商成了千兆还是百兆?网线有没有因为破损退化成百兆?我们用 ethtool enp3s0 直接读取网卡 PHY 寄存器状态:
text
$ ethtool enp3s0
Settings for enp3s0:
Supported link modes: 10baseT/Half 10baseT/Full
100baseTX/Half 100baseTX/Full
1000baseT/Full
Advertised link modes: 10baseT/Half 10baseT/Full
100baseTX/Half 100baseTX/Full
1000baseT/Full
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
Auto-negotiation: on
Link detected: yes输出解读结论:
Supported与Advertised link modes:本机网卡硬件支持且向外通告了10M、100M和1000baseT/Full能力。Auto-negotiation: on:自动协商已开启。Speed: 1000Mb/s、Duplex: Full、Link detected: yes:物理层已成功与对端交换机握手,稳定运行在千兆全双工双绞线模式。如果你明明插在千兆交换机上,这里却显示Speed: 100Mb/s,通常说明网线 8 芯里有线芯接触不良(百兆只需用 4 芯,而千兆必须 8 芯全通)!
4. 小结与下一步
- 网卡内部边界:MAC 负责帧格式与校验(数据链路层),PHY 负责信号编码、时钟恢复与链路协商(物理层)。
- 双工与自协商:现代交换以太网工作在无冲突的全双工模式;两端通过自动协商自动选择双方共同支持的最高速率与双工档位。
- 状态排查:
UP表示系统启用了网卡,LOWER_UP表示物理层信号已连通,NO-CARRIER则提示优先检查网线、光模块或对端端口。
在刚才的 ethtool 输出里,我们看到了 Speed: 1000Mb/s。为什么连上 1000Mb/s 的千兆网卡后,你下载文件时软件显示的最高速度却只有 110 MB/s 左右?而玩网络游戏时,大家更关心的“延迟 20 ms”又是由哪些时间组成的?下一课我们用公式和交互实验算清物理层的最后一关——速率、吞吐量与四类时延。