模块五 · 链路层和局域网
差错检测与纠正
一个比特被噪声翻转,接收方怎样发现?发现之后是丢弃、重传还是直接纠正?如果是攻击者修改数据,这些方法还够吗?
本章要解决的问题:一个比特被噪声翻转,接收方怎样发现?发现之后是丢弃、重传还是直接纠正?如果是攻击者修改数据,这些方法还够吗?
本章的证据来源:教材§6.1.1、§6.2与§8.3.2,纸书296–301、411–412页;IPv4与消息认证另对照RFC。本轮在原始笔记工程找到并阅读了error-detect-lab脚本,其内容是构造数据的算法演示,本次没有重新运行,也没有真实链路检错实验。
先从一个例子理解概念
假设发送方要传一串比特,接收方看到的第三个比特被翻转了。只看收到的串,接收方通常不知道原来的值;发送方可以额外添加一些校验信息,帮助接收方判断。
检测、纠正与重传
差错检测是发现某些错误;差错纠正是利用冗余信息,在能力范围内直接恢复正确内容。重传则是让发送方再发一次,需要相应的反馈或超时机制。
检测方法不能保证发现所有可能错误,纠错方法也有可纠正错误数量和模式的限制。不要把“校验通过”解释成绝对无误。
随机误码与恶意修改
噪声不会主动重算校验值,攻击者却可以修改内容后一起修改校验值。检测随机误码与认证报文来源面对的是不同问题,不能用同一套结论替代。
链路层可以提供什么服务
不同链路协议可提供不同的服务,包括成帧、介质访问、检错、纠错和可靠交付。不能由普通以太网MAC丢弃坏帧,推出所有链路层都不纠错或不重传。
| 机制或场景 | 如何理解 |
|---|---|
| 以太网MAC的FCS检查 | 检查收到的帧,FCS错误帧不交给上层;通常不做MAC层确认重传 |
| 某些链路的可靠交付 | 在该链路本地用确认和重传恢复丢失或损坏的帧 |
| 前向纠错(FEC) | 加入冗余,使接收方能在一定范围内纠错;可用于有线或无线物理传输 |
是否采用这些机制要结合误码特征、开销和时延要求。无线并非唯一使用FEC的场景;本机也未直接验证网卡的坏帧处理、链路纠错或误码率。
三种常见检错方法
| 方法 | 基本思路 | 范围和限制 |
|---|---|---|
| 奇偶校验 | 添加校验位使1的数量满足约定 | 单个奇偶位可发现奇数个比特翻转,偶数个可能漏检 |
| Internet校验和 | 对16位字做一补和,再取补码 | 可发现许多误码,但某些保持和不变的改变会漏检 |
| CRC | 以二进制多项式运算计算余数 | 检错能力依生成多项式、帧长与错误模式而定 |
它们不是按“哪一层更在乎正确性”排列的等级。选择方法还考虑计算成本、硬件实现、冗余长度和要处理的错误模式。
校验和究竟覆盖哪里
- IPv4首部校验和覆盖整个IPv4首部,包含存在的选项;20字节只是无选项的最小首部长度。IPv6没有同样的首部校验和。
- TCP/UDP校验和覆盖其首部与数据,并结合IP伪首部信息。UDP的使用要求需区分IPv4、IPv6及标准允许的例外,不能一概说成“只校验首部”。
- 以太网FCS用于MAC帧相应字段的检错;不是协议栈中每层各自只检查互不重叠的一段。
为什么有些改变能绕过校验和
继续16位字求和的例子。交换两个完整的16位字,和不变;在不改变整体一补和的条件下,一处增加、另一处减少,也可能维持校验结果。
旧稿的软件实验记录称,交换两个字、特定的加减和插入全零字被校验和漏掉,而CRC-32在那些样本中发现了变化。原脚本自行计算Internet校验和,CRC则调用zlib.crc32;IPv4首部由固定字段构造,不是捕获的完整真实帧。即使样本结果成立,也不能推出CRC发现所有同类改变。
单比特错误测试全部通过,也不能代表所有“随机噪声”。随机错误还可能包含多比特、突发错误等,需要分别说明错误模型。
CRC为什么擅长发现某些突发错误
突发错误的长度是从第一个错误比特到最后一个错误比特所跨的范围,中间不必每一位都错。
对适当的r阶生成多项式,CRC可检测所有长度不超过r比特的突发错误;更长的错误仍有漏检可能。书中以这一性质说明其用途,而不是保证“只要字段位置变了,余数就一定不同”。
CRC的余数位数有限,不同数据可能有相同余数。主动攻击者还可重新计算FCS,因此CRC不提供密码学消息认证。
防篡改为什么还需要密钥或可信签名
如果发送方同时发送消息m和普通散列H(m),攻击者可以换成m′和H(m′)。接收方重新算散列仍能核对通过,却不知道消息是否来自原发送方。
密码学散列可以用于检测与一个可信摘要不一致的内容,但散列值本身也要可信。认证通常采用以下机制:
| 方法 | 关键前提 |
|---|---|
| 消息认证码(MAC),如HMAC | 通信双方有攻击者不知道的共享密钥 |
| 数字签名 | 接收方可靠取得签名者公钥,并按签名方案验证 |
这里的MAC是“消息认证码”,与局域网“介质访问控制”缩写相同、含义不同。具体密码学机制在网络安全模块再学。
本章小结
| 结论 | 条件 |
|---|---|
| 检错、纠错和重传是不同机制 | 不同链路可提供不同组合 |
| IPv4校验整个首部,TCP/UDP还校验数据 | 覆盖范围并非每层互不重叠 |
| 保持一补和不变的某些修改可绕过Internet校验和 | 注意错误模式和字边界 |
| CRC能发现特定范围的突发错误,仍有漏检可能 | 依多项式与错误长度 |
| CRC和普通散列不能单独提供主动攻击下的消息认证 | 需要密钥或其他可信验证机制 |
| 软件构造误码不等于真实链路实验 | 旧稿结果本次未复核 |
自测题
7 题 · 先自己答,再展开对照
以太网MAC通常怎样处理FCS错误帧?能推出所有链路层都不重传吗?
FCS错误帧通常被丢弃,不交给上层;普通以太网MAC不以确认重传恢复它。但某些其他链路有本地重传或纠错,不能概括为全部链路层行为。检错、纠错与重传分别在做什么?
检错判断是否出现某些错误,纠错用冗余恢复能力范围内的错误,重传让发送方再次发送。都需说明各自条件,不能保证解决任意错误。为什么交换两个完整16位字可能绕过Internet校验和?
求和对这两个字的顺序不敏感,交换仍保持同一个一补和;校验值因此可以相同。2000次单比特测试都通过,能证明发现所有随机错误吗?
不能,它只观察了单比特模式,不涵盖多比特和突发错误;有限样本也不能替代一般性质的证明。r阶CRC能保证发现哪一类突发错误?能发现所有字段交换吗?
对适当生成多项式,发现长度不超过r比特的所有突发错误。更长错误可能漏检,字段交换也不能不加条件地保证发现。IPv4首部校验和只覆盖20字节吗?TCP/UDP是否只覆盖首部?
IPv4覆盖整个首部,包含选项;20字节是最小首部。TCP/UDP校验和还覆盖数据及伪首部信息,并需区分具体协议要求。为什么“消息加普通散列”不能单独防止主动攻击者替换内容?
攻击者可以同时替换消息与散列。MAC依赖共享密钥,数字签名依赖可信公钥;普通散列仅在摘要可信等条件下才能支持完整性检查。
参考资料与适用范围
- 《计算机网络:自顶向下方法(原书第8版)》§6.1.1、§6.2,纸书296–301页(PDF315–320页):链路服务、奇偶校验、校验和和CRC;§8.3.2,纸书411–412页(PDF430–431页):消息与散列一同被替换的问题。
- RFC 791 §3.1:IPv4首部长度与首部校验和
- RFC 9293 §3.1:TCP校验和覆盖范围
- RFC 768:UDP校验和与伪首部
- RFC 2104 §1–2:带密钥的HMAC
修订核对日期:2026-10-13。原算法演示脚本已阅读,旧稿软件结果仍是未重新运行的历史观察,不能替代一般证明或真实链路测量。脚本没有随网站打包;教材中的历史散列算法示例不作为今天选择安全算法的推荐。