Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

发现传输出错

复习

  • 带宽、时延与吞吐量:它们描述不同维度的“快”
  • 编码、时钟与噪声:比特要经过编码,才能变成可被采样判定的信号
  • 数据帧的边界:帧把连续比特流切成可独立处理的一段段数据

TL;DR

  • 校验机制帮助接收方发现传输中出现的错误
  • 校验和与 CRC 都是在帧中加入由内容计算得出的冗余信息
  • “发现错误”通常比“纠正错误”更简单,也更常见

正文

  前面我们留下了一个问题:接收方划对了边界,可内容可能在路上被噪声改坏,它怎么知道?

  答案的思路很朴素:让发送方在发送前,先根据内容算出一个简短的校验值,一并发送;接收方收到后,按同样的规则再算一遍。两次结果一致,就倾向于认为没错;不一致,就知道途中至少有内容被改变了。

几种常见的校验

  校验的具体算法有强有弱:

  • 最简单的奇偶校验,只能发现“个数为奇数”的一类错误,能力有限
  • 校验和(checksum)把数据按规则累加,常用于软件协议,实现简单
  • 循环冗余校验(CRC)对连续的比特错误尤其敏感,因此在链路层十分常见

  它们的共同点是“冗余”:为了让接收方有能力判断,我们要多传一点点额外信息。这又是那个熟悉的主题——加一层信息,换来一种能力。

发现,不等于纠正

  这里必须强调:“发现”不等于“纠正”。

  校验值只能告诉我们“好像出错了”,通常并不能指出是哪一位错了,更不能自动改回去。收到错误帧的一方,最直接的做法就是把它丢弃;至于要不要重传,交给更低层或更高层的协议去决定。

  于是,我们已经能让一根线比较可靠地传完一段帧了。接下来,要把视野从“一根线”扩大到“一个局域网”:里面有许多设备,怎样才能分清彼此、把帧交给正确的那一个?

思考题 1

校验值相同能绝对证明内容没有被改动吗?

思考题 2

既然校验只能发现错误、不能纠正,为什么它仍然如此重要?

小结

知识点

  • 校验为数据加入可复算的冗余
  • 奇偶校验、校验和与 CRC 的检错能力依次增强
  • 它降低漏检概率,但通常不负责恢复正确内容

参考资料

  1. Wikipedia(zh):校验和:由数据计算得到的简短校验值
  2. Wikipedia(zh):循环冗余校验:对连续比特错误敏感的检错方法

思考题答案(仅供参考)

思考题 1

  不能。不同内容在理论上有可能得到相同的校验值,这叫碰撞。好的校验规则只是让这种碰撞极难发生,从而把漏检概率压到很低,而不是彻底消除。

思考题 2

  因为发现错误是后续一切补救的前提。如果连“这帧坏了”都不知道,接收方就会把错误数据当成正确的继续使用,后果可能更严重。丢弃错误帧虽然简单,却把问题挡在了正确的位置,剩下的重传可以交给更合适的层次处理。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪