要是你正在准备计算机网络期末或者考研408数据链路层肯定是绕不开的一章要是你在公司里维护过小局域网遇到“共享打印机突然连不上”“交换机一接上就全网卡死”这类问题最后基本也都会追到这一层。数据链路层局域网是整个计算机网络里最贴近硬件、也最容易被跳过去的一层很多人能背出TCP三次握手却说不清一个以太网帧的字段到底怎么排。这篇文章我就用做项目和排障的视角把数据链路层的职责、以太网帧、CRC校验、交换机转发、VLAN分割这些核心内容串一遍顺便给期末复习的朋友标一标高频率考点。1. 数据链路层到底在管什么先把职责边界划清楚1.1 三大基本功封装成帧、透明传输、差错检测我当年学计算机网络的时候老师第一句话就是“数据链路层是让物理层那串傻乎乎的比特流变得有组织、有纪律的一层。”物理层只负责把0和1从一台设备传到另一台设备它根本不关心这些比特是什么意思、对不对数据链路层就要在此基础上把比特流切成一个个“帧”解决相邻节点之间的可靠传输问题。第一个基本功是封装成帧。网络层交给链路层的是一整个IP数据报链路层要在它的前面加上帧头、后面加上帧尾构成一个完整的MAC帧。为什么要加头加尾因为接收方得知道从哪里开始、到哪里结束。你可以想象成寄快递光把东西扔进袋子不行还得贴快递单、封口快递员才知道这包裹从哪来、送到哪、有没有超重。帧头和帧尾就是这个“快递单”和“封口胶带”。第二个基本功是透明传输。帧头和帧尾里可能会有一些特殊标志如果数据部分恰好也出现了和标志一样的字节接收方就会误判帧边界。局域网以太网在这个问题上相对省心因为以太网靠物理层编码和帧间间隔来区分帧并不像PPP那样靠特定字符做边界但PPP这类点对点链路就得用字节填充遇到0x7E这类特殊字符就转义一下。这个区别在考试里经常被拿来对比千万别混。第三个基本功是差错检测。比特在链路上传输出错是常态链路层要能发现错误最经典的手段就是CRC循环冗余校验。以太网每个帧尾部都有4字节FCS就是用CRC-32生成的校验码。接收方拿到整个帧之后重新算一遍如果结果对不上就说明帧在传输过程中坏了直接丢弃。1.2 为什么以太网不保证“可靠传输”很多人学到这里会冒出一个问题链路层既然要管差错那它能不能把错纠正过来答案是传统以太网不提供可靠传输它只负责“发现错误”发现之后就把帧丢了至于丢了怎么办是上层TCP的事。这就好比楼下代收点帮你验货收到破损包裹就拒收但不会自己再买一个补给你真正补货的是商家也就是TCP。这个设计初看很“躺平”但恰恰是它让以太网变得廉价又高效。如果每一跳都做确认和重传性能开销会非常大而局域网的误码率本来就低丢了重传成本也不高把可靠性交给端到端的TCP更合理。考试里如果问你“为什么以太网不要求可靠传输”这个逻辑答上去基本就稳了。1.3 数据链路层的“地图坐标”从层次模型上看数据链路层正好夹在物理层和网络层中间。它向下要面对网线、光纤、无线信道向上要给IP层提供“能用的链路”。局域网里的交换机就是这个层最典型的设备路由器虽然主要工作在网络层但它的每个接口也内置了完整的数据链路层功能。我自己的学习体会是你不需要先去死记每一层协议的名字只要记住数据链路层关心的永远是“同一链路里从一台设备的网卡到另一台设备的网卡这一小段怎么传好”。一旦出了局域网跨越不同网络的事就不归它管了那是网络层的活。2. 以太网帧与CRC校验一帧数据在局域网里长什么样2.1 帧格式拆解每个字段都不是白给的局域网最常见的以太网帧有两种格式一种是经典的Ethernet II另一种是IEEE 802.3。考试和实际抓包软件里绝大多数都是Ethernet II格式我得先把它的字段给你拆开看。字段长度说明前导码7字节用于收发双方时钟同步不算MAC帧的一部分帧起始定界符1字节标志着帧正式开始目的MAC地址6字节接收方网卡的物理地址源MAC地址6字节发送方网卡的物理地址类型/长度2字节0x0800表示上层是IPv40x0806表示是ARP0x86DD是IPv6数据部分46~1500字节里面装着IP数据报FCS校验4字节CRC-32计算结果用于差错检测这里有个细节很容易忽略Ethernet II这个2字节字段叫“类型”而IEEE 802.3里2字节叫“长度”。抓包时怎么区分约定是以0x0600为界限大于等于0x0600的按类型解释小于等于0x05DC的按长度解释。因为最大长度是1500字节也就是0x05DC所以两个含义不会撞车。数据部分为什么下限是46字节因为以太网帧从目的MAC到FCS之间整体有个最小长度要求也就是64字节。去除14字节头加4字节尾数据部分至少得是46字节。不够怎么办填上填充字段。这就是为什么你用Wireshark抓包时有些短帧数据部分会看到一堆零不是网络出Bug了是在补位。2.2 MAC地址里藏着的信息MAC地址一共48位通常写成六个十六进制段比如00:1A:2B:3C:4D:5E。前24位是OUI也就是“厂商代码”由IEEE分配给各家网卡厂商后24位是网卡制造商自己分配的序列号理论上全球唯一。不过MAC地址不是只有唯一性这一个考点。看第一个字节的最低两个比特就能判断这个帧到底是单播、多播还是广播。如果最低位是0说明是单播MAC地址如果最低位是1说明是多播MAC地址当整个地址是FF:FF:FF:FF:FF:FF时就是广播地址。交换机一旦看到目的MAC是全F就会把这个帧泛洪到所有端口一个不落。2.3 CRC校验怎么手工算一遍CRC的原理说起来很简单发送方把数据看成一个很长的二进制数用一个约定好的生成多项式去做模2除法得到的余数就是FCS校验码拼到数据后面一起发出去接收方用同样的多项式去除整个帧如果余数为0就认为没出错。我拿一个教材经典的例子走一遍。假设信息位是101001生成多项式是1101对应x³x²1最高次幂是3那就在信息位后面补3个0得到101001000。用1101对101001000做模2除法模2除法就是按位异或不考虑进位借位一路算到底最终余数是001。发送方就把这个001附在原始数据后面真正发出去的帧数据是101001001。接收方拿到后再除以1101余数是0帧通过校验。为什么CRC比累加和或者奇偶校验强因为它对突发错误特别敏感连续一串比特出错也能大概率查出来。以太网用的CRC-32生成多项式是0x04C11DB7虽然手工算32位很痛苦但原理和小例子完全一致。在Wireshark里如果你看到某一条报文标了Bad checksum或incorrect FCS就是接收端算完发现余数不为0这种帧在真实设备上会被直接丢弃抓包软件只是帮你把这个丢弃前的证据留了下来。2.4 为什么网络层有IP了二层还要MAC这个问题是面试高发题也是理解局域网的关键。IP地址是“逻辑地址”它描述的是设备在互联网中的网络位置网络拓扑变了IP可以跟着变MAC地址是网卡出厂时烧录的“物理身份”基本不随环境改变只负责在同一个链路里精确找到下一跳设备。打个比方IP像你写在快递单上的收件人姓名和手机号跟着人走MAC像快递包裹的条形码和分拣码只要这辆车在路上跑分拣中心就只认这个码。路由器的核心工作是根据IP做跨网转发但一旦决定从某个端口发出去它还得靠ARP把目标IP映射成目标MAC交给链路层去投递。所以IP负责“传到哪”MAC负责“这一段路怎么送”两者缺一不可。3. 交换机的学习过程局域网交换实验背后发生了什么3.1 一台交换机是怎么从“懵懂”变“聪明”的很多做局域网交换实验的同学第一次show mac address-table时都会看到那张表一开始是空的跑几个ping之后逐渐填满。这背后的机制就是交换机自学习总共三步。假设主机A连在交换机1口主机B连在2口。A给B发了一个帧交换机会在这个帧进门的那一刻先看一下源MAC地址记下“这个源MAC是从1号口进来的”存进MAC地址表。然后它再看目的MAC发现表里没有B的记录于是除了1号口之外的所有端口都把帧复制一份发出去这种行为叫泛洪。B收到帧后要回包回包进入交换机的过程让交换机学到“B在2号口”从此A和B再通信交换机就能精确转发不用再满世界喊话。这里有个细节交换机只看一帧的源MAC来学习看目的MAC来决定转不发学习是“被动”的靠数据流自己驱动。如果你用一个源MAC一直不发帧交换机学不到它表项会老化默认老化的时间一般是300秒。这也是为什么有些网管会做静态MAC绑定把重要服务器的MAC和端口锁死防止别人伪造。3.2 广播域与冲突域为什么Hub是“傻瓜机”数据链路层有一个必须区分清楚的概念冲突域和广播域。冲突域是一组设备只要同时说话就会互相干扰的范围广播域是一组设备收到一个广播帧都会处理的范围。集线器Hub工作在最底层的物理层它收到一个比特就给所有端口复制一份所以一台Hub的所有端口都在同一个冲突域也都在同一个广播域。交换机不一样每个端口对应一个独立的冲突域这样可以全双工同时收发互不影响但默认情况下交换机所有端口仍然共享同一个广播域。这就是为什么后来出现了VLAN专门用来切割广播域。3.3 局域网交换实验里的“必做动作”如果你手头有真机或者模拟器可以按这个顺序做一遍搭两台PC分别接到交换机的1口和2口配好同一网段的IP。先查看MAC地址表确认是空的。从PC A ping PC B。再查看MAC地址表你会看到PC A和PC B的MAC地址分别对应1口和2口。把PC A换到3口再ping一次马上再看表交换机会自动把A的表项从1口改到3口。这个实验能直观地证明交换机是“会学习、会更新”的二层设备。很多人会接着做VLAN实验其实VLAN实验的本质就是改变交换机的转发规则同VLAN端口之间可以二层通信不同VLAN端口之间默认隔离必须借助三层接口才能互通。这部分我在后面专门展开讲。4. 局域网环路的坑STP为什么是交换机的保命协议4.1 一根多余的网线就能让整个网络瘫痪很多没有实际维护过网络的人很难相信局域网不稳定往往不是路由器坏了而是有人在交换机之间多插了一根网线物理上形成了环路。为什么要冗余链路因为怕某条线路断了影响业务。但当冗余链路没有协议控制的时候灾难就来了。假设一台交换机有两个口分别连到另一台交换机网络中只要出现一个广播帧交换机就会从两个口都转发出同一份对方收到后再泛洪如此往复广播帧指数级暴涨很快占满所有交换机的端口带宽。这时候现象非常典型所有设备都显示“网络已连接”但ping网关要么丢包率极高要么直接超时交换机所有端口流量灯狂闪。一台设备或者一台虚机稍微发一个ARP包就能引爆整片局域网。除了广播风暴环路还会造成MAC地址漂移交换机今天从口1学到某个MAC明天又从口2学到同一个MACMAC地址表来回横跳正常单播流量也跟着乱转发。实际排障时我一般会先观察所有端口流量是不是都爆满再尝试拔掉疑似环路链路网络一旦瞬间恢复基本就实锤了。4.2 STP和RSTP是怎么“砍掉”环路的生成树协议STP的核心理念是在物理上有环的拓扑里逻辑上选出一棵无环的树。那怎么选整个网络里先选一个根桥可以理解为“树根”其他交换机计算自己到根桥的最短路径选出根端口每条链路上再选出指定端口所有既不是根端口也不是指定端口的冗余端口进入阻塞状态不再转发数据帧环路就这么被逻辑切断了。交换机之间通过BPDU桥协议数据单元互相交换拓扑信息其中包含网桥优先级、MAC地址、路径开销等参数。选举根桥时先比优先级优先级相同比MAC地址更小。STP收敛比较慢通常要30到50秒这在生产网络里太久了所以现在普遍用RSTP快速生成树可以在几秒内完成收敛。考试里除了原理经常会问“为什么STP能防环”“阻塞端口的作用是什么”把根桥、根端口、指定端口这三个概念说清楚基本就能拿分。4.3 实验里怎么看STP状态在Cisco交换机上show spanning-tree会列出每个端口的角色和状态端口状态从阻塞到侦听、学习最终进入转发状态被阻塞的端口角色是Altn或Backup。华为设备上则是display stp brief。做实验的时候你可以在两台交换机上同时开STP自己搭一个三角环路再查看哪个端口被阻塞对比一下STP开启前后广播流量的变化感受会很直观。真机上见过一个坑有些傻瓜交换机根本不会主动开启STP或者默认关闭了RSTP如果你在小型办公网络里接了一堆这种设备还试图加冗余链路那基本等于给自己埋雷。我的建议是只要有多台交换机且有两条及以上互联链路必须确认STP已经开了否则别怪网络夜里突然卡死。5. VLAN隔离同一个物理局域网里怎么“分家”5.1 为什么要引入VLAN回到广播域这个概念默认一台交换机所有端口都在同一个广播域几百台PC、打印机、监控设备都在这一个域里。主机数一多广播流量就会变得很夸张ARP请求满天飞网络性能肉眼可见地下降。更麻烦的是安全同一广播域里的设备只要不当心被装了抓包软件别人就可能看到不该看的二层流量。VLAN虚拟局域网的出现就是把一个物理交换机切成多个逻辑网络。技术上讲VLAN可以直接限制广播域的范围端口划分到哪个VLAN收到的广播帧就只在这个VLAN内部转发从管理上讲把不同部门划进不同VLAN互访受控规划清晰后续加设备也更安全。5.2 802.1Q在以太网帧里插个“门牌号”早期的VLAN靠交换机端口静态划分但如果多个交换机级联怎么知道一个帧属于哪个VLAN这就需要给帧打个标签。IEEE 802.1Q标准在以太网帧的源MAC和类型字段之间插入4个字节其中前2字节是TPID固定0x8100表示这是带VLAN标签的帧后2字节里包含3位优先级、1位DEI以及12位VID所以VLAN ID范围是0到4095去掉保留的两个实际可用的VLAN ID一般是1到4094。配置VLAN时最常见两种端口类型要分清楚Access口和Trunk口。Access口一般接终端设备只能属于一个VLAN发出的帧不带标签Trunk口一般跑在交换机之间默认放行所有VLAN帧在Trunk上传输时都带着802.1Q标签。考试里总是会问“为什么交换机之间要用Trunk”你答“为了传递多个VLAN的帧并保留VLAN标识”就行了。5.3 VLAN间通信必须跨过三层这道坎二层VLAN隔离之后不同VLAN之间的设备默认是相互隔绝的。想要互访必须通过三层设备做路由。老办法是单臂路由一台路由器用一根Trunk线连交换机路由器用子接口处理不同VLAN的网关现代园区网更常用三层交换机直接给每个VLAN配置一个VLANIF接口相当于交换机的虚拟三层口然后启用VLAN间路由。实际配置样例华为交换机大致是这样[SW1]vlan 10 [SW1-vlan10]quit [SW1]interface GigabitEthernet0/0/1 [SW1-GigabitEthernet0/0/1]port link-type access [SW1-GigabitEthernet0/0/1]port default vlan 10 [SW1]interface GigabitEthernet0/0/24 [SW1-GigabitEthernet0/0/24]port link-type trunk [SW1-GigabitEthernet0/0/24]port trunk allow-pass vlan 10 20Cisco设备风格不同但思路一样SW1(config)#vlan 10 SW1(config-vlan)#exit SW1(config)#interface gigabitethernet0/1 SW1(config-if)#switchport mode access SW1(config-if)#switchport access vlan 10 SW1(config)#interface gigabitethernet0/24 SW1(config-if)#switchport mode trunk SW1(config-if)#switchport trunk allowed vlan add 10,20建议你在模拟器里把两台PC分别划到VLAN 10和VLAN 20先ping不通再配好VLANIF或路由器子接口之后ping通对比一下抓包结果。这个实验做完VLAN相关的记忆会牢很多。6. 局域网排障实录从二层看高频故障6.1 秒查链路层该看哪些点实际维护中遇到“局域网共享文件打不开”“打印机连不上”“两台设备ping时好时坏”这类问题我会先按顺序看链路层状态。第一步确认网卡灯和交换机端口指示灯都亮物理层没问题第二步看交换机端口有没有被shutdown或者是不是被划进了错误VLAN第三步抓APR包看看设备有没有学到目标主机的MAC地址如果一直收到错误源MAC有可能是IP地址冲突或者有设备冒充。这里把常见现象整理成一个速查表方便你直接对着参考现象可能原因建议排查动作交换机一接上全网变卡网络环路导致广播风暴拔掉环路链路确认STP开启两台设备同一个IP时通时断IP地址冲突查ARP表和DHCP分配记录共享打印机偶尔能用偶尔不能用广播域过大或VLAN配置错确认PC和打印机在同一VLAN换个交换机接口后不能上网端口被划到错误VLAN或做了MAC绑定看端口配置和MAC地址表主机能上网但互访连不上VLAN隔离或防火墙策略走三层路由检查或临时放通策略抓包全是Bad checksum链路质量问题或网卡故障换网线/换端口重试6.2 期末和408高频考点重点复习这些如果你是学生党数据链路层这部分考点其实特别集中。我结合《计算机网络谢希仁》教材和考研408大纲把必看内容列一下数据链路层的基本功能封装成帧、透明传输、差错检测以及三种可靠传输协议的思想虽然以太网不用但概念要懂。CSMA/CD载波监听多路访问/冲突检测核心是“先听后发、边发边听、冲突停发、随机重发”。这里有个高频计算题就是最小帧长和争用期的关系我前面讲过的64字节最小帧长就是从这个公式推出来的最小帧长 2倍单程传播时延 × 数据率。以太网帧格式字段顺序、类型值、最小帧长、最大帧长必须能画出来。MAC地址结构OUI、单播/多播/广播判断以太网为什么需要MAC和IP。CRC校验会算小规模模2除法知道CRC-32用在以太网FCS上。交换机自学习泛洪、学习、老化这三个词是简答题常客。STP/RSTP根桥选举、端口角色、阻塞端口的作用。VLAN与802.1QVLAN的作用、Access与Trunk的区别、VID范围。6.3 我建议的学习路径课本加抓包加模拟器那些只看书学不下去的人我特别推荐一个组合。准备一台电脑装Wireshark自己ping网关看一次ARP请求和响应再点开一条以太网帧把前导码之外那些字段对照课文看一遍帧格式立刻就活了。然后去模拟器里做VLAN实验、STP实验把前面表格里的现象亲眼复现一遍比你闷头刷十道题都管用。考408的同学还可以配合王道或者湖科大教书匠的视频课把这里面的原理一遍看不懂就再看一遍链路层弄明白了后面网络层学起来会轻松很多。我个人在实际操作中最深的体会是很多人学数据链路层总觉得抽象直到自己在真实局域网里排一次拥塞或环路故障才会把那些概念串起来。我在维护一个小型办公网络时经历过一次全网卡死查到最后就是一根网线把两台交换机连成了环而交换机没开STP广播流量把所有端口全部占满。从那以后我养成一个习惯接入任何交换机先确认生成树开了、VLAN划分清楚再上线业务。如果你也在学这一层我建议别只背概念拿Wireshark抓几帧真实数据再在模拟器里搭一个VLAN加STP的实验效果比刷题好得多。最后再说个小技巧检查局域网故障时如果怀疑是环路先别急着拔线用show mac address-table看有没有MAC地址在不同端口之间反复漂移有的话基本就能锁定问题方向了。
