CSMA/CD、交换机与VLAN:局域网从一根线到一张网的演进与实战

发布时间:2026/10/20 19:47:37
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为全FFF-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标签TPIDTag Protocol Identifier固定值0x8100让交换机识别这是个带标签的帧。TCITag 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 RD # 配置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口收到这个带标签帧一看VID10查自己的MAC表发现C接在F0/2口于是转发到F0/2口并剥掉标签C收到一个干净的无标签帧。这就是跨交换机VLAN通信的全部真相交换机间Trunk链路上流转的是打了VLAN标签的帧而终端永远只看到无标签帧。如果这个过程中SW1的MAC表里没有CSW1会直接从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——看着是三个独立知识点其实是一条逻辑链上的三个环节。它们对应的是网络演进过程中的三次核心矛盾共享介质的碰撞矛盾、冲突域过大造成的性能矛盾、广播域失控带来的隔离矛盾。每次遇到新网络问题先想清楚问题出在哪个矛盾上排障思路会比别人快一大截。