很多人学计算机网络都有过这么一段拧巴的经历:CSMA/CD、交换机、VLAN,单个拎出来都能说上两句,可真要往深里问一句"这三者到底是怎么演过来的、为什么局域网最终长成了现在这个样子",就卡壳了。不怪你。教材是分章讲的,考试是分开考的,但真实网络不是按章节长的。我在实际项目里维护过几十台交换机的办公网,也帮人排过不少"明明交换机都通了但就是互访不了"的诡异问题,最后发现根子往往就出在CSMA/CD、交换机转发逻辑、VLAN标签这三样基础东西没串成一条线。这篇是计网全栈通关系列的第4篇,我打算换个讲法——不按教材目录走,而是按"局域网是怎么从一根线长成一张网"的顺序,把CSMA/CD、交换机原理、VLAN实战掰开揉碎了串起来讲。看完你会比很多人强的一点是:你不只是知道它们是什么,而是知道它们为什么存在、在什么场景下会被触发、排障时该往哪个方向想。如果你是正在啃计网的学生、准备面试的求职者,或者刚接手公司网络想系统补课的新网工,这篇都值得花二十分钟读到底。1. 从一根同轴电缆说起:CSMA/CD 到底解决了什么1.1 早期以太网为什么非要"抢信道"你要理解CSMA/CD,先得忘掉现在的交换机,回到上世纪八十年代那种最原始的以太网:一根同轴电缆,把所有电脑像串糖葫芦一样串起来。每台电脑要发数据,信号就在这根电缆上双向传播,传给谁不重要,反正全线上所有人都能听到。这就有个致命问题:这根电缆是共享的,同一时刻只允许一个设备开口说话,两个设备同时发信号,电气信号就会在电缆上叠加、扭曲,变成谁也读不懂的乱码。当时的解决思路非常粗暴,跟一屋子人开会没有话筒一样——靠自觉,商量着来。这个"商量"的规矩就是CSMA/CD。全称Carrier Sense Multiple Access with Collision Detection,翻译成人话就是:说话前先听,边说我边听,要是发现有人跟我同时说话了,我就闭嘴,等会儿再试。这套规矩在拓扑层面叫"多路访问",所有设备共享同一个传输介质;在行为层面靠"载波监听"和"冲突检测"两条腿走路。说白了,CSMA/CD解决的就是一个"多人抢一根线"的秩序问题。1.2 四个步骤:先听后发、边发边听、冲突停止、随机退避CSMA/CD的工作流程可以拆成四步:先听后发:发送前先监听信道。如果电缆上有其他设备的信号(载波),就退避等待,直到信道空闲;如果空闲,才发送数据。边发边听:发送的同时继续监听。因为信号在电缆上有传播延迟,你开始发送时信道是空的,不代表远端设备没有同时开始发送,必须边发边验证。冲突停止:一旦检测到信号电平异常(两个信号叠加后电压翻倍或波形畸变),立刻停止发送,然后发送一个阻塞信号(jamming signal),通知全线上所有设备"刚才冲突了"。随机退避:冲突发生后,各设备不能立刻重发,否则大概率再次撞车。以太网采用截断二进制指数退避算法:冲突第n次时,从[0, 1, ..., 2^n-1]中随机取一个数k,等待k×512比特时间后再重发。n超过10之后不再增大随机范围,重试到16次则放弃并向高层报错。这里面最容易被忽略的细节是:CSMA/CD发数据根本不需要握手机制,发完就发完了,靠的是"冲突了我就知道刚才那包白发了"这种事后纠错逻辑。所以它是个典型的"尽力而为"协议,可靠性不靠它保证。这套规矩在10BASE5粗缆、10BASE2细缆时代是核心命脉,在后面的10BASE-T双绞线时代,虽然物理拓扑从总线变成星型,但集线器(Hub)把内部所有端口绕成了一根逻辑总线,CSMA/CD依然照常工作。直到交换机普及,它才从一线退居幕后。1.3 最小帧长64字节:一个被忽视但极其关键的数字讲CSMA/CD,有个数字必须单独拿出来说:以太网帧的最小长度是64字节。很多教材把它列为一个"记背点",但它背后其实藏着一个硬核的物理约束。冲突检测之所以能成立,前提是你必须在发送完一个帧之前,探测到冲突。设想一个极端情况:A设备在电缆一端发送数据,信号还没传到电缆另一端的B设备时,B以为信道空闲、也开始发送数据,这时冲突点在靠近B的位置形成。B能立刻感知,但A要等冲突信号传回A端才知道"我冲突了"。如果A已经把整个帧发完了,冲突信号才传回来,A会误以为发送成功——这叫作"late collision",是CSMA/CD根本无法可靠处理的场景。所以协议设计了一个基本要求:一个帧的发送时间必须大于信号在全线上往返一趟的时间。在10Mbps以太网上,64字节帧的发送耗时是(64×8) ÷ 10Mbps = 51.2微秒,这个值正好被用来约束冲突域的最大直径。换句话说,64字节不是拍脑袋定的,它是物理链路长度和传输速率之间博弈出来的结果。注意:后来千兆以太网在半双工模式下之所以要引入"载波扩展"机制,把最小发送时间强行撑到512字节的耗时,也是因为速率高了以后,64字节帧瞬间就发完了,再按老规矩无法保证冲突检测窗口。这反过来证明:CSMA/CD的整个体系,天生是为低速共享介质设计的。2. 交换机凭什么取代集线器:冲突域终结与MAC学习2.1 集线器时代所有人挤在一个冲突域理解了CSMA/CD,你才能理解交换机的出现到底解决了什么。集线器(Hub)是一种物理层设备,它做的事情很简单:从一个端口收到的信号,从所有其他端口原样广播出去,内部电路再帮你把多端口串成一根逻辑总线。所以Hub组网时,哪怕物理上是星型拓扑,逻辑上跟老同轴电缆一模一样——整个网络都在同一个冲突域里,所有端口共享带宽,任何两台设备同时通信就会碰撞。于是10BASE-T时代就出现了一个很滑稽的场景:公司买了台Hub,几十台电脑往上一插,看起来挺现代,结果一到下午高峰期网络就卡成PPT。因为大家都在抢那10Mbps共享带宽,邮件附件一发,全楼瘫痪。2.2 交换机的看家本领:MAC地址学习与转发决策交换机是个二层设备,它干的事和Hub有本质区别:它不无脑广播,而是先学后转。每台交换机内部维护一张MAC地址表,也叫转发表,记录着"哪个MAC地址在哪个端口、属于哪个VLAN、多久前学习到的"。这张表不是配置出来的,是交换机自己学出来的,整个学习过程叫自学习:当一个帧从某个端口进来,交换机先提取源MAC地址,把它和入端口、入端口所属VLAN绑定,写入MAC地址表。如果表里已有该MAC但端口变了,就更新——说明设备可能被挪到别的端口了。然后再提取目的MAC地址,去MAC地址表里查。查到了,就从对应端口转发;查不到,就从除了入端口以外的所有端口泛洪出去,等对方回包后再学习它的位置。问题来了:交换机到底靠什么判断"该从哪个端口转出去"?答案就是这张MAC表。它不是靠IP地址,因为二层转发根本不管IP;它也不做任何计算和路由决策,只是纯粹的查表动作。这也是为什么交换机转发效率极高——查表这件事,硬件芯片就能完成。MAC地址表不是永久保留的。默认情况下,一个MAC条目如果在老化的几百秒内没有再产生过流量,就会被清掉,下次重新学习。这样设计是合理的,因为终端在移动、服务器在更换、网络拓扑在变化,如果MAC表永久不变,网络就等于失去自适应性。2.3 先搞清楚交换机的五种转发行为你把MAC地址表学会了,交换机的大部分转发行为就都能解释了。实际工作中,一个帧到达交换机端口,可能的处理结果就下面五种:行为触发条件处理方式已知单播转发目的MAC在转发表中,且出端口与入端口不同从匹配端口单播转发未知单播泛洪目的MAC不在转发表中从所有其他端口泛洪广播转发目的MAC为全F(FF-FF-FF-FF-FF-FF)从所有其他端口泛洪组播转发目的MAC为组播地址按IGMP Snooping或泛洪处理丢弃出端口与入端口相同,或帧错误(CRC错、runt帧)静默丢弃这里有两个特别容易混淆的点。第一个是"广播也会泛洪"。很多新手以为泛洪是查不到表才做的事,其实广播帧因为根本不查表,它的语义就是"发给所有人"。所以不管是广播帧还是组播帧,交换机默认都会泛洪。第二个容易踩坑的是:如果目的端口查出来跟入端口是同一个,交换机会直接丢弃。什么场景会出现这种情况?两台设备其实接在同一个端口的下级设备上,比如一个端口下面串了一台Hub或者傻瓜交换机。发给同侧设备的帧回流到同一端口,交换机一看"出端口等于入端口",就不会把它从原来的口再发回去,直接扔了。还有一种更常见的场景是交换机环路。比如一个帧从端口1进来、广播泛洪到端口2,对端交换机又从端口2把它泛洪回来,交换机必须通过生成树协议(STP)把冗余链路变成阻塞状态,否则广播帧会在环路里无限循环,形成广播风暴,瞬间打垮整台设备。很多经典网络故障,最终查到根上都是"环路没堵住"。2.4 存储转发与直通转发:延迟和校验的取舍交换机转发帧的方式,市面上主要有两种,选型时值得知道。存储转发(Store-and-Forward)是现在绝大多数企业级交换机的默认模式。帧进来之后,交换机先把整个帧收完整、校验CRC无误,才去查表转发。好处是能过滤掉大量不完整帧和冲突产生的碎片帧,坏处是有一定延迟——帧有多大,就得多等多久。直通转发(Cut-through)则只读取目的MAC地址的前几个字节就开始转发,延迟极低,但它完全不校验帧的完整性,坏帧也会被原样转发出去,浪费下游带宽。这种模式通常出现在追求极致低延迟的高性能计算场景,不是我们普通办公网的常态。实操提示:如果是在旧设备或远程链路上去排查"为什么网速不对",先确认对方协商到的双工模式。早期大量网络性能故障,根因都在于网卡或端口被强制成了半双工,导致CSMA/CD的监听逻辑被重新激活,冲突剧增、丢包严重。教训就一句话:全双工模式下不要手动锁半双工,自动协商的可靠性远高于人为指定。3. 交换机做不到的事:广播域失控与VLAN的诞生逻辑3.1 冲突域变小了,广播域却还是那么大交换机把冲突域从"整个网络"缩小到了"每个端口一个",局域网终于不用再一群人抢一根线了。但新的问题随之浮出水面:冲突域解决了,广播域还在野蛮生长。所谓广播域,就是广播帧能传达到的最大范围。交换机对广播帧的处理是"来一个泛洪一个",所以只要交换机之间互联,广播域就会把所有端口全部包进去。你想象一下公司有500台电脑都在同一个VLAN里,任何一台机器发一个ARP广播请求,全楼500个端口都会收到,每台设备都要拆开帧看一看是不是找自己的。更致命的是,某台设备的网卡故障或者中了恶意软件,疯狂发包,广播流量就会像洪水一样灌满所有端口和链路,导致全公司网络瘫痪。这种故障见过一次就有阴影了,整个网络看起来"通了",但什么都慢,抓包一看全是广播泛洪。要拆掉这个炸弹,思路和"把冲突域切小"是一样的:给广播域也装上隔断。这个隔断就是VLAN,虚拟局域网。3.2 802.1Q标签:给帧打上一张"身份证"一台交换机物理上只有24口,划了VLAN之后,它逻辑上就被拆成了好几台"虚拟交换机"。端口1-10属于VLAN 10,端口11-20属于VLAN 20,它们之间互不可见,广播帧在自己VLAN内泛洪,绝不会跑到别的VLAN去。但随之而来一个问题:在和线下一个标准的以太网帧里,并没有字段能标记"我是哪个VLAN的"。于是IEEE 802.1Q标准在帧头里插入了4个字节的VLAN标签:TPID(Tag Protocol Identifier):固定值0x8100,让交换机识别"这是个带标签的帧"。TCI(Tag Control Information):包含3位优先级、1位丢弃指示、12位VLAN ID。VLAN ID的12位决定了它最大只能到4095,去掉0和4095两个保留值,实际可用范围是1到4094。这也是为什么你经常看到"VLAN 4094"这种极限用法——再大就没有了。帧被打上标签后,转发时就不再是"无差别广播",而是变为:接收方交换机先拆开帧看VID,如果这个VLAN的成员在本地某个端口,就转发到该端口;如果本地没有,就从Trunk口继续往下游传。VLAN隔离的关键,就在于每个帧身上都带了一张可以查验的"身份证"。3.3 Access口与Trunk口:边缘和干道的分工理解了VLAN标签,你就能理解交换机端口为什么分Access和Trunk两种模式。两种端口解决的是两件完全不同的事:终端接入和交换机互联。从最终用户视角看,我们的电脑网卡发出来的以太网帧是"裸"的,没有打802.1Q标签。所以交换机接终端的端口,必须做成Access口:让这个端口归属到某个VLAN(用PVID来声明),从终端收到的无标签帧自动按PVID归属到对应VLAN,转发给终端时再把标签剥掉,还原成裸帧。一句话——Access口负责"外剥内套"。而交换机与交换机之间的链路,经常要同时承载多个VLAN的流量,这就得用Trunk口。Trunk口不归属于任何VLAN,它允许多个VLAN以带标签的形式通过。两边交换机先在Trunk链路上指定放行哪些VLAN,再约定一个Native VLAN——Native VLAN的帧在Trunk上不打标签,其余VLAN全部打标签。小心点:Trunk口协商错误导致的故障,占VLAN相关排查的一大半。最常见的就是两端Native VLAN不一致,或者Trunk配置了但没有放行某个VLAN,导致"别的VLAN全通,就这个VLAN不通"。4. VLAN实战:从规划到验证的完整配置过程讲到这里,原理都有了,我们上手做一遍完整配置。我用一个虚构的A公司办公网场景来演示,拓扑很简单但足够还原真实工作中的关键步骤:两台接入交换机,名称就叫SW1和SW2,每台划两个VLAN——VLAN 10给办公终端,VLAN 20给研发终端。SW1和SW2之间用一条Trunk链路互联。4.1 拓扑规划与VLAN划分分工如下:设备端口用途VLANSW1F0/1 - F0/5办公终端接入VLAN 10SW1F0/6 - F0/10研发终端接入VLAN 20SW2F0/1 - F0/5办公终端接入VLAN 10SW2F0/6 - F0/10研发终端接入VLAN 20SW1-SW2G0/1 互联交换机间Trunk放行VLAN 10、20从左到右,规划的思路是:先确定VLAN的数量和用途,再确定哪些端口属于哪个VLAN。规划比配置重要,因为后期改划分比一开始规划好要痛苦得多——所有终端的IP、网关、访问控制策略都跟着VLAN走。4.2 接入交换机配置步骤详解以主流企业级交换机的通用命令行风格为例(不同品牌细节有差异,思路一致):# 在SW1上创建VLAN vlan 10 name Office vlan 20 name R&D # 配置F0/1 - F0/5为Access口,归属VLAN 10 interface range f0/1 - f0/5 switchport mode access switchport access vlan 10 # 配置F0/6 - F0/10为Access口,归属VLAN 20 interface range f0/6 - f0/10 switchport mode access switchport access vlan 20 # 配置G0/1为Trunk口,并指定放行VLAN interface g0/1 switchport mode trunk switchport trunk allowed vlan 10,20SW2上做同样的配置,唯一不同的是别忘记在Trunk口上也放行VLAN 10和20。三步操作里最值得解释的是最后那行。很多人会以为配了Trunk口就万事大吉,其实Trunk默认只放行本征VLAN(默认VLAN 1),你新建的VLAN 10和20如果不单独加上去,跨交换机的VLAN流量根本过不去。这个坑我见过不知道多少次了。4.3 验证命令与输出解读配置完了,别直接拍屁股走人,用验证命令确认一切正常:show vlan brief这个命令会列出当前交换机上所有VLAN、名字和成员端口。如果看到F0/1-F0/5都在VLAN 10下面、F0/6-F0/10都在VLAN 20下面,说明Access口划分正确。show interfaces trunk这个命令检查Trunk链路状态。重点关注Port列为G0/1的那一行,Allowed VLAN列应该显示10,20,而不是默认的1或all。show mac address-table查看MAC地址表,确认SW1已经学习到了各个终端设备的MAC,并且正确关联到了对应VLAN和端口。我第一次搭实验环境时,吃完这三个命令的输出,才算真正理解"VLAN标签只在Trunk上存在"这句话的含义——你在Access口看到的全是裸帧,在Trunk口上才能抓包抓到带0x8100标签的帧。4.4 最容易翻车的三个配置错误把整套VLAN配置跑熟之后,回头再看,有三个错是新手必踩的,也是面试官最爱挖的坑。第一个:Access口PVID配错。终端接到交换机端口上,端口VLAN归属配成10,但终端的IP地址其实是VLAN 20网段的,二层通了、三层网关不同网段,怎么都不通。这种问题的特征极其迷惑——两个终端明明在同一个Access口下面,却互相ping不通。第二个:Trunk列表漏放行。跨交换机的VLAN 20通不了,排查半天抓包发现SW1和SW2之间的Trunk根本没让VLAN 20的标签通过。解决办法就是上面说的,显式地加上switchport trunk allowed vlan。第三个:Native VLAN两端不一致。Trunk链路上Native VLAN的帧不打标签,如果一端Native VLAN是1、另一端被改成2,两边对无标签帧的归属判断就会错乱,轻则部分流量转发异常,重则两个VLAN被意外"打通"。改Native VLAN属于高危操作,没搞清楚后果前不要动。实战建议:排VLAN相关故障,不要凭感觉猜,先抓包,再看配置。抓包时在Trunk口上能看到802.1Q标签,在Access口看不到,这一眼就能判断是标签问题还是转发问题。确定链路层没问题,再去核对IP和网关,故障范围立刻缩小一半。5. 一条帧的完整旅程:从MAC学习到VLAN转发的联合验证5.1 场景一:同交换机、同VLAN内通信现在我们把之前所有知识点连起来跑一遍。终端A(接在SW1的F0/1口,VLAN 10)要给终端B(接在SW1的F0/2口,VLAN 10)发数据。第一步,A先发ARP请求找B的MAC地址。这个广播帧进入F0/1口,交换机发现它是无标签帧,根据端口的PVID把它归入VLAN 10,并学习到"A的MAC在F0/1口、属于VLAN 10"。因为是广播帧,交换机把它从所有VLAN 10的成员端口(排除F0/1)泛洪出去。B收到后回ARP应答,交换机又从应答中学习到"B的MAC在F0/2口、属于VLAN 10"。接下来A正式发送数据帧时,交换机查表直接命中:目的MAC对应F0/2口,转发。这个过程中交换机从头到尾没看IP地址,只做MAC查表,两次ARP之间完成了MAC地址表的自学习,后面所有同VLAN通信都是纯查表转发。5.2 场景二:跨交换机、同VLAN通信终端A(接SW1)要跟终端C通信,但C接在SW2上,属于同一个VLAN 10。A发的帧到达SW1后,SW1查MAC表发现C不在本地端口上,于是从G0/1 Trunk口转发出去。转发前,802.1Q标签已经加在帧头上了——VLAN ID填10。SW2从G0/1口收到这个带标签帧,一看VID=10,查自己的MAC表,发现C接在F0/2口,于是转发到F0/2口并剥掉标签,C收到一个干净的无标签帧。这就是跨交换机VLAN通信的全部真相:交换机间Trunk链路上流转的是"打了VLAN标签的帧",而终端永远只看到无标签帧。如果这个过程中SW1的MAC表里没有C,SW1会直接从Trunk口泛洪带标签帧,SW2收到后再在自己的VLAN 10内泛洪,最终C回包后,两边的MAC表都学全了。5.3 场景三:跨VLAN通信为什么必须经过三层VLAN 10和VLAN 20之间的二层帧,交换机是绝不会直接转发的,因为VLAN标签都不同,隔离是硬性的。但现实中办公的同事和研发的同事肯定要互通,怎么办?答案是一切跨VLAN通信都必须经过三层设备。最常见的做法是在核心交换机或三层交换机上给每个VLAN创建一个VLANIF接口(也叫SVI,交换虚拟接口),配好网关地址,让交换机本身就充当VLAN间路由。终端把网关设成自己VLAN的VLANIF地址,跨VLAN的流量先到网关,由三层设备查路由表后,从另一VLAN的VLANIF接口重新封装二层帧,再从对应Access口发给目标终端。这个过程给我们一个非常重要的判断标准:VLAN隔离的是二层广播域,不是网络连通性。跨VLAN要通,必须规划IP网段、网关、路由;VLAN本身不会阻断三层路由,阻断的只是二层广播和直连。很多人在规划VLAN时容易犯的一个错误,是把VLAN和网段、子网之间的关系搞乱。VLAN是二层概念,IP网段是三层概念,两者通常一一对应,但不是天生的绑定关系。你在同一个VLAN里可以配两段不同网段的IP(能二层互通但三层要额外配),也可以让不同VLAN共用一段IP(别这么干,排障时你会想打人)。我搭实验环境有个习惯,就是每配完一个功能点,马上做一次抓包验证,展开帧头从MAC到VLAN标签一层层看,比自己脑补靠谱得多。学了CSMA/CD的帧结构,再看802.1Q标签插入的位置,你才会真正理解VLAN标签为什么插在源MAC和Type字段之间——因为它要让沿途所有交换机在不拆开帧内容的前提下就能快速识别VLAN,位置越靠前,处理效率越高。最后再分享一条我自己的体会:局域网这三板斧——CSMA/CD、交换机、VLAN——看着是三个独立知识点,其实是一条逻辑链上的三个环节。它们对应的是网络演进过程中的三次核心矛盾:共享介质的碰撞矛盾、冲突域过大造成的性能矛盾、广播域失控带来的隔离矛盾。每次遇到新网络问题,先想清楚问题出在哪个矛盾上,排障思路会比别人快一大截。
很多人学计算机网络都有过这么一段拧巴的经历:CSMA/CD、交换机、VLAN,单个拎出来都能说上两句,可真要往深里问一句"这三者到底是怎么演过来的、为什么局域网最终长成了现在这个样子",就卡壳了。不怪你。教材是分章讲的,考试是分开考的,但真实网络不是按章节长的。我在实际项目里维护过几十台交换机的办公网,也帮人排过不少"明明交换机都通了但就是互访不了"的诡异问题,最后发现根子往往就出在CSMA/CD、交换机转发逻辑、VLAN标签这三样基础东西没串成一条线。这篇是计网全栈通关系列的第4篇,我打算换个讲法——不按教材目录走,而是按"局域网是怎么从一根线长成一张网"的顺序,把CSMA/CD、交换机原理、VLAN实战掰开揉碎了串起来讲。看完你会比很多人强的一点是:你不只是知道它们是什么,而是知道它们为什么存在、在什么场景下会被触发、排障时该往哪个方向想。如果你是正在啃计网的学生、准备面试的求职者,或者刚接手公司网络想系统补课的新网工,这篇都值得花二十分钟读到底。1. 从一根同轴电缆说起:CSMA/CD 到底解决了什么1.1 早期以太网为什么非要"抢信道"你要理解CSMA/CD,先得忘掉现在的交换机,回到上世纪八十年代那种最原始的以太网:一根同轴电缆,把所有电脑像串糖葫芦一样串起来。每台电脑要发数据,信号就在这根电缆上双向传播,传给谁不重要,反正全线上所有人都能听到。这就有个致命问题:这根电缆是共享的,同一时刻只允许一个设备开口说话,两个设备同时发信号,电气信号就会在电缆上叠加、扭曲,变成谁也读不懂的乱码。当时的解决思路非常粗暴,跟一屋子人开会没有话筒一样——靠自觉,商量着来。这个"商量"的规矩就是CSMA/CD。全称Carrier Sense Multiple Access with Collision Detection,翻译成人话就是:说话前先听,边说我边听,要是发现有人跟我同时说话了,我就闭嘴,等会儿再试。这套规矩在拓扑层面叫"多路访问",所有设备共享同一个传输介质;在行为层面靠"载波监听"和"冲突检测"两条腿走路。说白了,CSMA/CD解决的就是一个"多人抢一根线"的秩序问题。1.2 四个步骤:先听后发、边发边听、冲突停止、随机退避CSMA/CD的工作流程可以拆成四步:先听后发:发送前先监听信道。如果电缆上有其他设备的信号(载波),就退避等待,直到信道空闲;如果空闲,才发送数据。边发边听:发送的同时继续监听。因为信号在电缆上有传播延迟,你开始发送时信道是空的,不代表远端设备没有同时开始发送,必须边发边验证。冲突停止:一旦检测到信号电平异常(两个信号叠加后电压翻倍或波形畸变),立刻停止发送,然后发送一个阻塞信号(jamming signal),通知全线上所有设备"刚才冲突了"。随机退避:冲突发生后,各设备不能立刻重发,否则大概率再次撞车。以太网采用截断二进制指数退避算法:冲突第n次时,从[0, 1, ..., 2^n-1]中随机取一个数k,等待k×512比特时间后再重发。n超过10之后不再增大随机范围,重试到16次则放弃并向高层报错。这里面最容易被忽略的细节是:CSMA/CD发数据根本不需要握手机制,发完就发完了,靠的是"冲突了我就知道刚才那包白发了"这种事后纠错逻辑。所以它是个典型的"尽力而为"协议,可靠性不靠它保证。这套规矩在10BASE5粗缆、10BASE2细缆时代是核心命脉,在后面的10BASE-T双绞线时代,虽然物理拓扑从总线变成星型,但集线器(Hub)把内部所有端口绕成了一根逻辑总线,CSMA/CD依然照常工作。直到交换机普及,它才从一线退居幕后。1.3 最小帧长64字节:一个被忽视但极其关键的数字讲CSMA/CD,有个数字必须单独拿出来说:以太网帧的最小长度是64字节。很多教材把它列为一个"记背点",但它背后其实藏着一个硬核的物理约束。冲突检测之所以能成立,前提是你必须在发送完一个帧之前,探测到冲突。设想一个极端情况:A设备在电缆一端发送数据,信号还没传到电缆另一端的B设备时,B以为信道空闲、也开始发送数据,这时冲突点在靠近B的位置形成。B能立刻感知,但A要等冲突信号传回A端才知道"我冲突了"。如果A已经把整个帧发完了,冲突信号才传回来,A会误以为发送成功——这叫作"late collision",是CSMA/CD根本无法可靠处理的场景。所以协议设计了一个基本要求:一个帧的发送时间必须大于信号在全线上往返一趟的时间。在10Mbps以太网上,64字节帧的发送耗时是(64×8) ÷ 10Mbps = 51.2微秒,这个值正好被用来约束冲突域的最大直径。换句话说,64字节不是拍脑袋定的,它是物理链路长度和传输速率之间博弈出来的结果。注意:后来千兆以太网在半双工模式下之所以要引入"载波扩展"机制,把最小发送时间强行撑到512字节的耗时,也是因为速率高了以后,64字节帧瞬间就发完了,再按老规矩无法保证冲突检测窗口。这反过来证明:CSMA/CD的整个体系,天生是为低速共享介质设计的。2. 交换机凭什么取代集线器:冲突域终结与MAC学习2.1 集线器时代所有人挤在一个冲突域理解了CSMA/CD,你才能理解交换机的出现到底解决了什么。集线器(Hub)是一种物理层设备,它做的事情很简单:从一个端口收到的信号,从所有其他端口原样广播出去,内部电路再帮你把多端口串成一根逻辑总线。所以Hub组网时,哪怕物理上是星型拓扑,逻辑上跟老同轴电缆一模一样——整个网络都在同一个冲突域里,所有端口共享带宽,任何两台设备同时通信就会碰撞。于是10BASE-T时代就出现了一个很滑稽的场景:公司买了台Hub,几十台电脑往上一插,看起来挺现代,结果一到下午高峰期网络就卡成PPT。因为大家都在抢那10Mbps共享带宽,邮件附件一发,全楼瘫痪。2.2 交换机的看家本领:MAC地址学习与转发决策交换机是个二层设备,它干的事和Hub有本质区别:它不无脑广播,而是先学后转。每台交换机内部维护一张MAC地址表,也叫转发表,记录着"哪个MAC地址在哪个端口、属于哪个VLAN、多久前学习到的"。这张表不是配置出来的,是交换机自己学出来的,整个学习过程叫自学习:当一个帧从某个端口进来,交换机先提取源MAC地址,把它和入端口、入端口所属VLAN绑定,写入MAC地址表。如果表里已有该MAC但端口变了,就更新——说明设备可能被挪到别的端口了。然后再提取目的MAC地址,去MAC地址表里查。查到了,就从对应端口转发;查不到,就从除了入端口以外的所有端口泛洪出去,等对方回包后再学习它的位置。问题来了:交换机到底靠什么判断"该从哪个端口转出去"?答案就是这张MAC表。它不是靠IP地址,因为二层转发根本不管IP;它也不做任何计算和路由决策,只是纯粹的查表动作。这也是为什么交换机转发效率极高——查表这件事,硬件芯片就能完成。MAC地址表不是永久保留的。默认情况下,一个MAC条目如果在老化的几百秒内没有再产生过流量,就会被清掉,下次重新学习。这样设计是合理的,因为终端在移动、服务器在更换、网络拓扑在变化,如果MAC表永久不变,网络就等于失去自适应性。2.3 先搞清楚交换机的五种转发行为你把MAC地址表学会了,交换机的大部分转发行为就都能解释了。实际工作中,一个帧到达交换机端口,可能的处理结果就下面五种:行为触发条件处理方式已知单播转发目的MAC在转发表中,且出端口与入端口不同从匹配端口单播转发未知单播泛洪目的MAC不在转发表中从所有其他端口泛洪广播转发目的MAC为全F(FF-FF-FF-FF-FF-FF)从所有其他端口泛洪组播转发目的MAC为组播地址按IGMP Snooping或泛洪处理丢弃出端口与入端口相同,或帧错误(CRC错、runt帧)静默丢弃这里有两个特别容易混淆的点。第一个是"广播也会泛洪"。很多新手以为泛洪是查不到表才做的事,其实广播帧因为根本不查表,它的语义就是"发给所有人"。所以不管是广播帧还是组播帧,交换机默认都会泛洪。第二个容易踩坑的是:如果目的端口查出来跟入端口是同一个,交换机会直接丢弃。什么场景会出现这种情况?两台设备其实接在同一个端口的下级设备上,比如一个端口下面串了一台Hub或者傻瓜交换机。发给同侧设备的帧回流到同一端口,交换机一看"出端口等于入端口",就不会把它从原来的口再发回去,直接扔了。还有一种更常见的场景是交换机环路。比如一个帧从端口1进来、广播泛洪到端口2,对端交换机又从端口2把它泛洪回来,交换机必须通过生成树协议(STP)把冗余链路变成阻塞状态,否则广播帧会在环路里无限循环,形成广播风暴,瞬间打垮整台设备。很多经典网络故障,最终查到根上都是"环路没堵住"。2.4 存储转发与直通转发:延迟和校验的取舍交换机转发帧的方式,市面上主要有两种,选型时值得知道。存储转发(Store-and-Forward)是现在绝大多数企业级交换机的默认模式。帧进来之后,交换机先把整个帧收完整、校验CRC无误,才去查表转发。好处是能过滤掉大量不完整帧和冲突产生的碎片帧,坏处是有一定延迟——帧有多大,就得多等多久。直通转发(Cut-through)则只读取目的MAC地址的前几个字节就开始转发,延迟极低,但它完全不校验帧的完整性,坏帧也会被原样转发出去,浪费下游带宽。这种模式通常出现在追求极致低延迟的高性能计算场景,不是我们普通办公网的常态。实操提示:如果是在旧设备或远程链路上去排查"为什么网速不对",先确认对方协商到的双工模式。早期大量网络性能故障,根因都在于网卡或端口被强制成了半双工,导致CSMA/CD的监听逻辑被重新激活,冲突剧增、丢包严重。教训就一句话:全双工模式下不要手动锁半双工,自动协商的可靠性远高于人为指定。3. 交换机做不到的事:广播域失控与VLAN的诞生逻辑3.1 冲突域变小了,广播域却还是那么大交换机把冲突域从"整个网络"缩小到了"每个端口一个",局域网终于不用再一群人抢一根线了。但新的问题随之浮出水面:冲突域解决了,广播域还在野蛮生长。所谓广播域,就是广播帧能传达到的最大范围。交换机对广播帧的处理是"来一个泛洪一个",所以只要交换机之间互联,广播域就会把所有端口全部包进去。你想象一下公司有500台电脑都在同一个VLAN里,任何一台机器发一个ARP广播请求,全楼500个端口都会收到,每台设备都要拆开帧看一看是不是找自己的。更致命的是,某台设备的网卡故障或者中了恶意软件,疯狂发包,广播流量就会像洪水一样灌满所有端口和链路,导致全公司网络瘫痪。这种故障见过一次就有阴影了,整个网络看起来"通了",但什么都慢,抓包一看全是广播泛洪。要拆掉这个炸弹,思路和"把冲突域切小"是一样的:给广播域也装上隔断。这个隔断就是VLAN,虚拟局域网。3.2 802.1Q标签:给帧打上一张"身份证"一台交换机物理上只有24口,划了VLAN之后,它逻辑上就被拆成了好几台"虚拟交换机"。端口1-10属于VLAN 10,端口11-20属于VLAN 20,它们之间互不可见,广播帧在自己VLAN内泛洪,绝不会跑到别的VLAN去。但随之而来一个问题:在和线下一个标准的以太网帧里,并没有字段能标记"我是哪个VLAN的"。于是IEEE 802.1Q标准在帧头里插入了4个字节的VLAN标签:TPID(Tag Protocol Identifier):固定值0x8100,让交换机识别"这是个带标签的帧"。TCI(Tag Control Information):包含3位优先级、1位丢弃指示、12位VLAN ID。VLAN ID的12位决定了它最大只能到4095,去掉0和4095两个保留值,实际可用范围是1到4094。这也是为什么你经常看到"VLAN 4094"这种极限用法——再大就没有了。帧被打上标签后,转发时就不再是"无差别广播",而是变为:接收方交换机先拆开帧看VID,如果这个VLAN的成员在本地某个端口,就转发到该端口;如果本地没有,就从Trunk口继续往下游传。VLAN隔离的关键,就在于每个帧身上都带了一张可以查验的"身份证"。3.3 Access口与Trunk口:边缘和干道的分工理解了VLAN标签,你就能理解交换机端口为什么分Access和Trunk两种模式。两种端口解决的是两件完全不同的事:终端接入和交换机互联。从最终用户视角看,我们的电脑网卡发出来的以太网帧是"裸"的,没有打802.1Q标签。所以交换机接终端的端口,必须做成Access口:让这个端口归属到某个VLAN(用PVID来声明),从终端收到的无标签帧自动按PVID归属到对应VLAN,转发给终端时再把标签剥掉,还原成裸帧。一句话——Access口负责"外剥内套"。而交换机与交换机之间的链路,经常要同时承载多个VLAN的流量,这就得用Trunk口。Trunk口不归属于任何VLAN,它允许多个VLAN以带标签的形式通过。两边交换机先在Trunk链路上指定放行哪些VLAN,再约定一个Native VLAN——Native VLAN的帧在Trunk上不打标签,其余VLAN全部打标签。小心点:Trunk口协商错误导致的故障,占VLAN相关排查的一大半。最常见的就是两端Native VLAN不一致,或者Trunk配置了但没有放行某个VLAN,导致"别的VLAN全通,就这个VLAN不通"。4. VLAN实战:从规划到验证的完整配置过程讲到这里,原理都有了,我们上手做一遍完整配置。我用一个虚构的A公司办公网场景来演示,拓扑很简单但足够还原真实工作中的关键步骤:两台接入交换机,名称就叫SW1和SW2,每台划两个VLAN——VLAN 10给办公终端,VLAN 20给研发终端。SW1和SW2之间用一条Trunk链路互联。4.1 拓扑规划与VLAN划分分工如下:设备端口用途VLANSW1F0/1 - F0/5办公终端接入VLAN 10SW1F0/6 - F0/10研发终端接入VLAN 20SW2F0/1 - F0/5办公终端接入VLAN 10SW2F0/6 - F0/10研发终端接入VLAN 20SW1-SW2G0/1 互联交换机间Trunk放行VLAN 10、20从左到右,规划的思路是:先确定VLAN的数量和用途,再确定哪些端口属于哪个VLAN。规划比配置重要,因为后期改划分比一开始规划好要痛苦得多——所有终端的IP、网关、访问控制策略都跟着VLAN走。4.2 接入交换机配置步骤详解以主流企业级交换机的通用命令行风格为例(不同品牌细节有差异,思路一致):# 在SW1上创建VLAN vlan 10 name Office vlan 20 name R&D # 配置F0/1 - F0/5为Access口,归属VLAN 10 interface range f0/1 - f0/5 switchport mode access switchport access vlan 10 # 配置F0/6 - F0/10为Access口,归属VLAN 20 interface range f0/6 - f0/10 switchport mode access switchport access vlan 20 # 配置G0/1为Trunk口,并指定放行VLAN interface g0/1 switchport mode trunk switchport trunk allowed vlan 10,20SW2上做同样的配置,唯一不同的是别忘记在Trunk口上也放行VLAN 10和20。三步操作里最值得解释的是最后那行。很多人会以为配了Trunk口就万事大吉,其实Trunk默认只放行本征VLAN(默认VLAN 1),你新建的VLAN 10和20如果不单独加上去,跨交换机的VLAN流量根本过不去。这个坑我见过不知道多少次了。4.3 验证命令与输出解读配置完了,别直接拍屁股走人,用验证命令确认一切正常:show vlan brief这个命令会列出当前交换机上所有VLAN、名字和成员端口。如果看到F0/1-F0/5都在VLAN 10下面、F0/6-F0/10都在VLAN 20下面,说明Access口划分正确。show interfaces trunk这个命令检查Trunk链路状态。重点关注Port列为G0/1的那一行,Allowed VLAN列应该显示10,20,而不是默认的1或all。show mac address-table查看MAC地址表,确认SW1已经学习到了各个终端设备的MAC,并且正确关联到了对应VLAN和端口。我第一次搭实验环境时,吃完这三个命令的输出,才算真正理解"VLAN标签只在Trunk上存在"这句话的含义——你在Access口看到的全是裸帧,在Trunk口上才能抓包抓到带0x8100标签的帧。4.4 最容易翻车的三个配置错误把整套VLAN配置跑熟之后,回头再看,有三个错是新手必踩的,也是面试官最爱挖的坑。第一个:Access口PVID配错。终端接到交换机端口上,端口VLAN归属配成10,但终端的IP地址其实是VLAN 20网段的,二层通了、三层网关不同网段,怎么都不通。这种问题的特征极其迷惑——两个终端明明在同一个Access口下面,却互相ping不通。第二个:Trunk列表漏放行。跨交换机的VLAN 20通不了,排查半天抓包发现SW1和SW2之间的Trunk根本没让VLAN 20的标签通过。解决办法就是上面说的,显式地加上switchport trunk allowed vlan。第三个:Native VLAN两端不一致。Trunk链路上Native VLAN的帧不打标签,如果一端Native VLAN是1、另一端被改成2,两边对无标签帧的归属判断就会错乱,轻则部分流量转发异常,重则两个VLAN被意外"打通"。改Native VLAN属于高危操作,没搞清楚后果前不要动。实战建议:排VLAN相关故障,不要凭感觉猜,先抓包,再看配置。抓包时在Trunk口上能看到802.1Q标签,在Access口看不到,这一眼就能判断是标签问题还是转发问题。确定链路层没问题,再去核对IP和网关,故障范围立刻缩小一半。5. 一条帧的完整旅程:从MAC学习到VLAN转发的联合验证5.1 场景一:同交换机、同VLAN内通信现在我们把之前所有知识点连起来跑一遍。终端A(接在SW1的F0/1口,VLAN 10)要给终端B(接在SW1的F0/2口,VLAN 10)发数据。第一步,A先发ARP请求找B的MAC地址。这个广播帧进入F0/1口,交换机发现它是无标签帧,根据端口的PVID把它归入VLAN 10,并学习到"A的MAC在F0/1口、属于VLAN 10"。因为是广播帧,交换机把它从所有VLAN 10的成员端口(排除F0/1)泛洪出去。B收到后回ARP应答,交换机又从应答中学习到"B的MAC在F0/2口、属于VLAN 10"。接下来A正式发送数据帧时,交换机查表直接命中:目的MAC对应F0/2口,转发。这个过程中交换机从头到尾没看IP地址,只做MAC查表,两次ARP之间完成了MAC地址表的自学习,后面所有同VLAN通信都是纯查表转发。5.2 场景二:跨交换机、同VLAN通信终端A(接SW1)要跟终端C通信,但C接在SW2上,属于同一个VLAN 10。A发的帧到达SW1后,SW1查MAC表发现C不在本地端口上,于是从G0/1 Trunk口转发出去。转发前,802.1Q标签已经加在帧头上了——VLAN ID填10。SW2从G0/1口收到这个带标签帧,一看VID=10,查自己的MAC表,发现C接在F0/2口,于是转发到F0/2口并剥掉标签,C收到一个干净的无标签帧。这就是跨交换机VLAN通信的全部真相:交换机间Trunk链路上流转的是"打了VLAN标签的帧",而终端永远只看到无标签帧。如果这个过程中SW1的MAC表里没有C,SW1会直接从Trunk口泛洪带标签帧,SW2收到后再在自己的VLAN 10内泛洪,最终C回包后,两边的MAC表都学全了。5.3 场景三:跨VLAN通信为什么必须经过三层VLAN 10和VLAN 20之间的二层帧,交换机是绝不会直接转发的,因为VLAN标签都不同,隔离是硬性的。但现实中办公的同事和研发的同事肯定要互通,怎么办?答案是一切跨VLAN通信都必须经过三层设备。最常见的做法是在核心交换机或三层交换机上给每个VLAN创建一个VLANIF接口(也叫SVI,交换虚拟接口),配好网关地址,让交换机本身就充当VLAN间路由。终端把网关设成自己VLAN的VLANIF地址,跨VLAN的流量先到网关,由三层设备查路由表后,从另一VLAN的VLANIF接口重新封装二层帧,再从对应Access口发给目标终端。这个过程给我们一个非常重要的判断标准:VLAN隔离的是二层广播域,不是网络连通性。跨VLAN要通,必须规划IP网段、网关、路由;VLAN本身不会阻断三层路由,阻断的只是二层广播和直连。很多人在规划VLAN时容易犯的一个错误,是把VLAN和网段、子网之间的关系搞乱。VLAN是二层概念,IP网段是三层概念,两者通常一一对应,但不是天生的绑定关系。你在同一个VLAN里可以配两段不同网段的IP(能二层互通但三层要额外配),也可以让不同VLAN共用一段IP(别这么干,排障时你会想打人)。我搭实验环境有个习惯,就是每配完一个功能点,马上做一次抓包验证,展开帧头从MAC到VLAN标签一层层看,比自己脑补靠谱得多。学了CSMA/CD的帧结构,再看802.1Q标签插入的位置,你才会真正理解VLAN标签为什么插在源MAC和Type字段之间——因为它要让沿途所有交换机在不拆开帧内容的前提下就能快速识别VLAN,位置越靠前,处理效率越高。最后再分享一条我自己的体会:局域网这三板斧——CSMA/CD、交换机、VLAN——看着是三个独立知识点,其实是一条逻辑链上的三个环节。它们对应的是网络演进过程中的三次核心矛盾:共享介质的碰撞矛盾、冲突域过大造成的性能矛盾、广播域失控带来的隔离矛盾。每次遇到新网络问题,先想清楚问题出在哪个矛盾上,排障思路会比别人快一大截。