Randomblue Asked: 2013-05-15 07:39:08 +0800 CST2013-05-15 07:39:08 +0800 CST 2013-05-15 07:39:08 +0800 CST 为什么 TCP 校验和是倒置的? 772 从维基百科页面: 校验和字段是头部和文本中所有 16 位字的补码和的 16 位补码。 为什么在将 header 和 text 中的 16 位相加后,还要取 1 的补码来计算 TCP 校验和? tcp 4 个回答 Voted Best Answer Sergey Vlasov 2013-05-17T13:20:29+08:002013-05-17T13:20:29+08:00 取补码是为了使校验和验证更简单——不是再次计算校验和,然后将计算出的值与标头中的校验和字段(位于求和数据的中间)进行比较,而是可以求和(使用一个补码算术)标头中的所有 16 位字(包括校验和字)并将结果与零进行比较。 Flup 2013-05-15T07:45:58+08:002013-05-15T07:45:58+08:00 这可能是因为全零的值是有意义的(来自RFC 793): 在计算校验和时,校验和字段本身被替换为零。 因此它可以在校验和确实为零的不太可能发生的情况下保留此含义。 mdpc 2013-05-17T13:28:07+08:002013-05-17T13:28:07+08:00 结果为零的校验和是有问题的,因为所有零也是由断电设备或没有电源的东西生成的。结果是 ALL ONES 可以更好地保证硬件正常运行。 One's complement 是一个更复杂的术语,用于逐位分析而不是作为一个完整的单元(即 AND/OR/XOR/NOT)。 Michael Hampton 2013-05-17T14:02:15+08:002013-05-17T14:02:15+08:00 使用一个补码算法是因为 TCP 是在 70 年代为 70 年代的计算机设计的,其中大部分使用一个补码算法。直到 20 世纪 70 年代末和 80 年代的个人电脑出现后,现代计算机使用的补码运算才真正开始兴起。
取补码是为了使校验和验证更简单——不是再次计算校验和,然后将计算出的值与标头中的校验和字段(位于求和数据的中间)进行比较,而是可以求和(使用一个补码算术)标头中的所有 16 位字(包括校验和字)并将结果与零进行比较。
这可能是因为全零的值是有意义的(来自RFC 793):
因此它可以在校验和确实为零的不太可能发生的情况下保留此含义。
结果为零的校验和是有问题的,因为所有零也是由断电设备或没有电源的东西生成的。结果是 ALL ONES 可以更好地保证硬件正常运行。
One's complement 是一个更复杂的术语,用于逐位分析而不是作为一个完整的单元(即 AND/OR/XOR/NOT)。
使用一个补码算法是因为 TCP 是在 70 年代为 70 年代的计算机设计的,其中大部分使用一个补码算法。直到 20 世纪 70 年代末和 80 年代的个人电脑出现后,现代计算机使用的补码运算才真正开始兴起。