1. 数据链路层到底在解决什么问题
很多人学计算机网络,学到数据链路层就开始犯迷糊。物理层讲的是比特流怎么在介质上传输,网络层讲的是分组怎么从源主机跳到目的主机,那夹在中间的数据链路层到底干什么?我当初学这一章的时候也有这个困惑,后来把谢希仁老师教材里那几道典型例题反复做了三遍,才真正想明白。
数据链路层的核心任务可以用一句话概括:把物理层不可靠的比特流传输,改造成相邻节点之间可靠的数据帧传输。注意两个关键词——“相邻节点”和“帧”。物理层传的是裸比特,它不管这些比特是什么意思、有没有出错;网络层要的是从北京到广州的端到端交付,但它自己不管中间每一跳怎么走。数据链路层就卡在中间,负责每一段链路上的“本地交付”。
打个比方。你要从某城市寄一个包裹到另一个城市,网络层相当于规划了整条运输路线(经过哪些中转站),而数据链路层相当于每一段运输(从你家到第一个中转站、从中转站A到中转站B)的具体搬运工作。每一段搬运都要保证包裹不丢、不坏,至于整条路线怎么规划,那是网络层的事。
这一章在期末考试里占的分值通常不小,因为它是整个协议栈里“承上启下”的一层,既涉及底层硬件(网卡、信道),又涉及上层协议(IP分组),还包含大量可计算、可分析的考点。下面我按考试重点的分布,把这一章拆成几个板块来讲。
1.1 链路与数据链路的区别
谢希仁老师的教材里特别强调了一个区分:链路和数据链路不是一回事。
链路就是一条物理线路,从一台主机到另一台主机之间的物理通道。数据链路则是在物理链路的基础上,加上了通信协议(硬件和软件),使得这条链路上传输的数据是有格式、有校验、有控制的。
这个区分看起来简单,但考试里经常出判断题或者选择题来考你。比如“链路就是数据链路”这句话对不对?答案是错的。链路是物理概念,数据链路是逻辑概念。数据链路 = 链路 + 协议。
1.2 帧:数据链路层的“包裹”
数据链路层传输的数据单位叫帧。为什么不用比特流直接传?因为比特流没有边界,接收方不知道从哪里开始、到哪里结束。帧的作用就是给数据加上“包装”——帧头、帧尾、校验码——让接收方能够识别出每一段数据的起止位置,并且判断传输过程中有没有出错。
帧的结构在不同协议里不一样,但基本都包含这几个部分:帧头(包含地址信息、控制信息)、数据部分(就是网络层交下来的IP分组)、帧尾(包含校验序列)。考试里经常让你画出某种帧的格式,或者计算帧的长度、有效数据率等。
1.3 三个基本问题:封装成帧、透明传输、差错检测
这一节是整章的基石,几乎每年必考。三个问题分别是:
封装成帧:给网络层交下来的数据加上帧头和帧尾,使其成为可以被链路层传输的帧。帧头和帧尾的作用之一就是帧定界——让接收方能从连续的比特流中识别出帧的开始和结束。
透明传输:如果数据部分恰好出现了和帧定界符一样的比特组合怎么办?接收方会误以为帧结束了。透明传输就是要解决这个问题,让数据部分里的任何比特组合都不会被误判为帧定界符。常用的方法有字节填充(转义字符)和比特填充(零比特插入)。
差错检测:传输过程中比特可能出错(1变成0,0变成1),需要有一种机制来发现错误。最常用的方法是循环冗余检验CRC。
这三个问题贯穿整章,后面的PPP协议、以太网协议都是在解决这三个问题的基础上发展出来的。我在复习的时候,把这三个问题当成一条主线,后面每学一个协议就问自己:它是怎么封装成帧的?怎么实现透明传输的?怎么做差错检测的?这样串起来,整章的逻辑就非常清晰了。
2. 循环冗余检验CRC的手算方法
CRC是这一章最常考的计算题,没有之一。很多人觉得CRC难,其实是因为教材上讲的是模2运算,而模2运算和普通算术运算不太一样,第一次接触容易绕晕。我下面用最直白的方式把CRC的计算过程拆开。
2.1 模2运算的核心规则
模2运算就是不进位、不借位的二进制运算。具体来说:
- 模2加法:0+0=0,0+1=1,1+0=1,1+1=0(相当于异或)
- 模2减法:和加法一样,因为不进位不借位
- 模2乘法:按普通乘法算,但加的时候用模2加法
- 模2除法:按普通除法算,但减的时候用模2减法
关键记住一点:模2运算里,加法和减法是一回事,都是异或。这一点搞清楚了,CRC计算就成功了一半。
2.2 CRC计算的具体步骤
假设要发送的数据是M,生成多项式是G(通常写成二进制串的形式)。CRC的计算步骤如下:
- 设G的位数为k+1位(最高次为k次),在M后面补k个0,得到M'
- 用M'除以G,做模2除法,得到的余数R就是CRC校验码(R的位数必须是k位,不足前面补0)
- 把R拼接到原始数据M后面,得到M+R,这就是实际发送的数据
- 接收方收到后,用同样的G去除,如果余数为0,则认为传输无误;否则认为出错
我举个具体的例子。假设M = 101001,G = 1101(这是常见的生成多项式,对应x³+x²+1)。
G是4位,所以k=3,在M后面补3个0,得到M' = 101001000。
然后用M'除以G:
110101 ________ 1101 ) 101001000 1101 ---- 1110 1101 ---- 0111 0000 ---- 1110 1101 ---- 0110 0000 ---- 1100 1101 ---- 001余数是001,所以CRC校验码是001。发送的数据就是101001001。
接收方收到101001001后,用1101去除,如果余数为0,说明传输正确。
2.3 考试中CRC的常见陷阱
CRC计算本身不难,但考试里经常设几个坑:
第一个坑:生成多项式的位数和补零个数。G是k+1位,就要补k个0。很多人一紧张就补错了。我的方法是:先数G有几位,减1就是补零的个数。
第二个坑:余数的位数。余数必须是k位,如果算出来不足k位,前面要补0。比如上面算出来是001,不能写成1。
第三个坑:CRC只能检错不能纠错。这是一个概念题,经常考判断题。CRC能发现错误,但不能定位错误的具体位置,所以不能纠正错误。要纠错需要用海明码等其他编码。
第四个坑:CRC的检错能力。不是所有错误都能被CRC检测出来。如果错误恰好使得接收到的数据能被G整除,CRC就检测不出来。但实际中G选得好的话,漏检率极低。
提示:考试里如果让你“计算CRC校验码”,一定要把模2除法的过程写出来,不要只写答案。过程分往往占一半以上。
2.4 实战心得:怎么快速验算
我做完CRC题之后,习惯用一个小技巧验算:把算出来的余数拼到原始数据后面,再用G除一次,看余数是不是0。如果是0,说明计算正确。这个方法虽然多花一点时间,但能避免因为一步算错导致整题丢分。
另外,模2除法里每一步的“商”其实只有0和1两种可能——被除数首位是1就商1,是0就商0。掌握这个规律之后,计算速度会快很多。
3. PPP协议为什么在考试里反复出现
PPP协议(点对点协议)是数据链路层里最重要的协议之一,也是考试的高频考点。它的设计思路非常清晰,而且和后面要讲的以太网协议形成了鲜明对比,所以出题人特别喜欢拿它做文章。
3.1 PPP协议要满足的需求
PPP协议的设计目标很明确:在点对点的链路上传输网络层分组。所谓点对点,就是链路的两端只有两个节点,没有第三个。这和以太网的广播式链路完全不同。
PPP需要满足的需求包括:
- 简单:这是PPP的首要需求。不需要纠错、不需要流量控制、不需要序号,这些功能交给上层去做
- 封装成帧:必须能明确地划分出每一帧的边界
- 透明传输:数据部分不能和帧定界符冲突
- 差错检测:能发现传输中的比特错误
- 支持多种网络层协议:不只是IP,还可以承载其他协议
- 支持多种链路类型:串行、并行、同步、异步等
考试里经常问:PPP为什么不需要纠错和流量控制?答案就是“简单”——PPP把可靠性交给上层(TCP),自己只做最基础的帧传输。这个设计哲学在考试里经常以简答题的形式出现。
3.2 PPP帧的格式拆解
PPP帧的格式是必考内容。标准PPP帧包含以下字段:
| 字段 | 长度 | 作用 |
|---|---|---|
| 标志字段F | 1字节 | 帧定界符,固定为0x7E |
| 地址字段A | 1字节 | 固定为0xFF(实际上不起作用) |
| 控制字段C | 1字节 | 固定为0x03(实际上不起作用) |
| 协议字段 | 2字节 | 标识数据部分是什么协议 |
| 信息部分 | 可变 | 网络层交下来的数据 |
| 帧检验序列FCS | 2或4字节 | CRC校验码 |
| 标志字段F | 1字节 | 帧定界符,固定为0x7E |
这里有几个考试常问的点:
为什么地址字段固定为0xFF?因为PPP是点对点链路,只有两个节点,不需要地址来区分。这个字段实际上没有意义,但为了兼容性保留了。
为什么控制字段固定为0x03?类似的原因,PPP不需要序号和控制信息,这个字段也没有实际作用。
协议字段的作用是什么?用来标识信息部分承载的是什么协议的数据。比如0x0021表示IP数据报,0xC021表示LCP数据,0x8021表示NCP数据。
3.3 字节填充:PPP的透明传输方案
PPP使用字节填充来实现透明传输。具体规则是:
- 如果信息部分出现了0x7E(和标志字段相同),就把它转变成0x7D 0x5E(两个字节)
- 如果信息部分出现了0x7D(和转义字符相同),就把它转变成0x7D 0x5D
- 如果信息部分出现了ASCII码的控制字符(小于0x20的),一般也要进行转义
接收方收到后做相反的变换,就能还原出原始数据。
这个规则看起来简单,但考试里经常出计算题:给你一段数据,让你写出经过字节填充后实际传输的字节序列。做这种题的关键是按顺序扫描,遇到特殊字符就替换,不要跳着看。
3.4 PPP的工作状态
PPP链路的建立不是一蹴而就的,它有一个完整的状态转换过程。考试里经常考这个过程的顺序:
- 链路静止:物理层还没有激活
- 链路建立:物理层激活后,LCP(链路控制协议)开始协商配置选项
- 鉴别:如果需要,进行身份鉴别
- 网络层协议配置:NCP(网络控制协议)配置网络层参数,比如分配IP地址
- 链路打开:数据传输阶段
- 链路终止:数据传输结束后,LCP释放链路
这个状态转换图在教材里画得很清楚,考试里可能让你排序或者填空。我的记忆方法是:先建链路,再鉴别,再配网络,然后传数据,最后释放。
注意:PPP的鉴别阶段是可选的,不是必须的。如果链路两端不需要鉴别,可以直接跳到网络层协议配置阶段。
3.5 实战心得:PPP和HDLC的对比
考试里经常把PPP和HDLC放在一起考。HDLC是更早的协议,PPP在很多方面做了简化。主要区别:
- HDLC是面向比特的协议,PPP是面向字节的
- HDLC支持可靠传输(有序号和确认),PPP不支持
- HDLC的帧格式更复杂,PPP更简单
- PPP有LCP和NCP,HDLC没有对应的协议
记住一句话:PPP是简化版的HDLC,专为点对点链路设计,强调简单和灵活。
4. 以太网的CSMA/CD机制到底怎么工作
以太网是数据链路层里另一个重头戏。谢希仁老师的教材里,以太网部分占了很大篇幅,因为它是目前最主流的局域网技术。考试里关于以太网的考点主要集中在CSMA/CD协议、MAC地址、帧格式这几个方面。
4.1 CSMA/CD的核心思想
CSMA/CD的全称是载波监听多点接入/碰撞检测。这个名字本身就概括了它的工作流程:
- 载波监听:发送数据之前,先监听信道有没有其他人在发送
- 多点接入:多个站点连接在同一条总线上
- 碰撞检测:发送数据的同时,继续监听信道,看有没有发生碰撞
用大白话说就是:先听后说,边说边听,冲突停发,随机重发。
这个机制的核心目的是解决总线型网络中多个站点争用信道的问题。因为所有站点共享同一条总线,如果两个站点同时发送,信号就会叠加,导致数据无法正确接收。CSMA/CD就是用来协调这种争用的。
4.2 争用期和最短帧长的计算
这是以太网部分最常考的计算题。核心概念是争用期(也叫碰撞窗口)。
争用期的定义是:发送方在发送数据后,最多经过多长时间才能确定没有发生碰撞。这个时间等于信号在总线上往返一次的时间,即2τ(τ是单程传播时延)。
为什么是2τ?因为最坏情况下,A发送的信号快到B时,B也发送了信号,两个信号碰撞后,碰撞信号还要传回A。所以A最多需要2τ的时间才能检测到碰撞。
以太网规定争用期为51.2微秒(对应10Mb/s以太网,512比特的发送时间)。由此可以算出最短帧长:
最短帧长 = 争用期 × 数据率 = 51.2μs × 10Mb/s = 512比特 = 64字节
这个64字节就是以太网帧的最小长度。如果数据部分太少,需要填充到46字节(因为帧头18字节,64-18=46)。
考试里经常出这样的题:给你总线长度、信号传播速度、数据率,让你算最短帧长。解题步骤是:
- 算单程传播时延τ = 总线长度 / 传播速度
- 算争用期2τ
- 算最短帧长 = 2τ × 数据率
我做过一道典型题:总线长1km,信号传播速度200m/μs,数据率10Mb/s。τ = 1000/200 = 5μs,2τ = 10μs,最短帧长 = 10μs × 10Mb/s = 100比特。但以太网规定最短帧长是64字节=512比特,所以实际最短帧长取512比特。
4.3 截断二进制指数退避算法
发生碰撞后,站点需要等待一段随机时间再重发。这个等待时间怎么确定?以太网使用截断二进制指数退避算法。
算法规则:
- 确定基本退避时间,一般取争用期2τ
- 从整数集合[0, 1, ..., (2^k - 1)]中随机取一个数r,其中k = min(重传次数, 10)
- 重传需要的等待时间 = r × 2τ
- 如果重传16次仍然失败,则丢弃该帧,报告错误
这个算法的核心思想是:重传次数越多,随机选择的范围越大,等待时间越分散,从而降低再次碰撞的概率。
考试里经常考这个算法的计算。比如:某站点第3次重传,k = min(3, 10) = 3,从[0, 1, ..., 7]中随机取一个数r,等待时间 = r × 2τ。
提示:注意k的最大值是10,不是16。虽然最多重传16次,但k在10之后就不再增加了。这是一个容易记错的点。
4.4 MAC地址和帧格式
以太网的MAC地址是48位,通常写成6个十六进制数,比如00-1A-2B-3C-4D-5E。MAC地址分为三类:
- 单播地址:第一个字节的最低位为0,用于标识单个站点
- 多播地址:第一个字节的最低位为1,用于标识一组站点
- 广播地址:全1,即FF-FF-FF-FF-FF-FF,用于标识所有站点
以太网帧的格式有两种标准:DIX Ethernet V2和IEEE 802.3。考试里主要考DIX Ethernet V2格式:
| 字段 | 长度 | 作用 |
|---|---|---|
| 目的MAC地址 | 6字节 | 接收方的MAC地址 |
| 源MAC地址 | 6字节 | 发送方的MAC地址 |
| 类型 | 2字节 | 标识上层协议(如0x0800表示IP) |
| 数据 | 46-1500字节 | 网络层交下来的数据 |
| FCS | 4字节 | CRC校验码 |
这里有几个考试常问的点:
为什么数据部分最少46字节?因为以太网帧最短64字节,帧头+帧尾共18字节,所以数据部分最少46字节。如果不够,需要填充。
为什么数据部分最多1500字节?这是以太网规定的最大传输单元MTU。限制MTU的原因是多方面的:太长会导致其他站点等待时间过长,太短会导致开销过大。
类型字段和长度字段的区别?DIX Ethernet V2里这个字段是类型(标识上层协议),IEEE 802.3里这个字段是长度(标识数据部分的长度)。实际中通过字段值来区分:如果值大于1500,就是类型;如果小于等于1500,就是长度。
4.5 实战心得:CSMA/CD的考试套路
CSMA/CD的考题主要有三类:
第一类:概念题。问CSMA/CD的工作流程、争用期的定义、最短帧长的原因等。这类题靠记忆,把关键词记住就行。
第二类:计算题。算最短帧长、算退避时间、算信道利用率等。这类题要熟练掌握公式,注意单位换算。
第三类:分析题。给一个场景,问会不会发生碰撞、什么时候能检测到碰撞等。这类题需要理解CSMA/CD的本质。
我的经验是:把争用期和最短帧长的推导过程自己推一遍,理解了原理,所有计算题都能迎刃而解。
5. 以太网交换机怎么转发帧
交换机是以太网里的核心设备,也是考试的重点。很多人搞不清楚交换机和集线器的区别,其实核心就一句话:集线器工作在物理层,交换机工作在数据链路层。
5.1 交换机的工作原理
交换机内部有一个交换表(也叫MAC地址表),记录了每个MAC地址对应哪个端口。交换机收到帧之后,根据目的MAC地址查表,决定从哪个端口转发出去。
交换表的建立是自学习的:交换机收到帧后,把源MAC地址和收到该帧的端口号记录到交换表中。这样,下次有帧要发给这个MAC地址时,就知道从哪个端口转发了。
交换机的转发规则:
- 如果目的MAC地址在交换表中,从对应的端口转发出去(明确转发)
- 如果目的MAC地址不在交换表中,从除接收端口外的所有端口转发出去(泛洪)
- 如果目的MAC地址是广播地址,从除接收端口外的所有端口转发出去(广播)
5.2 自学习过程的详细拆解
考试里经常给一个交换机的初始状态和一系列帧的收发过程,让你填写交换表的变化。做这种题的关键是按时间顺序逐步更新,不要跳步。
我举个典型例子。假设交换机有4个端口,初始交换表为空。
- A(端口1)发送帧给B。交换机收到后,记录A→端口1。查表没有B,泛洪到端口2、3、4。
- B(端口2)回复帧给A。交换机收到后,记录B→端口2。查表有A→端口1,从端口1转发。
- C(端口3)发送帧给A。交换机收到后,记录C→端口3。查表有A→端口1,从端口1转发。
经过这三步,交换表里就有三条记录:A→1,B→2,C→3。
这种题看起来简单,但考试里经常设陷阱:比如两个站点同时发送、帧的目的地址是广播地址、交换表项老化等。做的时候要仔细读题,注意每一个细节。
5.3 交换机的两种交换模式
交换机有两种主要的交换模式:
存储转发模式:交换机收到整个帧之后,先进行CRC校验,确认无误后再转发。优点是能过滤掉错误帧,缺点是延迟大。
直通模式:交换机收到帧的前6个字节(目的MAC地址)后,立即查表转发,不等待整个帧接收完。优点是延迟小,缺点是不能过滤错误帧。
考试里经常问这两种模式的优缺点和适用场景。我的记忆方法是:存储转发更可靠但更慢,直通更快但可能转发错误帧。
5.4 实战心得:交换机和路由器的区别
考试里经常把交换机和路由器放在一起考。核心区别:
- 交换机工作在数据链路层,根据MAC地址转发;路由器工作在网络层,根据IP地址转发
- 交换机隔离碰撞域,但不隔离广播域;路由器既隔离碰撞域,也隔离广播域
- 交换机用于局域网内部,路由器用于连接不同网络
记住一句话:交换机是“本地通”,路由器是“跨网通”。
6. 这一章怎么复习才不丢分
说了这么多知识点,最后聊聊复习方法。数据链路层这一章的特点是概念多、计算多、协议多,如果只是死记硬背,很容易记混。我的建议是抓住三条主线:
第一条主线:三个基本问题。封装成帧、透明传输、差错检测。每学一个协议,就问自己它是怎么解决这三个问题的。PPP用字节填充,以太网用曼彻斯特编码和CRC,HDLC用比特填充。这样串起来,协议之间的区别就一目了然了。
第二条主线:可靠传输和不可靠传输。数据链路层的可靠传输机制包括确认和重传,但现代协议(PPP、以太网)都选择不做可靠传输,把可靠性交给上层。理解这个设计哲学,很多概念题就能直接选对。
第三条主线:计算题的公式。CRC的模2除法、争用期和最短帧长、退避算法的等待时间、交换机的自学习过程。这些计算题都有固定的套路,把公式记熟,多做几道典型题,考试时就能快速拿分。
我当年复习的时候,把教材上的例题和课后习题做了三遍。第一遍按章节做,第二遍按题型做,第三遍只做错题。做完之后,这一章的考点基本就全覆盖了。考试的时候,数据链路层的题我基本没丢分。
提示:谢希仁老师的教材里,数据链路层的课后习题质量很高,很多考试题都是从里面改编的。建议至少做两遍。
另外,这一章和后面网络层、传输层的内容有很强的关联。比如MTU的概念会影响IP分片,CRC的思想在TCP校验和里也有体现。复习的时候不要孤立地看这一章,要把它放在整个协议栈里理解。这样不仅考试能拿分,对计算机网络的整体理解也会上一个台阶。
最后说一个考试技巧:数据链路层的简答题经常考“为什么这样设计”而不是“是什么”。比如“为什么PPP不需要纠错”“为什么以太网有最短帧长限制”“为什么交换机要自学习”。回答这类题的时候,一定要从设计目标和实际约束两个角度去分析,不要只背结论。