1. Auto-Negotiation 概述与基本原理

1.1 什么是自动协商?

自动协商,说白了就是让两个以太网接口在连接建立时,自动商量出一个双方都能接受的“最佳”工作模式。

我刚开始做网络运维那会儿,遇到过一台交换机死活连不上服务器。换了线,换了端口,折腾半天。后来发现是手动把端口改成了百兆全双工,而服务器网卡只支持千兆——两个设备根本“聊不到一块去”。自那以后,我对自动协商就特别上心。

自动协商(Auto-Negotiation)是 IEEE 802.3 标准定义的一套底层协议。它通过脉冲信号(FLP Burst)在链路初始化期间交换能力信息,最终达成速度(10/100/1000 Mbps)和双工模式(半双工/全双工)的一致。

1.2 为什么需要它?

你想想看,没有自动协商会怎样?

  • 人工配置太累:成百上千个端口,一个一个改双工、改速度,不现实。
  • 容易配错:我见过最惨的案例,一个数据中心里网管把核心端口全配成了强制全双工,结果上游设备是自动协商——两端不匹配,丢包率飙到 30%。
  • 不同设备混搭:老旧 10M 集线器、百兆交换机、千兆服务器混在一起,自动协商能让它们找到最大公约数。

核心价值:自动协商实现了“即插即用”,减少了人为配置错误,也降低了运维成本。

1.3 双工与速度协商的核心概念

1.3.1 双工模式

双工很简单:

  • 半双工(Half Duplex):同一时刻只能发送或接收,就像对讲机。
  • 全双工(Full Duplex):可以同时发送和接收,就像打电话。

现在主流网络几乎全用全双工,但早期共享式以太网只能用半双工。

1.3.2 速度等级

常见速度递进:10 Mbps → 100 Mbps → 1000 Mbps → 2.5 Gbps → 5 Gbps → 10 Gbps。自动协商只能协调到两端都支持的最高速度。

1.3.3 协商过程(敲黑板)

我习惯把自动协商拆成三步:

  1. 发送能力声明:两端各自发出 FLP(Fast Link Pulse)脉冲串,里面包含自己支持的速度与双工组合。
  2. 接收并比较:一端收到对方的 FLP 后,对照自己的能力列表,按优先级选出一个共同支持的“最优”组合。
  3. 锁定并链接:两端确认选择一致,链路建立。如果中间有冲突或超时,协商失败,链路不亮。

避坑指南:我曾经碰到一个诡异现象——网线太长(超过 100 米),FLP 脉冲衰减太厉害,自动协商一直失败。换短网线后当场解决。所以排查链路问题时,先看看物理层有没有问题。

1.4 协商优先级与能力表

自动协商不是随便选,而是有严格优先级:速度优先,同等速度下全双工优先于半双工。具体能力编码可参考下表(我简化了,只列常见组合):

能力位(4位) 组合描述 优先级排名
1000BASE-T Full Duplex 千兆全双工 1(最高)
1000BASE-T Half Duplex 千兆半双工 2
100BASE-TX Full Duplex 百兆全双工 3
100BASE-TX Half Duplex 百兆半双工 4
10BASE-T Full Duplex 十兆全双工 5
10BASE-T Half Duplex 十兆半双工 6(最低)

举个例子:A端支持千兆全双工、百兆全双工;B端支持千兆半双工、百兆全双工。两者共同支持的最高优先级组合是千兆全双工(A端有,B端没有)?不对,B端没有千兆全双工,所以共同支持的最高优先级是百兆全双工(两者都有且排名 3)。最终协商锁定在百兆全双工。

警告:强制一端、自动另一端是故障重灾区。我调试过无数案例,结果发现是有人把交换机端口设成了“强制百兆全双工”,而对端网卡是“自动协商”。强制端不会发 FLP,自动端以为没信号,胡乱降速或根本不通。切记:要么两边都 auto,要么两边都强制且一致。

1.5 自动协商知识体系图

自动协商知识体系 自动协商 (AN) 为什么需要? 核心概念 协商过程 减少人工 避免配错 兼容混搭 速度 (Mbps) 双工模式 优先级表 FLP 脉冲 能力比较 锁定链接 优先级:速度 > 双工

我的小习惯:每次做网络改造,我都会把关键链路的协商结果用 show interfaces status 或 ethtool 记下来,当做基线。这样出了问题,一对比就知道是协商变了还是别的毛病。

1.6 实际场景中的自动协商行为

有些工程师觉得自动协商“看不见摸不着”,其实它每时每刻都在底层运行。常用命令检查协商状态:

# Cisco 交换机
Switch> show interfaces gigabitethernet 0/1 | include Negotiation
  Auto-negotiation: on
  Duplex: Full
  Speed: 1000

# Linux 网卡
$ ethtool eth0
  Speed: 1000Mb/s
  Duplex: Full
  Auto-negotiation: on

如果显示 Auto-negotiation: off,就要注意了。我排查过一个线上丢包问题,发现服务器网卡被 BIOS 强制关了自动协商,跑到 10M 半双工,而交换机是自动协商且没收到 FLP,就僵在那边了。

记住:自动协商不是万能的,但你把它关了就是给自己埋雷。除非两端设备明确要求强制(比如某些光纤直连场景),否则我建议一律开自动协商。