# 链路层关注目标

相邻节点的同层关系

  1. 对象: 相邻节点
  2. 层次: 同层关系

# 信道

解决相邻节点的通信问题

  • 点对点

    [^点对点信道]: 没有中间节点, 两个目标一对一直连, 点对点, 点对端, 端对端.

  • 广播

    [^广播信道]: 一对多, 大家都走一根总线, 可能存在总线冲突. 局域网用的多.

# 链路

  1. 无源的点到点的物理线路段,中间没有任何其他的交换结点.
  2. 一条链路只是一条通路的一个组成部分

# 数据链路

除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路.

  1. 控制多个链路数据传输的通信协议
  2. 以后说"链路", 一般是指数据链路.

#

数据链路层交换的信息叫帧, 常常在两个对等的数据链路层之间画出一个数字管道,而在这条数字管道上传输的数据单位是帧.

  • 是网络层加头加尾的处理结果, 是物理层数据掐头去尾的处理结果
  • 链路层封装上层(网络层)成帧, 传入物理层, 链路层处理物理层数据头尾成帧, 提交到上层(网络层).

# 数据链路的基本问题

数据链路层问题不止这三个, 还有很多其他的, 以下三种为基础问题.

  1. 封装成帧

    [^ ]: 如何掐头, 如何去尾

  2. 透明传输

    [^ ]: 如何实现"不需要知道实现, 只需要保证 a 到 b 的数据没有问题"的效果

  3. 差错控制

    [^ ]: 如何检测数据传输出错, 出错如何处理

  • 更多问题: 连续发多个帧怎么进行流量控制, 谁先建立连接, 谁先发送数据

封装成帧

在一段数据的前后分别添加首部和尾部,构成了一个帧

  1. 同一协议, 首部尾部大小是固定的, 不同协议的可能不一样.
  2. 首尾的作用是: 帧定界.
  3. 收尾中间夹的数据部分叫做 MTU.

透明传输

  1. 帧开始符: SOH, 帧结束符号: EOT, 具体的符号是事先统一好的.

  2. 解决"数据中提前出现 EOT"的问题: 字节填充法(byte stuffing), 字符填充法(character stuffing).

    • 规定转义字符 ESC.

    • 数据部分 MTU 出现 SOH, EOF, ESC 时, 做如下处理:

      原数据 处理结果
      xxxSOHxxx xxxESCSOHxxx
      xxxEOTxxx xxxESCEOTxxx
      xxxESCxxx xxxESCESCxxx
    • 接收端的数据链路层在将数据送往网络层之前删除插入的转义字符 ESC.

差错控制

出错类型:

  • 比特差错: 1 错传为 0, 0 错传为 1.
  • 误码率: 在一段时间内,传输错误的比特占所传输比特总数的比率.
  • 信噪比.

检错方法和原理:

  • 循环冗余检测技术 CRC

  • 帧检验序列 FCS

流程:

  • 接收端把收到的数据除以 P,
  • 若得出的余数 R = 0,则判定这个帧没有差错,就接受(accept).
  • 若余数 R ≠ 0,则判定这个帧有差错,就丢弃.

注意事项:

  • 仅 CRC 差错检测技术只能做到无差错接受(accept), 并不能确定究竟是哪一个或哪几个比特出现了差错.
  • 无差错接受:"凡是接受的帧(即不包括丢弃的帧), 我们都能以非常接近于 1 的概率认为"这些帧在传输过程中没有产生差错". 也就是说: "凡是接收端数据链路层接受的帧都没有传输差错"(有差错的帧就丢弃而不接受).
  • 可靠传输的实现: 在检错的基础上, 再加上帧编号, 确认和重传机制, 再传一遍比改正错误的成本要小很多.

# 互联网的数据链路层

  • 有线传输: 数据链路层协议不使用确认和重传的机制, 不向上层提供可靠传输的服务.
  • 无线传输: 数据链路层协议使用确认和重传机制, 向上层提供可靠传输的服务(第九章).
  • 本章介绍的数据链路层协议都不是可靠传输的协议.

# 3.2 点对点协议 PPP

  • 全世界使用得最多的数据链路层协议是点对点协议 PPP(Point-to-Point Protocol).
  • 用户使用拨号电话线接入因特网时, 一般都是使用 PPP 协议.

# 协议应该满足的需求

  • 简单
  • 封装成帧
  • 透明性
  • 支持多种网络层协议
  • 多种类型链路
  • 差错检测
  • 检测连接状态
  • 最大传送单元
  • 网络层地址协商
  • 数据压缩协商

# 协议不需要的需求

  • 纠错

    [^原因]: 代价太高, 大多情况下都是检测+重传

  • 流量控制

  • 序号

    [^原因]: 你发我收, 丢了就丢了, 后果处理交给高层协议完成, 没必要加序号.

    1. 在数据链路层出现差错的概率不大时, 使用比较简单的 PPP 协议较为合理.
    2. 网络层本身就是不可靠的, 现在处理好了不代表网络层也能做好, 不如一起丢到高层处理.
  • 多点线路

    [^原因]: 点对点协议, 一对一需求, 不需要一对多.

  • 半双工或单工链路

    [^原因]: 需求就是互发机制, 其他的不需要.

# 协议组成

  • (将网络层) IP 数据报封装到(数据链路层)串行链路的方法
  • 链路控制协议 LCP (Link Control Protocol)
  • 网络控制协议 NCP (Network Control Protocol)

# 帧格式

名称 F A C 协议 信息部分 FCS F
HEX 值 7E FF 03 ... ... ... 7E
大小/Byte 1 1 1 2 <= 1500 2 1
位置 首部 首部 首部 首部 信息部分 尾部 尾部
说明 标志字段 F(flag), 固定为 0x7E, 标志一个帧的开始或结束. 连续 2 个帧之间只需要一个标志字段, 如果出现连续两个标志字段, 表示这是一个空帧. 地址字段 A(address)是固定不变的, 为 0xFF. 控制字段 C(control)是固定不变的, 为 0x03. 协议字段不同, 后面信息部分表示的数据类型不同:
0x0021: IP 数据报
0xC021: LCP
0x8021: NCP
帧检验序列, 是需要通过帧校验方法计算出来的
  • ppp 协议面向字节, 所有 PPP 帧长度都为整数字节, 计算结果不可能出现像 12.3 这种带小数点的 PPP 帧长度

# PPP 协议的基本问题

  • 透明传输

    • PPP 原来是异步传输(字符逐个送), 用字节填充:
      1. 出现 7E 时, 变成两字节数据 7D5E
      2. 出现 7D 时, 变成两字节数据 7D5D
      3. 若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符), 则在该字符前面要加入一个 7D 字节, 同时将该字符的编码加以改变
    • PPP 现多用同步传输(一连串连续传输), 用硬件实现比特填充:
      • 发送端: 信息字段每读到五个连续 1(011111xx...)时, 在第五个 1 插 0, 这样:
        • 7E(01111110) => 011111010
        • 0111110x => 01111100x
      • 接收端: bit 流扫描, 每读到 5 个 1, 去掉最后一个 1 后面的 0, 这样:
        • 011111010 => 7E(01111110)
        • 01111100x => 0111110x

# 工作状态

  1. 用户拨号, 接入 ISP(发请求), 路由器 modem 确认, 建立物理层连接
  2. PC 向路由器发 PPP 帧(协议为 LCP)
  3. 读取 PPP 帧的参数, 进行网络层配置, NCP 给 PC 分配临时 IP, PC 上网
  4. 通信完毕, NCP 释放网络层连接, 回收 IP, 释放物理层连接

# 3.3⭐️ 使用广播信道的数据链路层

# 局域网

特点

  • 只有一个单位有
  • 物理范围和数目有限

优点

  • 广播: 从一个主机(站点)即可访问整个局域网, 局域网主机之间共享硬软资源
  • 灵活: 便于拓展和进化, 设备调整灵活
  • 可靠: 提高系统可靠性, 可用性, 生存性

人们常把局域网上的计算机称为"主机", "工作站", "站", "站点"

拓扑结构

  • 星形网

  • 总线网 (最常见) (匹配电阻)

    主学 ↑ 次学 ↓

  • 树形网 [匹配电阻]

  • 环形网

共享技术

总线网的总线结构需要信息的调度

  • 静态

    • 频分复用

    • 时分复用

    • 波分复用

    • 码分复用

  • 动态

    • 随机接入

      • 你需要发你就发

      • 总线网上, 可能存在总线冲突

  • 受控接入(不常用)

# 以太网

标准

  • DIX Ethernet V2 是世界上第一个局域网产品(以太网)的规约
  • 先用 IEEE 的 802.3 标准 - DIX Ethernet V2 标准与 IEEE 的 802.3 标准只有很小的差别,因此可以将 802.3 局域网简称为"以太网"
  • 严格说来, "以太网"应当是指符合 DIX Ethernet V2 标准的局域网

子层

  • 逻辑链路控制 LLC 局域网对 LLC 子层是透明的
网络层 网络层
LLC ← 透明 → LLC
MAC ← 局域网 → MAC
物理层 ← 局域网 → 物理层
  • 媒体接入控制 MAC

    与接入到传输媒体有关的内容都放在 MAC 子层, LLC 子层则与传输媒体无关

网卡(网络适配器)

  • 串行/并行转换

    发送: 串行 => 并行

    接收: 并行 => 串行

  • 数据缓存

  • 对 OS 提供驱动程序

  • 实现以太网协议

功能涉及: 数据链路层, 物理层

↓IP 地址 ↓ 硬件地址
CPU 和存储器 <= 并行通信 => 适配器

生成发送的数据
处理收到的数据

把帧发送到局域网
从局域网接收帧

# CSMA/CD 协议

后续涉及链路层内容全部基于以太网MAC层

以太网最初是总线网结构, 实现如下:

设一根总线上有 ABCDE 四台主机, 则:

  1. B 发数据帧到总线
  2. ∵ D 地址 == 总线上数据帧首部的写入地址, ∴ 只有 D 才接收这个数据帧
  3. 又 ∵ 其他所有的计算机(A, C, E)读取总线, 地址不匹配, ∴ 丢弃这个数据帧
  4. 具有广播特性的总线上实现了一对一通信

# 以太网的工作原则

  • 无连接的工作方式

    不必事先建立连接就可以发送数据

  • 数据帧不进行编号, 不要求对方发回确认信息

    这样做的理由是局域网信道的质量很好, 因信道质量产生差错的概率是很小的

# 以太网提供的服务

  • 以太网提供的服务是不可靠的交付, 是尽最大努力交付
  • 如果我发了你收了, 帧校验出现错误, 就丢弃, 问题留给高层
  • 如果高层发现丢失了一些数据而进行重传, 但以太网并不知道这是一个重传的帧,而是当作一个新的数据帧来发送

# 以太网数据编码

以太网发送的数据都使用 曼彻斯特(Manchester)编码

  • 1 就是电平 高→低
  • 0 就是电平 低→高

差分曼彻斯特编码:

  • 0 就是根据0产生之前的临界点电平, 产生一个跳变(低→->高或高→低都可能)
  • 1 就是根据1产生之前的临界点电平, 不产生跳变(保持原电平)

# 以太网总线冲突

解决方案: 载波监听多点接入/碰撞检测 CSMA/CD

  1. 载波监听: 每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据. 如果有, 则暂时不要发送数据, 以免发生碰撞
  2. 多点接入: 算机以多点接入的方式连接在一根总线上
  3. 碰撞检测: 计算机边发送数据边检测信道上的信号电压大小
  4. 在发生碰撞时, 总线上传输的信号产生了严重的失真, 无法从中恢复出有用的信息来
  5. 每一个正在发送数据的站, 一旦发现总线上出现了碰撞, 就要立即停止发送, 然后等待一段随机时间后再次发送

案例:

  1. 设A→B传播时间(端到端往返时延)为τ
  2. A检测到信道空闲, 从t=0开始向B发送数据
  3. B, 在A数据还没发送到B的期间内(t<τ), 同样检测得到信道空闲, 从t=τ-δ开始向A发送数据
  4. 在路上t=τ-δ/2的位置, A发送的数据和B发送的数据发生碰撞
  5. 碰撞后的数据变得异常, 各自按照原来的方向分别向A和B传播
  6. B在t=τ时检测到发生碰撞, A在t=2τ-δ检测到碰撞
  7. 两者开始进行碰撞处理

案例小结:

  • 任何一个站发送数据前, 检测到空闲, 那时候不一定是真的空闲, 其他站的数据也许只是在路上
  • 最先发送数据帧的站, 在发送数据帧后至多经过时间 2τ, 就可知道发送的数据帧是否遭受了碰撞(t = 2τ-δ, δ → 0时, 是t的最大值, 为2τ)
  • 以太网的端到端往返时延 2τ 称为争用期, 或碰撞窗口
  • 经过争用期这段时间还没有检测到碰撞, 才能肯定这次发送不会发生碰撞

# 以太网重要特性

  • 使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行半双工通信

    原因: 我发你就不能发, 避免总线冲突

  • 每个站在发送数据之后的一小段时间内, 存在着遭遇碰撞的可能性

    也就是说: 站点发送数据前, 检测到的信道空闲并不一定是真正的信道空闲

  • 这种发送的不确定性使整个以太网的平均通信量远小于以太网的最高数据率

# 截断二进制指数退避算法

针对问题: 碰撞处理

发生碰撞的站在停止发送数据后, 要推迟(退避)一个随机时间才能再发送数据

  1. 确定基本退避时间片: 一般是取为争用期 2τ, 用τ=传播距离d/传播速率v得出
  2. 确定种子k: 定义参数k = min(发生碰撞导致重传的次数, 10), k ≤ 10
  3. 确定退避时间片倍数r: 从整数集合[0, 1, …, (2^k-1)]中随机地取出一个数, 记为 r
  4. 当重传达 16 次仍不能成功时即丢弃该帧, 并向高层报告

案例:

  1. 以太网取 2τ=51.2μs为争用期的长度(τ=传播距离d/传播速率v)
  2. 对于10Mbps以太网, 在争用期内可发送10Mb/s*51.2μs = 512bit, 即 64B
  3. 以太网在发送数据时, 若前64B没有发生冲突, 则说明t=2τ的时间内没有发生碰撞, 信道是空闲的, 则后续的数据就不会发生冲突

案例小结: 最短有效帧长

  • 如果发生冲突, 就一定是在发送的前64B(t=2τ-δ, 即t≤2τ)之内. 也就是说, 时间上是2τ的等价关系就是帧大小的64B
  • 由于一检测到碰撞就立即中止发送, 这时已经发送出去的数据一定小于64B
  • 以太网规定了最短有效帧长为64B, 凡长度小于64B的帧都是由于冲突而异常中止的无效帧
  • 如果你想发送的数据帧≤64B, 则需要对帧补一些字节进去, 补法见后续章节

# 强化碰撞

发送数据的站一旦发现发生碰撞:

  1. 立即停止发送数据
  2. 再继续发送若干比特的人为干扰信号(jamming signal), 以便让所有用户都知道现在已经发生了碰撞

# 使用集线器的星形拓扑

  • 传统以太网最初是使用粗同轴电缆, 后来演进到使用比较便宜的细同轴电缆, 最后发展为使用更便宜和更灵活的双绞线
  • 这种以太网采用星形拓扑, 在星形的中心则增加了一种可靠性非常高的设备, 叫做集线器(hub)

# 10BASE-T

解释:

  • 10: 涉及的数据率最高10Mbps. 这种 10 Mb/s 速率的无屏蔽双绞线星形网的出现, 既降低了成本, 又提高了可靠性

  • BASE: 未经调制的基带信号

  • T: 双绞线连接

  • 不用电缆而使用无屏蔽双绞线, 每个站需要用两对双绞线, 分别用于发送和接收, 避免数据传输冲突(并不意味着问题解决)

  • 集线器使用大规模集成电路芯片模拟传统总线的功能, 硬件设备的可靠性大大提高

  • 10BASE-T 的通信距离稍短, 每个站到集线器的距离≤100m

  • 10BASE-T 双绞线以太网的出现, 是局域网发展史上的一个非常重要的里程碑, 它为以太网在局域网中的统治地位奠定了牢固的基础. 现在还有100BASE-T. 现在用的比较多的是100BASE-F

特点:

  • 实质: 集线器是使用电子器件来模拟实际电缆线的工作, 因此整个系统仍然像一个传统的以太网那样运行
  • 使用集线器的以太网在逻辑上仍是一个总线网, 各工作站使用的还是 CSMA/CD 协议, 并共享逻辑上的总线
  • 集线器很像一个多接口的转发器(然而集线器并无转发概念和功能), 相当于一根总线, 工作在物理层

# 以太网的信道利用率

  1. 发生碰撞期: 设争用期长度为 2τ, 即端到端传播时延τ的两倍, 检测到碰撞后不发送干扰信号

  2. 占用期: 设帧长为 L (bit), 数据发送速率为 C (b/s), 因而帧的发送时间为 L/C, 记为T0 (s)

  3. 发送一帧所需的平均时间 = 发生碰撞之后处理总时间 + 无碰撞后发送数据时间 = n * 征用期 + 占用期 = n * 2τ + T0 (n每次都会不一样, 要看信道上的情况)

  4. 参数a:

    • a = τ/T0

    • a→0 表示一发生碰撞就立即可以检测出来, 并立即停止发送, 因而信道利用率很高

    • a 越大, 表明争用期所占的比例增大, 每发生一次碰撞就浪费许多信道资源, 使得信道利用率明显降低

  5. 理想情况: 以太网上的各站发送数据都不会产生碰撞(这显然已经不是 CSMA/CD, 而是需要使用一种特殊的调度方法), 即总线一旦空闲就有某一个站立即发送数据. 此时发送一帧占用线路的时间(A→B单向时间)是 T0 + τ, 而帧本身的发送时间是 T0. 于是我们可计算出理想情况下:

    极限信道利用率 Smax = T0/(T0+τ) = 1/(1+a)

参数分析:

由a = τ/T0可知:

  • 数据率一定, 以太网的连线的长度受到限制, 否则 τ 的数值会太大
  • 以太网的帧长不能太短, 否则 T0 的值会太小, 使 a 值太大

# MAC层

硬件地址:

  • 局域网中, 硬件地址 === 物理地址 === MAC 地址, 意思都一样. length(硬件地址) == 48bit
  • 802 标准所说的"地址", 用人话讲只是"名字(name)"或"标识符(label)"罢了. 众所周知, 名字是可以改的, 所以硬件地址是可以改变的
  • IEEE 的注册管理机构 RA 负责向厂家分配地址字段的前3Byte(即高位24bit), 地址字段中的后3Byte(即低位24bit)由厂家自行指派, 称为扩展标识符, 必须保证生产出的适配器没有重复地址(unique)

检测方式:

  1. 适配器从网络上每收到一个 MAC 帧就首先用硬件检查 MAC 帧中的 MAC 地址

    • If(是发往本站的帧)
      • 收下
      • 进行其他的处理
    • else
      • 将此帧丢弃
      • 不再进行其他的处理
  2. "发往本站的帧"包括以下三种帧:

  • 单播(unicast)帧 (一对一)

  • 广播(broadcast)帧 (一对全体)

    • 没有一块网卡的MAC地址是48个0或48个1

    • if (目的地地址 == 48个1) 所有站接收数据;

  • 多播(multicast)帧 (一对一组)

广播仅针对局域网, 不会经由路由器广播到互联网

# MAC帧

标准:

  • 常用的以太网MAC帧格式有两种标准:

    • DIX Ethernet V2 标准
    • IEEE 的 802.3 标准
  • 最常用的 MAC 帧是以太网 V2 的格式

结构:

以太网MAC帧

字段名称 目的地址 源地址 类型 IP数据报→数据 FCS数据校验
大小(Byte) 6(48bit) 6 2 46~1k5 4
解释 物理地址的长度 发送方的物理地址 标志上一层使用的是什么协议, 以便把收到的 MAC 帧的数据上交给上一层的这个协议 正式名称是:
MAC 客户数据字段
帧校验码

传输到物理层后

字段名称 插入 以太网MAC帧
大小(Byte) 8 64~1518
解释 1. 为了达到比特同步, 在传输媒体上实际传送的
要比 MAC 帧还多 8 个字节
2. 8B = 前导码7Byte + 起始定界符SFD1Byte
3. 前导码(前同步码): 使接收器建立比特同步
起始定界符SFD(帧开始定界符): 指示一帧的开始
  • MAC帧最小值: 6 + 6 + 2 + 46 + 4 = 64B, 就是最短有效帧长. MAC客户数据字段长度最小值46其实是64 - 6 - 6 - 2 - 4计算出来的
  • MAC帧最大值: 6 + 6 + 2 + 1k5 + 4 = 1518B

无效的MAC帧:

  • 帧的长度不是整数个字节
  • 用收到的帧检验序列 FCS 查出有差错
  • 数据字段的长度不在 46 ~ 1500 字节之间
  • 有效的 MAC 帧长度为 64 ~ 1518 字节之间
  • 对于检查出的无效 MAC 帧就简单地丢弃, 以太网不负责重传丢弃的帧

# 3.4 扩展的以太网

实现方案:

  1. 主机使用光纤和一对光纤调制解调器替换双绞线(信号传播距离就可以从500m扩展到120km), 连接到集线器
  2. 用多个集线器可连成更大的局域网: 用一个主干集线器连接各大子集线器, 每个子集线器内的计算机可以互相影响(产生局部碰撞域), 而主干集线器使得子集线器所连所有主机互相之间产生更大的碰撞域