为什么不能连续?设计原理与工程真相)
前几天整理工作室的旧设备登进路由器后台看在线设备列表IP地址倒是排得整整齐齐——192.168.1.1、192.168.1.2、192.168.1.3一路顺下去旁边对应的MAC地址却像一锅粥有的以A4:5D:36开头有的以00:1E:65开头还有一串看不出任何规律的乱码。那一刻我突然愣住IP能连续凭什么物理地址就不能连续顺着这个问题查了几天资料把思路捋清楚之后决定整理成这篇笔记。不管你是刚接触网络的初学者还是被家里设备折腾过的普通用户看完应该都能明白物理地址的不连续不是设计疏漏而是它本来就不需要、也没办法连续。1. 先把物理地址这个说法掰扯清楚1.1 教程里的物理地址其实是指MAC日常聊天时经常有人把物理地址和IP地址混着说其实在网络语境下物理地址就是MAC地址Media Access Control Address全称叫介质访问控制地址。之所以叫物理是因为它在网卡出厂时被烧录在硬件芯片里不像IP那样是靠软件配置、随时能改的。正是这个烧录在硬件里的特性给了很多人一个直观想象既然网卡是从生产线上一个个做出来的MAC地址为什么不像产品序列号那样按1、2、3、4顺序往下排而是全世界东一个西一个要回答这个问题得先明确一件事在计算机领域物理地址这个词还有另一个含义——操作系统内存管理里的Physical Address物理地址简称PA那是CPU访问内存时用的地址跟网卡的MAC是两个体系。日常讨论家庭网络、路由器、抓包时提到物理地址九成九都是在说MAC。这篇笔记里说的也是MAC。1.2 拆开看一个MAC六组十六进制里藏着身份先把MAC地址的格式讲清楚。常见的MAC是48位的也就是6个字节用十六进制表示成6组每组两位中间用冒号或短横线隔开。比如4C:EA:C3:17:2F:9A共12个十六进制字符。前6个字符3个字节也就是这里的4C:EA:C3叫OUI全称Organizationally Unique Identifier翻译过来是组织唯一标识符。它由电气和电子工程师协会IEEE分配给各个硬件厂商相当于一个厂家的身份证号段。后面的17:2F:9A是扩展标识符由厂商自己在内部编号用来区分同一厂商生产的不同网卡。所以一个MAC地址本质上可以拆成两段看MAC段位长度含义谁分配前3字节OUI24位厂商身份标识IEEE按厂商分配后3字节24位厂商内部产品编号厂商自行处理再深挖一层第一个字节里还藏着两个标志位。以4C为例4C转成二进制是01001100从右往左数最低位bit0是单播/组播标志0代表单播1代表组播倒数第二位bit1是全球/本地管理标志0代表全球唯一1代表本地管理地址。这个细节后面讲为什么MAC能改时还会用到先在这里留个印象。1.3 连续这个疑问到底在问什么弄明白格式再回头看物理地址为什么不能连续这个问题。我发现很多人产生这个疑问都是因为先看到了IP地址的连续再对比MAC的乱序才产生了认知落差。比如你家里路由器是192.168.1.1DHCP一开设备接入后拿到的就是192.168.1.2、192.168.1.3、192.168.1.4……从小到大排得清清楚楚。再看这些设备对应的MAC完全没有规律。这种落差让我意识到问题的本质不是MAC能不能设计成连续的而是谁需要连续连续能给谁带来好处。IP地址的连续是网络规划的人为结果方便路由表聚合。MAC地址的连续没有任何实际收益反而会带来安全隐患。为了把这件事彻底讲透我从MAC的出生流程、二层网络的转发原理、系统隐私策略三个角度一层层拆开看。2. MAC地址的出厂设定连续性在源头就被掐断了2.1 没有全球统一的发号机关怎么连你可能会想身份证号不也是某个发号机关统一发的吗全国几亿人也能做到不乱、能区分地域。为什么全世界几十亿网络设备就不能由一个全球MAC发号中心统一发号让它们连续下去关键在于身份证号的连续性建立在发号机关在每个人出生时才登记这个前提上。MAC地址不行——网卡是在世界各地无数工厂流水线上生产的时间、地点、品牌完全不同。要让所有MAC连续需要满足两个条件第一全世界所有网卡生产商必须在同一套号段体系里协作。某厂商今天生产的100万片网卡用了号段A明天另一个规模小得多的厂商也在这个号段附近生产两家必须同步协调出厂的先后顺序。第二这个发号机关必须在每一块网卡出厂那一瞬间就知道它是全球第几块并把对应号码写进硬件。稍有延迟或偏差后面所有号都会错位。现实是IEEE只负责给厂商统一分配前24位的OUI后24位完全放权给厂商自己处理。全球几百上千家网卡厂商各自手里握着若干OUI号段各烧各的号这就像每个省份各自发各自的身份证号段但省与省之间从不约定号码先后顺序。跨厂商之间根本不存在建立全局连续序号的机制。2.2 厂商拿到号段后按批次和产品线乱用就算不考虑全局连续单看一家厂商内部的MAC也很难连起来。厂商从IEEE手里申请到OUI之后后24位并不是简单地从0开始数到1600万。厂商要同时做有线网卡、无线网卡、蓝牙模块、物联网芯片不同的产品线、不同的代工厂、不同的出货批次都在各自的流程里烧录MAC。同一批烧录的MAC地址可能一部分装进了某品牌笔记本一部分发往东南亚的模组厂还有一部分直接嵌进智能家居芯片。物理位置上完全天南海北。更现实的还有代工问题。A品牌的网卡可能是B代工厂产线上做的B代工厂同时也在给C、D品牌代工。代工厂从不同厂商的OUI池里拿号段烧录时按物料批次管理拿到哪段烧哪段。这么一圈下来OUI相同的前24位对应的后24位完全是离散的。2.3 网卡和电脑不是绑定生产的连续没有载体还有一个更直白的原因网卡和电脑根本不是一一绑定出厂的。台式机的独立网卡是单独生产的装机的时候抽哪块插哪块。笔记本的板载网卡虽然焊在主板上但主板也不是按全世界第几台笔记本来生产的。网卡厂商只知道这批货发走了不知道它最后会装进谁家的电脑更不知道这台电脑在用户手里会配什么路由器、连什么网。所以连续这个概念根本就没有载体。我们之所以觉得应该连续是因为潜意识里把MAC当成了一串给电脑编号的流水号。但实际上MAC只是硬件自己在制造时获得的一个身份标识它不登记、不备案、不跟着电脑走。一台电脑换块网卡MAC就变了跟这台电脑排行第几毫无关系。3. 二层网络靠查表干活连续对MAC本来就没什么用3.1 交换机眼里的MAC端口和地址的一一对应表如果说以上是从生产端解释MAC为什么连续不了那接下来从使用端解释就算能连也没必要。交换机工作在二层它的核心任务是在局域网内转发数据帧。交换机内部维护一张MAC地址表记录的是某个MAC地址对应哪个端口、属于哪个VLAN。当一台设备接入交换机交换机收到它的第一个数据帧时会把源MAC记下来绑定到对应端口。以后所有发往这个MAC的数据帧交换机只需要查这张表从对应端口送出去就行。这里的关键是交换机查询MAC地址表用的是精确匹配。也就是说给出一串48位的MAC能查到就转发查不到就泛洪广播到除了入口外的所有端口。这个查找过程不看地址范围、不做连续段判断地址是00:00:00:00:00:01还是00:50:56:C0:00:08对交换机来说没有任何差别——都是一串需要精确索引的键值。有人可能会问路由器查路由表不是可以按前缀匹配吗比如192.168.1.0/24这样一个网段代表从192.168.1.1到192.168.1.254的所有地址没错但那是三层的路由聚合用的是IP地址的网络前缀。二层交换机面对的是MAC地址它没有任何网段前缀的概念。既然转发不靠范围MAC连续不连续就毫无意义。3.2 IP能连续是因为路由需要聚合现在反过来看IP地址为什么会被设计成看起来连续。IPv4地址由网络号和主机号两部分组成路由器在转发时记住的是网段而不是每一台设备。一个数据包要发往192.168.1.57路由器看到目的地属于192.168.1.0/24这个网段直接查一条下一跳记录就完事了。如果IP地址不连续、东一个西一个路由器就没法做前缀聚合只能给每台设备分别记一条路由。那全球几百亿终端设备每条路由都单独记账路由器内存再大也不够用。所以IP的连续本质上是可聚合、可路由的代价和好处。你可以这样体会IP地址的连续是一种逻辑规划它建立在网络按拓扑分层的基础上。一个家庭局域网用192.168.1.0/24另一个办公室用10.10.0.0/16规划者可以自由决定哪段网给哪片区域再由DHCP或者人工配置实现地址的有序发放。这种连续是可以事后调整、可以做聚合的。MAC地址则完全相反。它跟网络拓扑没有任何关系路由器不会因为这两台设备MAC挨得近就让它们走同一条路。既然路由和转发逻辑都不需要连续的MAC段那MAC就没有任何理由追求连续。3.3 平面地址和层次地址两种截然不同的设计哲学往深了说这其实是两种地址设计哲学的对立层次地址和平面地址。IP地址是层次地址结构是网络号主机号。它描述的是这台设备在网络拓扑中的位置所以需要按照网络结构来规划分配分配得越有层次路由器表项越精简。城市里的门牌号也是这个逻辑先说明哪条街再说明几号找起来快。MAC地址是平面地址结构是厂商号产品号。它描述的是这块硬件是谁做的不关心这个设备在哪里、属于哪个网络。就像人的指纹指纹能唯一确认一个人但指纹上没有任何信息能告诉你这个人住在哪个城市。同理MAC能唯一标识一台设备的网卡但它本身不代表任何网络位置信息。平面地址和层次地址没有谁优谁劣。MAC的平面特性让它在二层转发时无需任何网络规划就能工作——插上电、连上线交换机自动学习数据就通了。为了连续而给MAC引入层次结构反而会让它失去这种即插即用的灵活性。所以从设计角度来说MAC不连续不仅不是缺陷反而是它最大的优点。4. 现实中MAC又像流水号又乱序还不止是出厂一个原因4.1 同品牌扎堆号段但后24位互相不认识你在局域网里观察一圈其实会发现MAC地址并不是完全乱它有自己的一套局部规律同品牌的设备前24位往往一致不同品牌的设备前24位截然不同。这个规律在路由器管理界面里非常明显。比如家里有一台某品牌手机、一台该公司的手环两台设备的前6位十六进制字符可能完全相同后面那6位则是八竿子打不着——一个像A3:F2:11另一个像08:77:66。这是因为手机和手环虽然都是同一家公司生产但属于不同的产品线后24位的扩展标识符按不同产品序列烧录互不关联。这种前段有规律、后段无规律的结构给了很多人一种好像有点连续又怎么也连不上的错觉。如果你去查一下OUI数据库IEEE官网和各厂商的OUI查询工具都能查会发现一屋子的网络设备来自几十个不同的OUI号段有的号段代表无线路由器厂商有的号段代表网卡芯片厂商有的号段是某些物联网方案商独占的。整个局域网里的MAC地址就像几十个厂商各自保留的私密档案在开会谁也接不上谁的号。4.2 系统自带的随机MAC亲手打碎了连续感除了出厂的号段分散近几年还有一个重要的推手让MAC地址看起来更加不连续隐私保护下的MAC随机化。过去智能手机连接Wi-Fi时用的是网卡硬件里那个真实的MAC也就是全球唯一物理地址。这就带来一个隐私问题——你走到商场的任何一个角落商场Wi-Fi探针都能通过唯一的MAC识别出是你这个特定的人。为了解决这个问题2017年之后主流操作系统陆续默认开启了随机MAC功能。操作系统机制效果Android 10及以上默认对每个新连接的Wi-Fi随机生成一个MAC同一手机连不同Wi-Fi显示不同MACiOS 14及以上私有无线局域网地址默认开启同一手机在不同AP显示不同MACWindows 10/11可在Wi-Fi属性中开启随机硬件地址每次连接可随机或按网络固定随机这个随机MAC是怎么生成的不同系统策略不一样有的保持OUI不变、只随机后面24位有的连OUI也一起伪造。但不管哪种策略结果都是同一个设备的MAC今天可能是A4:5D:36:xx:xx:xx明天换一个网络就变成12:34:56:xx:xx:xx了。从连续的角度看这无疑是釜底抽薪。本来厂商出厂时的MAC就够乱了现在系统还在网络层上面叠加一层随机化把本来就不存在的连续感进一步打碎。现在你去路由器后台看设备列表那一堆MAC地址的来源可能包括真实物理MAC、系统随机生成的MAC、厂商出厂前测试用的遗留号码。你看到的乱是多方因素叠加的结果。4.3 厂商故意不连续烧录防的是克隆和预测还有一个很多人不知道的原因厂商是故意不让MAC有规律的。早些年有些网卡厂商图省事后24位直接按生产顺序递增烧录。结果发现这样烧出来的MAC太容易被预测了。攻击者只要拿到一块同品牌网卡的MAC顺着号段往后猜就能推测出同一批次其他网卡的MAC。在某些需要MAC白名单鉴权的网络里这种可预测性等于给攻击者发了一张通行证——猜出MAC就能伪造。所以现在稍微讲究一点的厂商烧录MAC时都有意打乱顺序再辅以随机化手段让后24位看不出生成规律。有些无线模块甚至直接用硬件随机数生成器来产生扩展标识符让每一块网卡的MAC在出厂那一刻都是天注定而不是顺序排的。这里就形成了一个很有意思的结论如果要求MAC连续等于要求它可预测要求它可预测就等于给伪造MAC开了一扇大门。所以不只是没必要连续而是为了安全必须不连续。5. 既然出厂固定改物理地址又是怎么实现的5.1 MAC能改的底层原因本地管理地址的覆盖机制讲到这很多人自然会联想到那个网络热词——电脑改物理地址。不是说MAC是烧死在硬件里的吗为什么还能改这个问题的答案藏在前面提到的那个标志位里。MAC地址第一个字节的bit1叫本地管理位Locally Administered Address简称LAA。当这个位为0表示这个MAC是全球统一管理的也就是厂商烧录的全球唯一UAA当这个位为1表示这是一个本地管理地址由软件临时指定的不保证全球唯一。操作系统和网卡驱动提供了这样一个覆盖机制网卡硬件里确实烧录了一个出厂MAC但在初始化时驱动允许协议栈指定一个用户自定义MAC来替代硬件里的原始值。只要这个替代值满足48位格式、且本地管理位被置1网卡就会以这个自定义MAC工作。所以改物理地址并不是真的改写芯片里的原始数据而是软件在驱动层面戴了一张面具。这在技术上是很常规的操作厂商自己也在用——很多路由器、软路由的克隆MAC功能原理就是这个。5.2 三个系统里改物理地址的实操路径各操作系统都提供了改MAC的入口挑最常见的三个平台说一下Windows系统最简单。打开设备管理器找到网络适配器右键网卡选属性切到高级选项卡在属性列表里找到网络地址或者Network Address、有的显示Locally Administered Address。把右侧的值改成不存在或空白之外的任意12位十六进制数比如001122334455确定后禁用再启用网卡或者重启一下ipconfig /all里就能看到新地址了。macOS稍微绕一点需要在终端里操作。先执行ifconfig en0 | grep ether看一眼现有MAC然后执行sudo ifconfig en0 ether aa:bb:cc:dd:ee:ff改完把Wi-Fi关了重开或重启网卡即可。Linux用ip命令就能搞定。先ip link show找到网卡名再执行sudo ip link set dev eth0 address aa:bb:cc:dd:ee:ff注意改完要把网卡重新加载一下通常执行sudo ip link set dev eth0 down和up各一遍就生效。这三种路径有个共同的要点你填写的地址必须以偶数开头也就是说第一个字节的bit0要置0表示单播地址否则网卡可能不认。很多教程没说这一点实际改的时候容易踩坑。5.3 改MAC的典型场景与合规边界改MAC最典型的场景是这几个换了新路由器原来网关绑定了旧网卡的MAC做白名单过滤不想改路由器配置就直接把新网卡的MAC临时改成旧的一些软件的授权和设备型号绑定在一起换网卡后授权失效临时改MAC能解决激活问题还有些人做网络调试需要让测试设备看起来像另一个设备通过改MAC来模拟端到端行为。改动物理地址是一项中性且常见的技术能力。不过这里必须提醒一句修改MAC的技术本身没问题但使用场景要有边界。如果是你自己管理的设备、自己的网络改MAC解决兼容性或调试问题完全合理合法。但不要拿它去绕过别人网络的访问控制更不要用于伪造身份、恶意伪装这类行为违反网络安全相关规定。我个人的建议是改MAC只用来解决自己可控环境里的问题别把思路往钻空子上引。还有一个衍生的实用技巧既然本地管理位是判断这个MAC是不是被改过的关键你只需要看MAC的第一个字节。如果这个字节化成二进制后bit1为1基本可以判定这不是原生全球唯一地址而是软件覆盖出来的。这个判断在排查网络安全问题时很好用——某台设备显示了一串很可疑的MAC先看它是否以02、06、0A、0E这类偶数开头的本地管理地址如果是那它的真实身份就值得进一步确认。搞清楚这几个层次之后我自己对物理地址为什么不能连续这件事总算放下了。它烧录在芯片里却没有全局发号机关按顺序发号它工作在二层网络上转发时精确定位、不需要地址段聚合它还要面对隐私随机化、防克隆这样的现实压力。综合来看MAC地址的意义从来就不是连续而是唯一、独立、不可预测。下次再看到路由器后台那堆乱糟糟的MAC你知道该怎么跟别人解释它们为什么长这样了。