计算机网络核心概念精讲 第 5 篇:数据链路层协议详解
摘要
本文将带你深入理解数据链路层的工作原理和核心协议,帮助你掌握可靠数据传输的实现机制。你将学到数据链路层的功能与要求、帧结构与同步方法、差错检测与纠正技术、自动重传请求机制以及典型数据链路协议的特点与应用。
学习目标
阅读完本文后,你将能够:
- 理解链路层功能:掌握数据链路层的核心职责和服务内容
- 识别帧结构:理解各种帧格式及其字段含义
- 应用差错控制:掌握CRC、海明码等差错检测技术
- 分析ARQ机制:理解停止-等待、回退N步、选择重传等协议
- 熟悉典型协议:了解HDLC、PPP、SLIP等协议的特点和应用
本文由”51学通信”(公众号:51学通信,站长:爱卫生)原创分享。数据链路层是网络协议栈的关键层次,理解其工作原理对于深入掌握网络技术至关重要。如需深入交流或获取更多通信技术资料,欢迎添加微信:gprshome201101。
一、数据链路层概述
1.1 数据链路层的功能
数据链路层位于OSI模型的第二层,在物理层提供的服务基础上,向网络层提供服务。
flowchart TD A["数据链路层"] --> B["链路管理"] A --> C["帧封装"] A --> D["帧同步"] A --> E["差错控制"] A --> F["流量控制"] B --> B1["建立、维护、释放链路"] B --> B2["介质访问控制 MAC"] C --> C1["添加帧头帧尾"] C --> C2["地址字段"] C --> C3["类型字段"] D --> D1["比特同步"] D --> D2["帧定界"] E --> E1["差错检测"] E --> E2["差错纠正"] E --> E3["ARQ重传"] F --> F1["防止淹没接收方"] F --> F2["滑动窗口"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表全面展示了数据链路层的五大核心功能。
链路管理负责建立、维护和释放数据链路连接。对于面向连接的服务,需要在数据传输前建立链路,传输结束后释放链路。介质访问控制(MAC)协调多个设备对共享介质的访问,避免冲突。
帧封装是指将网络层的数据包(IP数据报)封装成帧,添加帧头和帧尾。帧头包含地址字段(源MAC地址和目的MAC地址)、类型字段(指示上层协议)。帧尾包含校验和(FCS)。
帧同步是指接收方从比特流中识别帧的边界。比特同步是识别比特的边界(时钟同步),帧同步是识别帧的起始和结束位置。
差错控制通过校验和检测传输错误,通过ARQ(自动重传请求)机制请求重传损坏的帧,某些系统还可以通过前向纠错(FEC)纠正错误。
流量控制通过滑动窗口机制防止发送方发送过快淹没接收方,确保接收方来得及处理接收的数据。
1.2 数据链路层提供的服务
数据链路层向网络层提供三种服务:无确认无连接、有确认无连接、有确认面向连接。
flowchart TD A["数据链路层服务"] --> B["无确认无连接"] A --> C["有确认无连接"] A --> D["有确认面向连接"] B --> B1["不建立链路"] B --> B2["不确认帧"] B --> B3["尽力而为"] B --> B4["应用: 局域网"] C --> C1["不建立链路"] C --> C2["每帧独立确认"] C --> C3["可靠传输"] C --> C4["应用: 无线局域网"] D --> D1["建立链路"] D --> D2["滑动窗口"] D --> D3["保证可靠"] D --> D4["应用: 广域网"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px style B fill:#c8e6c9,stroke:#2e7d32 style C fill:#fff9c4,stroke:#f57f17 style D fill:#ffcdd2,stroke:#c62828
图表讲解:这个图表对比了数据链路层的三种服务类型。
无确认无连接服务是最简单的服务,不建立链路,发送帧后不等待确认,尽最大努力交付。这种服务效率高,但不保证可靠传输。以太网(传统共享式以太网)就是无确认无连接服务——如果需要可靠传输,由上层协议(如TCP)实现。
有确认无连接服务不建立链路,但每帧都独立确认。发送方发送帧后等待确认,超时未收到确认则重传。这种服务提供了可靠传输,但没有链路级的连接概念。无线局域网(IEEE 802.11)使用有确认无连接服务——由于无线信道误码率高,每帧确认是必要的。
有确认面向连接服务在传输数据前建立链路,传输期间维护链路状态,传输结束后释放链路。这种服务使用滑动窗口机制,提供流量控制和差错控制,保证可靠、有序的数据传输。HDLC、PPP等广域网协议使用面向连接服务。
二、帧结构与同步
2.1 帧的基本结构
帧是数据链路层的协议数据单元(PDU),包含帧头、数据字段和帧尾。
flowchart TD A["帧结构"] --> B["帧头"] A --> C["数据字段"] A --> D["帧尾"] B --> B1["标志 Flag"] B --> B2["地址 Address"] B --> B3["控制 Control"] C --> C1["网络层数据包"] C --> C2["长度可变"] C --> C3["有最大长度限制"] D --> D1["校验和 FCS"] D --> D2["标志 Flag"] E["帧定界"] --> E1["标志字节法"] E --> E2["字节计数法"] E --> E3["违规编码法"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表展示了帧的基本组成部分和帧定界方法。
帧头包含三个主要字段:标志字段(Flag,如01111110)用于帧定界和同步;地址字段(Address)标识目的地址(和源地址);控制字段(Control)用于链路管理和控制信息。
数据字段承载网络层的数据包(IP数据报)。数据字段长度可变,但有最大长度限制(MTU,最大传输单元)。以太网的MTU是1500字节,这意味着IP数据报不能超过1500字节(如果超过,需要分片)。
帧尾包含校验和(FCS,帧检验序列),用于检测传输过程中的错误。常用的校验和是CRC(循环冗余校验),可以检测绝大多数传输错误。
帧定界是接收方识别帧边界的过程。标志字节法使用特殊的标志字节(如01111110)作为帧的开始和结束标志。字节计数法在帧头中指示数据字段的长度。违规编码法使用特殊的编码(如曼彻斯特编码的违规序列)作为帧定界。
2.2 字符填充与比特填充
当帧的数据字段中出现与标志字节相同的模式时,需要使用字符填充或比特填充技术。
flowchart TD A["填充技术"] --> B["字符填充<br>Character Stuffing"] A --> C["比特填充<br>Bit Stuffing"] B --> B1["面向字符的协议"] B --> B2["DLE和STX"] B --> B3["效率较低"] C --> C1["面向比特的协议"] C --> C2["0比特插入"] C --> C3["透明传输"] B2a["发送: 遇到标志<br>前插入转义字符"] B2b["接收: 删除转义字符<br>恢复原始数据"] C2a["发送: 连续5个1后插入0"] C2b["接收: 连续5个1后删除0"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表对比了两种填充技术。
字符填充用于面向字符的协议(如PPP)。当数据字段中出现与标志字节相同的模式时,发送方在前面插入转义字符(如DLE),接收方删除转义字符恢复原始数据。这种方式简单但效率较低。
比特填充用于面向比特的协议(如HDLC)。当数据字段中连续出现5个1时,发送方插入一个0,接收方连续收到5个1后删除后面的0。这确保了帧中不会出现连续6个1,因此01111110标志字节是唯一的,可以作为帧定界。这种方式实现了透明传输——任何数据模式都可以传输。
2.3 帧同步机制
帧同步是接收方从比特流中识别帧边界的过程。
sequenceDiagram participant Sender as 发送方 participant Channel as 信道 participant Receiver as 接收方 Sender->>Channel: 发送前导码<br>10101010... Channel->>Receiver: 接收前导码 Note over Receiver: 比特同步<br>锁定时钟 Sender->>Channel: 发送帧开始标志<br>01111110 Channel->>Receiver: 接收标志 Note over Receiver: 帧同步<br>识别帧边界 Sender->>Channel: 发送帧内容 Channel->>Receiver: 接收帧内容 Sender->>Channel: 发送帧结束标志<br>01111110 Channel->>Receiver: 接收标志 Note over Receiver: 帧接收完成<br>准备下一帧
图表讲解:这个序列图展示了帧同步的完整过程。
比特同步是帧同步的前提。发送方在帧之前发送前导码(如以太网使用7字节10101010模式),接收方通过前导码锁定时钟,实现比特同步。
帧同步通过识别帧的起始和结束标志实现。当接收方检测到起始标志(如01111110)时,知道帧开始;当检测到结束标志时,知道帧结束。
有些协议(如以太网)使用前导码和SFD(帧开始定界符)来实现同步。以太网前导码是7字节10101010,SFD是1字节10101011,接收方检测到SFD就知道下一字节是帧的开始。
51学通信站长爱卫生:帧同步是数据链路层的关键技术。如果帧同步失败,接收方无法正确识别帧边界,会导致错帧(帧错位)、漏帧(未能识别帧)或虚假帧(将噪声误认为帧)。现代网络设备使用硬件实现帧同步,速度极快且可靠。
三、差错控制
3.1 差错类型
数据传输过程中可能出现的错误分为单比特错误和突发错误。
| 错误类型 | 定义 | 原因 | 典型场景 |
|---|---|---|---|
| 单比特错误 | 只有一个比特出错 | 随机噪声、脉冲干扰 | 光纤通信 |
| 突发错误 | 连续多个比特出错 | 电磁干扰、信号衰减 | 无线通信、铜缆 |
3.2 差错检测
差错检测是通过校验码检测传输错误的技术。
flowchart TD A["差错检测技术"] --> B["奇偶校验"] A --> C["校验和 Checksum"] A --> D["循环冗余校验 CRC"] B --> B1["1位校验位"] B --> B2["检测奇数个错误"] B --> B3["简单但效率低"] C --> C1["求和取反"] C --> C2["检测多种错误"] C --> C3["应用: IP、TCP、UDP"] D --> D1["多项式除法"] D --> D2["检测能力强"] D --> D3["硬件实现"] D --> D4["应用: 以太网、HDLC"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表对比了三种差错检测技术。
奇偶校验是最简单的差错检测方法。在数据后添加1位校验位,使整个数据中1的个数为奇数(奇校验)或偶数(偶校验)。奇偶校验可以检测奇数个错误,但无法检测偶数个错误,检测能力有限。
校验和(Checksum)是将数据按某种方式求和,取反作为校验字段。IP、TCP、UDP协议都使用校验和。校验和实现简单,可以检测多种错误,但检测能力不如CRC。
循环冗余校验(CRC)是基于多项式除法的差错检测方法。发送方将数据除以生成多项式,余数作为CRC校验码附加到帧后。接收方将整个数据(包括CRC)除以生成多项式,余数为0则表示无错误。CRC的检测能力很强,可以检测几乎所有常见的错误模式。CRC-32(用于以太网)可以检测长达34位突发错误。
3.3 差错纠正
差错纠正不仅检测错误,还能纠正错误。
flowchart TD A["差错纠正技术"] --> B["海明码"] A --> C["卷积码"] A --> D["Reed-Solomon"] A --> E["LDPC"] A --> F["Turbo码"] B --> B1["单比特纠错"] B --> B2["双比特检测"] B --> B3["理论简单"] B --> B4["需要额外校验位"] C --> C1["卷积编码"] C --> C2["维特比解码"] C --> C3["前向纠错"] C --> C4["应用: 无线通信"] D --> D1["多字节纠错"] D --> D2["突发错误纠正"] D --> D3["应用: CD、DVD、QR码"] E --> E1["低密度奇偶校验码"] E --> E2["接近香农极限"] E --> E3["应用: Wi-Fi 6、5G"] F --> F1["并行级联卷积码"] F --> E2["高性能"] E3["应用: 3G、4G"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表介绍了五种主要的差错纠正技术。
海明码是最早的差错纠正码,可以纠正单比特错误,检测双比特错误。海明码在数据中插入多个校验位,每个校验位覆盖特定的数据位。通过检查校验位的状态,可以定位出错的比特并纠正它。海明码的效率不高(需要较多的校验位),但理论简单,易于理解。
卷积码是编码有记忆的纠错码,输出不仅取决于当前输入,还取决于之前的输入。维特比算法是卷积码的高效解码算法。卷积码广泛应用于无线通信(如GSM、CDMA、Wi-Fi),通常与交织技术结合使用以抵抗突发错误。
Reed-Solomon码是一种基于多项式的纠错码,特别擅长纠正突发错误。Reed-Solomon码被广泛应用于CD、DVD、QR码、数据存储、卫星通信等领域。CD使用的CIRC(交叉交织里德-所罗门码)可以纠正长达4000比特的突发错误。
LDPC(低密度奇偶校验码)是一种性能接近香农极限的纠错码,解码复杂度相对较低。Wi-Fi 6(802.11ax)和5G NR都采用了LDPC码作为数据信道的纠错码。
Turbo码是并行级联卷积码,性能接近香农极限,但解码复杂度高、延迟大。Turbo码被3G和4G蜂窝网络采用。
四、自动重传请求(ARQ)
4.1 ARQ概述
自动重传请求(ARQ)是通过重传来实现可靠传输的机制。
flowchart TD A["ARQ机制"] --> B["停止-等待 ARQ"] A --> C["回退N步 ARQ"] A --> D["选择重传 ARQ"] B --> B1["发送一帧<br>等待确认"] B --> B2["简单但效率低"] B --> B3["应用: 可靠信令"] C --> C1["发送窗口 > 1"] C --> C2["累计确认"] C --> C3["出错后回退N步"] C --> C4["应用: HDLC"] D --> D1["发送窗口 > 1"] D --> D2["选择性重传"] D --> D3["需要接收窗口"] D --> D4["应用: 高性能场景"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表对比了三种ARQ机制。
停止-等待ARQ是最简单的ARQ机制。发送方发送一帧后,停止发送并等待确认。收到确认后发送下一帧,超时未收到确认则重传。这种机制简单但效率低,因为发送方在等待确认期间什么都不做。
回退N步ARQ使用滑动窗口,发送窗口大于1。发送方可以连续发送多帧,接收方采用累计确认(ACK n表示n及以前的所有帧都正确接收)。如果发送方发现某个帧出错或超时,则”回退”到该帧,重传该帧及之后的所有帧。这种机制提高了效率,但会重传已经正确接收的帧,浪费带宽。
选择重传ARQ也使用滑动窗口,但只重传出错或超时的帧,不重传已经正确接收的帧。接收方需要维护接收窗口,缓存乱序到达的帧。选择重传ARQ效率最高,但实现最复杂——需要更大的序列号空间、缓存机制、重传排序机制。
4.2 滑动窗口机制
滑动窗口是流量控制和ARQ的核心机制。
flowchart LR subgraph Sender["发送方"] S1["已发送已确认<br>Seq ≤ ACK"] S2["已发送未确认<br>ACK < Seq ≤ ACK + N"] S3["可用窗口<br>可以发送"] S4["不可用<br>窗口外"] end subgraph Receiver["接收方"] R1["期望接收<br>Seq = Expected"] R2["接收窗口<br>可以接收"] end S2 -->|"收到ACK后<br>窗口右移"| S3 R2 -.->|"通告接收窗口"| S2 style S2 fill:#ffcdd2,stroke:#c62828 style S3 fill:#c8e6c9,stroke:#2e7d32 style R2 fill:#fff9c4,stroke:#f57f17
图表讲解:这个图表展示了滑动窗口的工作原理。
发送方维护发送窗口,窗口内的帧可以发送。窗口分为四个部分:已发送已确认(Seq ≤ ACK)、已发送未确认(ACK < Seq ≤ ACK + N,红色,窗口右边界)、可用窗口(绿色,可以发送)、不可用(窗口外,暂时不能发送)。
接收方维护接收窗口,表示可以接收的序列号范围。接收方在每个确认中通告期望接收的序列号和接收窗口大小。
当发送方收到确认时,窗口向右滑动,可以发送新的帧。如果接收方的接收窗口缩小,发送方的可用窗口也会相应缩小。
滑动窗口机制同时实现了流量控制和ARQ。流量控制是通过接收窗口大小限制发送方的发送速率。ARQ是通过超时和确认来检测丢失的帧并重传。
4.3 三种ARQ机制对比
| 特性 | 停止-等待 | 回退N步 | 选择重传 |
|---|---|---|---|
| 发送窗口大小 | 1 | N | N |
| 接收窗口大小 | 1 | 1 | N |
| 确认方式 | 单帧确认 | 累计确认 | 选择确认 |
| 重传策略 | 出错帧 | 出错帧及之后所有帧 | 仅出错帧 |
| 带宽效率 | 低 | 中 | 高 |
| 实现复杂度 | 低 | 中 | 高 |
| 缓存需求 | 小 | 小 | 大 |
| 序列号空间 | 1位 | 若干位 | 更大 |
五、典型数据链路协议
5.1 HDLC协议
高级数据链路控制(HDLC)是一种经典的面向比特的数据链路协议。
flowchart TD A["HDLC帧结构"] --> B["标志 Flag 8位"] A --> C["地址 Address 8位"] A --> D["控制 Control 8位"] A --> E["数据 Data 可变"] A --> F["校验和 FCS 16/32位"] A --> G["标志 Flag 8位"] B --> B1["01111110"] B1 --> B2["帧定界"] D --> D1["信息帧 I-Format"] D --> D2["监督帧 S-Format"] D --> D3["无编号帧 U-Format"] D1 --> D1a["携带数据"] D1 --> D1b["P/F位轮询/最终"] D1 --> D1c["N(S)发送序列号"] D1 --> D1d["N(R)接收序列号"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表展示了HDLC帧的结构和控制字段类型。
HDLC帧以标志字节(01111110)开始和结束。地址字段标识次站地址(在点到点链路中不重要)。控制字段区分帧类型和携带控制信息。
控制字段有三种类型:信息帧(I帧)携带用户数据,包含发送序列号N(S)和接收序列号N(R);监督帧(S帧)用于流量控制和差错控制,不携带数据;无编号帧(U帧)用于链路管理(建立、释放链路)。
HDLC支持三种传输模式:正常响应模式(NRM)、异步响应模式(ARM)、异步平衡模式(ABM)。NRM用于主从结构(一个主站、多个次站),ARM也是主从结构但次站可以主动发送,ABM是点到点的平衡模式。
5.2 PPP协议
点对点协议(PPP)是目前最广泛使用的数据链路协议,用于路由器之间的连接和用户接入互联网。
flowchart TD A["PPP协议"] --> B["帧格式"] A --> C["链路控制协议 LCP"] A --> D["网络控制协议 NCP"] A --> E["认证协议"] B --> B1["标志 1字节"] B --> B2["地址 1字节"] B --> B3["控制 1字节"] B --> B4["协议 2字节"] B --> B5["数据 可变"] B --> B6["校验和 2/4字节"] C --> C1["建立链路"] C --> C2["配置参数"] C --> C3["检测链路故障"] C --> C4["关闭链路"] D --> D1["IPCP"] D --> D2["IPXCP"] D --> D3["其他NCP"] E --> E1["PAP"] E --> E2["CHAP"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表展示了PPP的组成部分。
PPP帧包含标志(01111110)、地址(0xFF,固定值)、控制(0x03,固定值)、协议(指示上层协议)、数据和校验和。地址和控制字段固定是为了兼容HDLC,但PPP不使用它们。
LCP(链路控制协议)用于建立、配置、维护和终止数据链路连接。LCP可以协商最大接收单元(MRU)、认证协议、魔术数(用于环路检测)等参数。
NCP(网络控制协议)用于配置网络层协议。IPCP用于配置IP协议参数(如IP地址),IPXCP用于配置IPX协议。
PPP支持两种认证协议:PAP(口令认证协议)和CHAP(挑战握手认证协议)。PAP简单但安全性较低,口令以明文传输。CHAP更安全,使用挑战-响应机制,口令不直接传输。
5.3 以太网帧格式
以太网是最常用的局域网技术,其帧格式经过多次演变。
flowchart TD A["以太网帧演变"] --> B["Ethernet II (DIX)"] A --> C["IEEE 802.3"] A --> D["IEEE 802.1Q VLAN"] B --> B1["目的MAC 6字节"] B --> B2["源MAC 6字节"] B --> B3["类型 2字节"] B --> B4["数据 46-1500字节"] B --> B5["校验和 4字节"] C --> C1["前导码 8字节"] C --> C2["目的MAC 6字节"] C --> C3["源MAC 6字节"] C --> C4["长度 2字节"] C --> C5["数据 46-1500字节"] C --> C6["校验和 4字节"] D --> D1["目的MAC 6字节"] D --> D2["源MAC 6字节"] D --> D3["VLAN标签 4字节"] D --> D4["类型/长度 2字节"] D --> D5["数据 46-1500字节"] D --> D6["校验和 4字节"] D3 --> D3a["TPID 2字节<br>0x8100"] D3 --> D3b["TCI 2字节<br>VLAN ID + Priority"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表展示了以太网帧的演变过程。
Ethernet II(也称DIX格式)是最早的以太网帧格式,由DEC、Intel、Xerox三家公司制定。帧中包含目的MAC地址、源MAC地址、类型字段(指示上层协议,如0x0800表示IP)、数据和校验和。
IEEE 802.3标准将类型字段改为长度字段(指示数据长度),并在数据字段添加了LLC(逻辑链路控制)子层。实际上,为了向后兼容,当长度/类型字段值大于1500时,仍然解释为类型字段。
IEEE 802.1Q是VLAN(虚拟局域网)标签标准,在传统以太网帧中插入4字节VLAN标签。VLAN标签包含TPID(标签协议标识符,固定为0x8100)和TCI(标签控制信息)。TCI包含3位优先级、1位CFI(规范格式指示符)、12位VLAN ID。VLAN标签用于隔离广播域,实现逻辑网络划分。
六、数据传输模式
6.1 单工、半双工与全双工
数据传输模式定义了数据在两个方向上的传输方式。
flowchart TD A["数据传输模式"] --> B["单工 Simplex"] A --> C["半双工 Half-Duplex"] A --> D["全双工 Full-Duplex"] B --> B1["只能单向传输"] B --> B2["发送和接收固定"] B --> B3["应用: 广播电视"] C --> C1["双向但不能同时"] C --> C2["需要切换方向"] C --> C3["应用: 对讲机、共享以太网"] D --> D1["双向且可同时"] D --> D2["无冲突"] D --> D3["应用: 电话、交换以太网"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表对比了三种数据传输模式。
单工模式只能单向传输,发送方固定为发送方,接收方固定为接收方。广播电视是典型的单工传输——电视台发送,电视机接收,观众不能向电视台发送信号。
半双工模式支持双向传输,但不能同时进行。发送方和接收方需要切换角色。对讲机是半双工的典型——按住按钮说话(发送),松开按钮收听(接收)。传统共享以太网也是半双工的,某时刻只能有一方发送。
全双工模式支持双向同时传输,发送方和接收方可以同时发送和接收。电话是全双工的——双方可以同时说话。交换以太网提供全双工模式,点到点链路上可以实现同时收发,无冲突,速率翻倍。
51学通信站长爱卫生:全双工是现代网络的主流。对于点到点链路(如计算机与交换机之间),应该使用全双工模式以获得更好的性能。全双工模式不需要CSMA/CD机制,消除了冲突,提高了链路利用率。在配置网络设备时,要注意速率和双工模式的匹配——速率和双工模式不匹配是网络性能下降的常见原因。
6.2 同步传输与异步传输
同步传输和异步传输是两种不同的字符/字节同步方式。
| 特性 | 同步传输 | 异步传输 |
|---|---|---|
| 同步方式 | 共享时钟 | 起止位同步 |
| 传输单位 | 字符块 | 字符 |
| 效率 | 高 | 低 |
| 实现复杂度 | 高 | 低 |
| 应用 | 高速网络 | 低速设备、串口 |
七、核心概念总结
核心概念总结
| 概念 | 定义 | 应用场景 | 注意事项 |
|---|---|---|---|
| 数据链路层 | OSI模型第二层 | 链路管理、帧传输 | 介于物理层和网络层之间 |
| 帧 | 数据链路层PDU | 封装网络层数据 | 包含帧头、数据、帧尾 |
| 帧同步 | 识别帧边界 | 接收方识别帧 | 需要比特同步作为前提 |
| 差错检测 | 检测传输错误 | 校验和、CRC | CRC检测能力强 |
| 纠错码 | 检测并纠正错误 | 前向纠错 | 需要额外开销 |
| ARQ | 通过重传实现可靠传输 | 数据链路层 | 停止-等待、回退N步、选择重传 |
| 滑动窗口 | 流量控制和ARQ机制 | 高性能协议 | 窗口大小影响性能 |
| PPP | 点对点协议 | 广域网接入 | 支持多种网络层协议 |
常见问题解答
Q1:为什么以太网的MTU是1500字节?
答:以太网的MTU(最大传输单元)是1500字节,这个数值有历史和技术原因,也考虑了多种因素的平衡。
从历史看,早期的以太网(10Base5和10Base2)使用共享介质,采用CSMA/CD机制。如果帧太长,占用介质时间太长,其他设备需要等待更久,冲突概率增加。实验发现1500字节是一个较好的平衡点——足够大以容纳大多数IP数据报,又不太大以至于严重影响冲突性能。
从技术看,1500字节的MTU对应1518字节的以太网帧(18字节帧头帧尾+1500字节数据)。这个长度使得错误帧的检错效率较高——如果帧太长,出错概率增加,重传开销也大。1500字节的错误率在一个可接受范围内。
另外,1500字节也考虑了内存管理的因素。早期的内存资源有限,1500字节是2的幂次方的近似值,便于内存分配和缓存管理。
当然,1500字节并非不可改变。千兆以太网引入了巨型帧(Jumbo Frame),MTU可达9000字节。巨型帧提高了效率(头部开销占比更小),但也带来了兼容性问题(不是所有设备都支持)、内存占用更大、错误影响更大等问题。
51学通信提示:在配置网络时,要注意端到端的MTU匹配。如果某条路径上的MTU较小(如VPN隧道),而发送方使用较大的MTU,会导致分片或丢包。使用Path MTU Discovery(PMTUD)机制可以动态发现路径上的最小MTU。
Q2:滑动窗口的窗口大小如何确定?
答:滑动窗口的窗口大小是影响协议性能的关键参数,需要综合考虑多个因素。
首先是传播延迟与带宽的乘积(BDP,Bandwidth-Delay Product)。BDP表示链路上能够”在途”的数据量,即从发送第一个比特到收到确认这段时间内可以发送的比特数。窗口大小至少应该等于BDP才能充分利用链路容量。例如,100Mbps带宽、50ms延迟的链路,BDP=100Mbps×0.05s=5Mb=625KB,窗口大小至少要625KB才能填满管道。
其次是接收方的缓冲区大小。窗口大小不能超过接收方的缓冲区大小,否则接收方无法缓存接收到的数据。接收方会在确认中通告接收窗口大小(rwnd),发送方不能超过这个限制。
再者是链路的稳定性。如果链路不稳定,丢包率高,窗口大小不宜太大。大窗口意味着有很多数据在传输中,一旦丢包,需要重传大量数据。
还有协议的限制。TCP的窗口大小受限于窗口字段(16位)和窗口缩放选项。窗口缩放选项可以将窗口大小扩展到2^30字节,但实际窗口大小还受限于接收缓冲区、拥塞窗口等因素。
实践中,操作系统会自动调整窗口大小。Linux的默认初始窗口通常在10-20个报文段,然后根据网络状况动态调整。高延迟、高带宽的链路(如跨国链路、卫星链路)需要更大的窗口。
Q3:回退N步和选择重传应该如何选择?
答:回退N步和选择重传是两种不同的ARQ机制,各有优势和适用场景。
回退N步的主要优势是实现简单。它只需要维护一个发送窗口,接收窗口大小为1(只按序接收),不需要缓存乱序到达的帧。这意味着接收方的内存需求小,实现简单。
回退N步的主要缺点是会重传已经正确接收的帧。如果窗口较大且出错位置靠前,需要重传大量数据,浪费带宽。
选择重传的主要优势是效率高。它只重传出错或丢失的帧,不重传已经正确接收的帧。这对于高延迟、高带宽的链路尤其重要——重传开销小,利用率高。
选择重传的主要缺点是实现复杂。接收方需要维护接收窗口,缓存乱序到达的帧,支持重新排序。发送方和接收方需要更大的序列号空间以避免歧义。
从应用场景看,回退N步适用于链路质量较好(出错率低)、窗口较小的场景。传统的HDLC协议使用回退N步。选择重传适用于链路质量较差(出错率高)、窗口较大的场景。现代高性能协议(如TCP)实际上采用了选择重传和快速重传的混合机制。
51学通信站长爱卫生认为:选择ARQ机制时,要权衡性能和复杂度。对于低速、短距离链路,回退N步已经足够;对于高速、长距离链路,选择重传的价值更明显。在实际应用中,还可以结合前向纠错(FEC)来减少重传次数。
Q4:为什么CRC比奇偶校验和校验和更可靠?
答:CRC相比奇偶校验和校验和更可靠,是因为它在检测错误能力和数学原理上都有优势。
从检测能力看,奇偶校验只能检测奇数个错误,无法检测偶数个错误,检测能力极差。校验和(如Internet校验和)采用求和取反的方法,可以检测多种错误,但对于某些特定的多位错误模式可能检测不到。
CRC基于多项式除法,将数据视为一个大的多项式,除以生成多项式,余数作为CRC码。从数学上可以证明,精心选择的生成多项式使得CRC可以检测几乎所有常见的错误模式。CRC-32可以检测所有长度不超过32位的突发错误,对于长度超过32位的突发错误,检测概率为1-2^-32(约40亿分之一)。
CRC的另一个优势是硬件实现高效。CRC校验可以通过移位寄存器和异或门实现,速度极快。现代网卡芯片都内置了CRC计算硬件,几乎不增加处理延迟。
CRC的”距离”特性也很好。不同的生成多项式会产生不同的CRC码,它们的”汉明距离”(能够检测/纠正错误的能力)不同。通过选择好的生成多项式,可以获得很大的汉明距离。
当然,CRC不是完美的。CRC无法检测所有错误(如数据被另一个也是CRC有效的数据替换)。但对于正常传输环境中的随机错误,CRC的检测能力已经足够。
Q5:PPP协议为什么能取代SLIP协议?
答:PPP(点对点协议)相比SLIP(串行线路互联网协议),在功能、可靠性和扩展性方面都有显著优势,这是PPP能够取代SLIP的根本原因。
从功能看,SLIP只支持IP协议,是一个非常简单的封装协议——在IP数据报前后添加特殊的标志字节(0xC0)。PPP支持多种网络层协议(IP、IPX、AppleTalk等),通过NCP(网络控制协议)可以方便地扩展支持新的协议。PPP还支持认证、压缩、加密等功能,SLIP完全不支持这些。
从可靠性看,SLIP没有差错检测机制,无法发现传输错误。PPP包含2或4字节的校验和(CRC-16或CRC-32),可以检测传输错误。PPP还可以通过链路质量监控功能评估链路质量,动态调整参数。
从链路管理看,SLIP没有链路管理功能,不能建立、配置、维护、关闭链路。PPP的LCP(链路控制协议)提供了完整的链路管理功能,可以协商最大接收单元、认证协议、魔术数等参数。LCP还可以检测链路环路(通过魔术字段)、链路故障。
从应用看,SLIP主要用于低速串行线路(如9600bps拨号线路),在宽带时代已经完全淘汰。PPP不仅支持串行线路,还支持以太网(PPPoE)、同步链路(如SONET)、无线链路等多种物理层。PPP是目前最广泛使用的点对点协议。
虽然PPP后来也被更先进的协议(如PPP over Ethernet、PPP over ATM)部分取代,但PPP的核心思想(链路控制、网络控制分离)被继承了下来。
总结
本文系统介绍了数据链路层的核心功能、帧结构与同步方法、差错检测与纠正技术、ARQ机制以及典型数据链路协议。
通过学习,你应当理解了数据链路层在网络协议栈中的位置和作用,掌握了帧封装和帧同步的实现原理,了解了CRC、海明码等差错控制技术,理解了停止-等待、回退N步、选择重传等ARQ机制,以及HDLC、PPP、以太网等典型协议的特点和应用。
数据链路层是网络协议栈的关键层次,它将不可靠的物理层转变为可靠的数据链路,为网络层提供服务。理解数据链路层的工作原理,有助于深入理解网络通信的底层机制。
下篇预告
下一篇我们将深入探讨无线网络与安全技术,带你了解无线技术的发展历程、无线局域网的工作原理、无线个人区域网络的技术特点以及无线网络的安全挑战与解决方案。