**校验和(checksum)**是根据一块数据计算出的数字,并随数据一起发送。接收方重复这个计算。如果数字不同,这块数据在传输中就变了,接收方会拒收。
题目会要求你计算校验和、比较两个数值,并说明这个方法能做什么、不能做什么。你选择的措辞,和计算本身同样重要。
简单的校验和怎么运作?
为了让算术简单,本课用教学版本:把数值相加,再取除以 100 后的余数。真实的校验和使用不同的规则,所以请按照大纲和老师要求你掌握的版本为准。
- 把所有数据值相加。
- 对总和取 MOD 100,得到校验和。
- 把数据与校验和一起发送。
- 接收方对收到的数据重复第 1、2 步,然后比较。
例题详解
发送四个数据值:52, 87, 19, 66。
total ← 0
FOR i ← 1 TO 4
total ← total + Data[i]
NEXT i
checksum ← total MOD 100
追踪:
| i | Data[i] | total |
|---|---|---|
| 开始 | 0 | |
| 1 | 52 | 52 |
| 2 | 87 | 139 |
| 3 | 19 | 158 |
| 4 | 66 | 224 |
然后 224 MOD 100 = 24。手算检查:52 + 87 = 139,139 + 19 = 158,158 + 66 = 224,224 − 200 = 24。
**接收方,情况 1。**数据块以 52, 87, 91, 66 到达。总和是 296,296 MOD 100 = 96。这不等于 24,所以接收方检测到错误。
**接收方,情况 2。**数据块以 87, 52, 19, 66 到达。总和仍是 224,所以校验和是 24。即使两个数值互换了位置,校验也通过了。
学生常犯什么错误?
常见说法:“校验和让数据变得安全,所以没人能改它。”
这是错的。校验和是用来发现意外改动的方法。蓄意改动数据的人可以算出新的校验和一并发送,接收方就会看到吻合。诚实的表达是:“校验和能发现许多意外错误,但不能阻止有人蓄意改动数据,而且可能漏掉某些改动,例如数值互换。”
自我检测
1. 计算 14, 35, 28, 9 的校验和(总和 MOD 100)。
查看答案
14 + 35 = 49,49 + 28 = 77,77 + 9 = 86。86 MOD 100 = 86。
2. 发送方对 40, 25, 30 得到的校验和是 95。接收方收到 40, 25, 31。校验通过吗?
查看答案
40 + 25 + 31 = 96,所以接收方的校验和是 96,与 95 不同,因此检测到错误。
3. 给出校验和不属于安全功能的一个理由。
查看答案
任何改动数据的人都可以重新计算校验和并替换,接收方就会看到吻合。它只能发现意外的改动。
下一步
最后,在错误检测与错误纠正中,把只能发现问题的校验方法和能修复问题的方法区分开来。你可以用安全的 Python 推理沙盒自己写出求和取余的循环,并用上面的数值测试。然后试试练习题。
如果你想知道自己评价类答案该怎么写,一对一线上计算机科学补习能给你这样的关注。