【计算机网络】数据链路层

【计算机网络】数据链路层

数据链路(data link)是两个设备进行通信的必要前提,数据链路由物理链路(硬件)和必要协议(软件)构成

现在的网卡(Network Interface Card)都实现了这些协议,即在 4 层中网卡位于两层:物理层和数据链路层。

数据链路通信的信道主要有两种:

  1. 点对点通信
  2. 广播通信

针对这两种信道,分别由点对点协议(PPP)和载波监听多点接入/碰撞检测(CSMA/CD)进行传输控制。

点对点协议 PPP

在网络发展初期因为联网环境很差,所以需要一个高可靠性的协议来保障数据链路的可靠传输。高级数据链路控制 HDLC (High-level Data Link Control)协议是比较流行的数据链路层协议,后来因为联网环境的改善以及拨号上网(需要进行用户鉴权)的流行,更简单的 PPP 协议(Point to Point Protocol)逐渐成为使用广泛的数据链路层协议。 PPP 协议针对的是点对点的链路。

HDLC 和 PPP 的区别[1]

HDLC PPP
全称 High-level Data Link Layer Protocol Point-to-Point Protocol
协议类型 面向比特位(Bit)协议 面向字节(异步)和比特位(同步)
用于 同步传输 同步和异步传输
认证 不支持 支持
动态地址 不支持 支持

PPP 协议是 IETF 在 1992 年制定的,经过 1993 年和 1994 年的修订,现在的 PPP 协议在 1994 年就已成为互联网的正式标准[RFC 1661][2]

特点

  1. 实现简单,利于不同协议的互操作
  2. 全双工
  3. 将上层数据封装成帧进行传输
  4. 支持多种 Hosts、Bridge、Routers 建立连接

PPP 帧

  • F(Flag) 帧标识字段规定为 0x7E
  • A(Address) 地址字段规定为 0xFF(没有进一步设计)
  • C(Control) 控制字段规定为 0x03(没有进一步设计)
  • FCS 使用 CRC 生成的 PPP 帧校验序列

如果 PPP Packet 里也有标志字段该如何处理?

采用填充方式解决该问题,具体做法因为 PPP 同步和异步传输对象的不同(bit、Byte)又分为字节填充和零比特填充。

字节填充方式定义转移符为0x7D,操作如下:

  1. 0x7E => 0x7D,0x5E
  2. 0x7D => 0x7D,0x5D
  3. 若出现 ASCII 的控制字符(小于 0x20 的字符)则在该字符钱加入0x7D同时改变该字符的编码。例如:0x03 => 0x7D,0x23

零比特填充方式比较简单,扫描比特序列,发现 5 个连续的 1 就在其后填入一个 0

接收端接收到以上填充过的数据后,采取相反的操作即可还原 PPP Packet。

协议组成

PPP 协议由三部分组成,分别是数据封装方法、链路控制协议(LCP, Link Control Protocol)、网络控制协议(NCP, Network Control Protocol)。

封装方法(PPP Packet)

协议字段:标识数据字段是什么协议,值必须是一个奇数。

含义
0x0000 - 0x3FFF 网络层协议
0x8000 - 0xBFFF NCP 协议
0x4000 - 0x7FFF 没有 NCP 控制的小流量
0xC000 - 0xFFFF LCP 协议
0x0001 Padding Protocol
0xC023 PAP(Password Authentication Protocol)
0xC025 链接质量报告

数据字段:0 到多个字节由协议字段表示的协议数据,数据加填充的字节数最大为一个 MRU(Maximum Receive Unit)长度,默认为 1500 字节

填充字段:顾名思义,填充数据长度至 MRU

LCP

用于配置 PPP 链接、停止链接、检测回环和错误。

数据包格式:

Code: 一个字节,标识 LCP 数据包的具体类型,当一个未知类型的 LCP 被收到时,接收端将会回复一个Code-RejectLCP 包。

Code 包类型 用途
1 Configure-Request 配置请求
2 Configure-Ack 配置项确认响应
3 Configure-Nak 一些配置项的值不被接受响应
4 Configure-Reject 一些配置项不被接受响应
5 Terminate-Request 关闭链接请求
6 Terminate-Ack 关闭链接确认响应
7 Code-Reject Code 不被接受响应
8 Protocol-Reject PPP 协议标识字段值不被接受响应
9 Echo-Request 测试链路请求
10 Echo-Reply 测试链路响应
11 Discard-Request 测试发送链路

ID: 一个字节,LCP 包编号,收到非预期编号的 LCP 包将直接被丢弃。

Length:2 个字节,Code + ID + Length + Data 的长度,不能超过 MRU;超出 length 范围的字节将被看作是填充;一个错误长度的 LCP 包将直接被丢弃

Data:0 到多个字节,数据格式由不同的 Code 定义

有三种类型的 LCP 数据包:

  1. 用于建立和配置链路的链路配置数据包(Configure-Request、Configure-Ack、Configure-Nak、Configure-Reject)
    • 配置 MRU
    • 配置认证协议
    • 配置链路质量监控协议
    • 配置 MagicNumber 用于检测回环链路,magicNumber 在去程只能出现一次,再次收到说明链路存在回环
    • PPP 协议字段长度压缩,即是否可以识别一字节长度
    • 配置数据链路层地址和控制字段是否可以压缩
  2. 用于停止链路的链路终止数据包(Terminate-Request、Terminate-Ack)
  3. 用于调试链路的链路维护数据包(Code-Reject、Protocol-Reject、Echo-Request、Echo-Reply、Discard-Request)

NCP

其中的每一个协议支持不同的网络层协议,用来处理 PPP 封装其他网络协议时遇到的各种问题,比如 IP 地址的分配与管理。

PPP 连接生命周期

  • Dead (物理层未就绪)阶段
    • 连接的初始状态和终态
    • LCP 自动机的初始状态
    • 当物理层就绪事件到达后,进入建立连接(Establish)阶段
  • 建立连接(Establish)阶段
    • LCP 首先发送各自的链路配置数据包(附带测试链路)
    • 配置数据交换成功后(发送并确认),LCP 进入打开(Opened)状态
    • 个别的网络协议配置由 NCP 在网络层协议阶段进行配置
    • 此阶段非 NCP 数据包一律丢弃
  • 认证阶段(Authentication)
    • 一些链路只有在认证通过后才允许进行网络层协议数据包的交换 (Modem Dial)
    • 认证失败则进入链接停止阶段 (重试也失败情况下)
    • 在链接建立后,认证和链路质量监测将并行执行。
    • 此阶段允许数据包:LCP、authentication protocol、link quality monitoring;其他数据包将被丢弃
  • 网络层协议阶段(Network-Layer Protocol Phase)
    • NCP 将根据不同的网络层协议(IP、IPX、Appletalk)分别对这些协议进行配置
    • 当 NCP 为打开状态后,PPP 将会携带对应网络层协议的数据包,网络层协议对应的 NCP 没有被打开则该协议的数据包将被丢弃
    • 此阶段允许的数据包:LCP、NCP、网络层协议数据包
  • 链路停止阶段(Termination)
    • PPP 可以在任何时候停止链路(认证失败、链路不稳等)
    • 通过 LCP 发送停止数据包来停止链路
    • 通知上层网络层停止事件
    • LCP Terminate Packages 交换成功后,通知物理层断开链接
    • 此阶段允许的数据包:LCP;其他数据包将被丢弃

广播通信 CSMA/CD 协议

LAN(Local Area Network)局域网


  1. Difference Between HDLC and PPP ↩︎

  2. The Point-to-Point Protocol (PPP) ↩︎

作者

m3m0ry

发布于

2020-05-18

更新于

2020-09-20

许可协议

评论