主题 2 · 数据传输
检测错误
数据为什么会损坏,以及奇偶校验、校验和、回送校验、校验位和 ARQ 如何发现错误。
错误为什么会发生
从发送方到接收方的途中,干扰可能让位翻转,数据包可能丢失,数据也可能乱序到达。接收方需要一种方法发现自己收到的不是发出的内容。
下面每种方法的原理都一样:发送方根据数据算出一些额外信息一起发送,接收方重新计算,看看是否仍然一致。
奇偶校验
每个字节中留出一位作为奇偶校验位。偶校验时,校验位的取值让整个字节中 1 的个数为偶数;奇校验时,1 的总数为奇数。
接收方数一数 1 的个数。如果个数不符合约定的校验方式,就说明出错了。在下面先翻转一位,再翻转两位试试。
奇偶校验块
奇偶校验块给每个字节(每一行)加一个校验位,再给每一列加一个校验位。各列的校验位合在一起,构成数据块下方的校验字节。如果某一位出错,它所在的行和列都会校验失败,两者交叉的位置正好指出要纠正的那一位。
校验和
发送方用约定的算法把一块数据中的字节加起来,把结果(校验和)和数据一起发送。接收方做同样的计算,如果结果不同,说明数据已损坏,需要重新请求。
回送校验
接收方把收到的数据原样发回,发送方把副本与原始数据比较。如果不同,就重新发送。
注意: 回送校验无法判断错误发生在去程还是回程,而且发送的数据量翻了一倍。
校验位
校验位是附在编码(如条形码或 ISBN)末尾、由其他数字算出的额外一位。它能发现输入或扫描编码时的错误,例如输错一位或两位数字颠倒。
以 ISBN-13 为例:把各位数字交替乘以 1 和 3,结果相加,再选一个校验位使总和成为 10 的倍数。点击下面的某个数字来模拟输错。
自动重传请求(ARQ)
ARQ 使用确认和超时。接收方收到数据包后进行错误检查(例如用校验和),没问题就回送肯定确认,有问题就回送否定确认。
如果发送方收到否定确认,或者超时前什么都没收到,就重新发送该数据包。
- 1发送数据包启动计时器。
- 2接收方检查对数据包做错误检查。
- 3回送确认正确就回肯定确认,错误就回否定确认。
- 4必要时重发收到否定确认或超时 → 重新发送。
关键术语
- 奇偶校验位
- 为让 1 的个数为偶数(偶校验)或奇数(奇校验)而加上的一位。
- 校验和
- 根据一块数据算出并随之发送的值,供接收方核对。
- 回送校验
- 接收方把数据发回,由发送方与原始数据比较。
- 校验位
- 由编码中其他数字算出的一位,用来发现数据输入错误。
- ARQ
- 自动重传请求:通过确认和超时触发重发。
自我检测
使用偶校验时,1101001 应加上什么校验位?查看答案
已有四个 1,已经是偶数,所以校验位是 0。
说出奇偶校验的一个局限。查看答案
如果翻转了偶数个位,1 的个数仍然正确,错误无法被发现;它也无法指出是哪一位出错。
在 ARQ 中,如果一直收不到确认会怎样?查看答案
到达超时时间后,发送方认为数据包已丢失,会重新发送。
校验位用于发现传输错误还是数据输入错误?查看答案
数据输入错误,例如输错或扫错编码。