数据链路层
数据链路层研究的是在同一个局域网中,分组怎样从一台主机传送到另一台主机
而网络层研究的是分组怎样从一个网络通过路由器转发到另一个网络
数据链路层的地位:使用物理层提供的“比特传输”服务,同时为网络层提供服务,将网络层的IP数据报(分组)封装成帧,传输给下一个相邻节点
数据链路层的主要工作:
- 错误识别(notification)
- 网络拓扑(Network topology)
- 流控制(Flow control)
第一层与第二层的区别: 第一层无法与上层通信;第二层通过逻辑链路控制(LLC)实现。 第一层无法决定组中哪台主机发送或接收二进制数据;第二层通过媒体访问控制(MAC)实现。 第一层无法命名或识别计算机;第二层使用寻址(或命名)过程。 第一层只能描述比特流;第二层使用成帧来组织或分组比特。
[!NOTE]
第二层提供的服务
提供给网络层的三层服务
- (最弱,最不靠谱的)没有确认(acknowledgement)的无连接(Connectionless)服务
- 发送取出就行,不用等收到确认
- 可靠(Reliable)的链接(上层以确保数据正确性)
- 实时任务,比较高效
- 适用于大多数局域网
- 带有确认的无连接服务:不可靠的链接,例如无线网络:需要保证一定的通信质量(比如无线网络的传输),同时会损失一定的性能。
- 带有确认的连接服务
- 比如蓝牙:需要先确定绑定关系才能进行通信
- 手机和手机之间的蓝牙连接需要确定一些信息
三种服务的连接的不同和区别:
- 无线连接和有线连接相比多了确认的过程
- 网线连接:我们通信的对象是路由器,由路由器进行转发
- PPPoP 是路由器和远端的服务器的连接
- 有线无线都接给路由器,都需要连接,但是无线网相对有线网需要确认(包确认)
数据链路层的三个基本问题
封装成帧
透明传输
差错检测
PPP协议
PPP协议的核心目标是在两个点对点的设备(比如你的电脑和ISP的调制解调器)之间建立一条可靠、可认证、并且能承载多种网络层协议(如IP协议) 的数据链路。
PPP帧格式的总体结构
PPP帧的格式非常简洁,它去掉了像以太网那样的MAC地址字段(因为点是点对点的,不需要地址),其标准结构如下所示:
1
2
| 标志域(F) | 地址域(A) | 控制域(C) | 协议域(Protocol) | 信息域(Payload) | 帧检验序列(FCS) | 标志域(F) |
| 1字节 | 1字节 | 1字节 | 2字节 | 0-1500字节 | 2/4字节 | 1字节 |
各字段的详细意义
标志域 (Flag - 1字节)
- 值: 固定为
0x7E(二进制01111110)。 - 作用: 帧的定界符。就像信封的封口,用来标识一个帧的开始和结束。
- 重要规则: 两个标志符之间的数据区(地址、控制、协议、信息、FCS)不允许出现
0x7E这个值,否则接收方会误以为帧提前结束了。这就是需要“字节填充”的原因。
- 值: 固定为
地址域 (Address - 1字节)
- 值: 固定为
0xFF(二进制11111111)。 - 作用: 在点对点通信中,只有一个发送方和一个接收方,不需要复杂的地址。所以这个字段被保留下来,并固定为“广播地址”,表示“所有站都应接收这个帧”。实际上这个字段并无实际用处,只是为了兼容早期的协议。
- 值: 固定为
控制域 (Control - 1字节)
- 值: 固定为
0x03(二进制00000011)。 - 作用: 表示这是一个“无编号帧”(Unnumbered Frame),即不采用序列号和确认机制进行流量控制。PPP协议假定链路是可靠的,或者由上层协议(如TCP)来处理可靠性问题。因此,它使用最简单的无连接模式。这个字段也基本是固定的。
小结: 地址域和控制域实际上是PPP为了保持格式统一而保留的“历史遗迹”,它们在现代PPP中几乎没有作用。有时在优化中,它们甚至可以通过协商被压缩掉。
- 值: 固定为
协议域 (Protocol - 2字节)
- 作用: 这是非常关键的一个字段!它用来指明信息域(Payload)中封装的是哪种协议的数据包。接收方根据这个字段来决定将数据交给哪个上层协议处理。
- 常见值举例:
0x0021: 信息域是 IP 数据报(最常见的情况)。0xC021: 信息域是 PPP 链路控制数据(LCP),用于链路协商。0x8021: 信息域是 PPP 网络控制数据(NCP),如IPCP。0xC023: 信息域是 PAP 认证协议的数据。
信息域 (Information/Payload - 0 或更多字节,通常不超过1500)
- 作用: 这是帧的“货物区”,承载着真正的有效数据,即上层协议传递下来的数据包(如IP数据包、LCP协商报文等)。
- 长度: 默认最大长度是1500字节(MTU),但这个值可以在LCP协商阶段改变。
帧检验序列 (FCS - 2 或 4字节)
- 作用: 差错检测。发送方会对整个帧(从地址域到信息域)进行计算,得出一个校验和,并填入FCS字段。接收方收到帧后,会进行同样的计算。如果计算结果与FCS字段的值不匹配,就说明帧在传输过程中出错了,该帧会被直接丢弃。
- 常用算法: CRC(循环冗余校验)。
核心问题:字节填充与零比特填充
现在来解决最关键的技术点:如何确保在信息域中不会出现和标志位 0x7E 一样的字节,从而干扰帧的定界?
PPP协议有两种处理方式,分别用于不同的数据链路。
1. 异步链路与字节填充(Byte Stuffing)
- 适用场景: 异步链路,如传统的拨号Modem连接。这种链路以字节为单位传输。
- 问题: 要防止信息域中出现
0x7E这个字节。 - 解决方案: 使用一种特殊的转义字符
0x7D。 - 规则(发送方):
- 将信息域中出现的每一个
0x7E字节,替换成双字节序列(0x7D, 0x5E)。0x7D是转义字符(ESC)。0x5E是0x7E字符与0x20进行异或(XOR)运算后的结果(0x7E XOR 0x20 = 0x5E)。
- 将信息域中出现的每一个
0x7D字节本身(因为转义字符也需要转义),替换成双字节序列(0x7D, 0x5D)。(0x7D XOR 0x20 = 0x5D)。 - 同时,如果协议协商同意,还可以将数值小于
0x20的控制字符(如ASCII码中的0x01, 0x03等)也进行转义,以增加链路的可靠性。例如,0x01会被替换为(0x7D, 0x21)。(0x01 XOR 0x20 = 0x21)。
- 将信息域中出现的每一个
- 规则(接收方):
- 当收到
0x7D时,就知道它是一个转义序列。它会删除这个0x7D,并将其后续的字节与0x20进行异或操作,还原出原始数据。- 收到
(0x7D, 0x5E)-> 还原为0x7E。 - 收到
(0x7D, 0x5D)-> 还原为0x7D。
- 收到
- 当收到
2. 同步链路与零比特填充(Bit Stuffing)
- 适用场景: 同步链路,如SDH/SONET、PPP over Ethernet等。这种链路以连续的比特流传输,不需要每个字节都有起始位和停止位。
- 问题: 要防止在数据比特流中出现与标志位
01111110(6个连续的1)相同的模式。 - 解决方案: 比特级的填充。
- 规则(发送方):
- 在帧的开始和结束处放入标志字节
01111110。 - 在发送数据部分(地址域到FCS)时,只要连续出现5个“1”,发送方就会自动插入一个“0”。
- 例如,原始数据中有
...11111...(5个1),发送方会将其变为...111110...。
- 例如,原始数据中有
- 这样做的目的是确保在整个帧的数据部分,永远不会出现6个连续的“1”,从而不会与标志位混淆。
- 在帧的开始和结束处放入标志字节
- 规则(接收方):
- 接收方在检测到起始标志
01111110后,开始接收数据。 - 在接收数据流时,只要连续收到5个“1”,就会检查下一位。
- 如果下一位是 “0”,则删除这个“0”,继续接收后续数据。这个“0”就是发送方插入的填充比特。
- 如果下一位是 “1”,则再检查再下一位。如果此时是“0”,则意味着收到了结束标志
01111110,帧接收结束。
- 接收方在检测到起始标志
总结
| 特性 | 字节填充 | 零比特填充 |
|---|---|---|
| 适用链路 | 异步链路(如拨号) | 同步链路(如SDH) |
| 核心思想 | 用转义字符(0x7D)替换特殊字节 | 在数据中5个连续“1”后插入一个“0” |
| 防止出现 | 标志字节 0x7E | 标志模式 01111110(6个1) |
| 操作级别 | 字节级 | 比特级 |
PPP协议通过这种精巧的帧格式和填充机制,实现了在点对点链路上透明地传输任何数据(无论数据内容是什么,都不会干扰帧的定界),从而为上层网络协议提供了一个坚实可靠的数据传输通道。
PPP协议的工作状态
为了实现这个目标,PPP连接不是一上来就能传数据的,它必须经历一个清晰的“握手”和“协商”过程。这个过程就被划分成了几个不同的状态。
状态1:链路静止(Link Dead)
- 比喻: 电话听筒放在桌子上,线路是断开的。
- 描述: 这是初始状态和最终状态。表示物理连接还不可用(例如,网线没插,调制解调器没通电)。
- 动作: PPP协议在这个状态下什么都不做,只是等待物理信号的出现。一旦物理层信号建立(例如,调制解调器拨号成功,听到了“握手音”),PPP就会切换到下一个状态。
状态2:链路建立(Link Establishment)
- 比喻: 拿起电话,开始拨号,和对方互相“喂?听得到吗?”,确认通信线路是畅通的。
- 描述: 这个阶段的核心是LCP协商。LCP(链路控制协议)是PPP的一个子协议,负责建立、配置和测试数据链路连接。
- 协商内容: 双方会协商一些重要的数据链路层参数,比如:
- 最大接收单元(MRU): 数据帧的最大长度。
- 认证协议(Authentication Protocol): 接下来使用哪种认证方式(PAP还是CHAP?)。
- 是否启用压缩、差错检测等选项。
- 结果:
- 成功: 如果LCP配置请求和应答都成功(双方就参数达成一致),状态进入“认证阶段”或直接进入“网络层协议阶段”。
- 失败: 如果协商失败,则会退回“链路静止”状态。
状态3:认证阶段(Authentication)(可选但常见)
- 比喻: 对方问你:“你是谁?请证明你的身份!”(比如让你输入用户名和密码)。
- 描述: 这是在LCP协商阶段决定的是否需要认证。这是一个安全步骤,确保连接的另一端是合法的设备(比如,确保你是这个ISP的合法用户)。
- 认证协议:
- PAP(密码认证协议): 简单但不安全。客户端直接以明文发送用户名和密码。就像直接对着电话喊出密码。
- CHAP(挑战握手认证协议): 更安全。服务器发送一个“挑战”随机数给客户端,客户端用密码和这个随机数计算出一个哈希值发回给服务器。服务器自己也计算一遍进行验证。密码本身永远不会在线上传输。
- 结果:
- 成功: 状态进入“网络层协议阶段”。
- 失败: 连接终止,退回“链路静止”状态。
状态4:网络层协议阶段(Network-Layer Protocol)
- 比喻: 身份确认后,你们开始商量用什么“语言”交流正事。“我们用英语聊天气?用中文聊股票?”
- 描述: 这个阶段的核心是NCP协商。NCP(网络控制协议)其实是一个协议族,PPP之所以能支持多种网络层协议,靠的就是不同的NCP。最常见的NCP是IPCP(Internet协议控制协议),它负责为上层的IP协议配置参数。
- 协商内容(以IPCP为例):
- 为通信双方分配或确认IP地址。
- 结果: 一旦NCP协商成功(例如,IPCP配置完成),链路就进入了链路打开状态,可以开始传输网络层数据包了。
状态5:链路打开(Link Open)
- 比喻: 正式开始通话,交流你们真正想说的内容。
- 描述: 这是数据传输阶段。PPP链路正式承载网络层数据包(比如IP数据报)。同时,链路上还会定时交换LCP的回送请求和应答,以监测链路的质量(链路存活检测)。
- 结束: 当数据传输完成,或用户手动断开连接,或检测到链路故障时,会通过交换LCP的终止帧来优雅地关闭链路,然后回到“链路静止”状态。
你可以把PPP的状态机想象成一个严格的三次握手:
- 物理层握手: 链路建立(LCP) -> “我们能通吗?”
- 安全层握手: 认证(如果需要) -> “你是谁?”
- 网络层握手: NCP配置 -> “我们聊什么?怎么聊?”
只有这三步都成功了,真正的通信(数据传输)才会开始。这个过程确保了PPP链路的可靠性、安全性和多功能性。

