摘要
对于TCP/IP数据包,如果修改了其中的数据,那必须重新计算更新校验和,全量计算大家都知道,这里主要说一下增量计算更新,看看如何把重新计算校验和从200ns优化到10ns。
1、全量计算
计算校验和是每2字节组成一个ushort进行求和,然后对超过ushort的溢出部分进行回卷,最后进行取反得到最终结果。对于一个TCP数据包,需要计算两个部分,IP首部、IP伪首部+TCP首部+荷载,这是非常耗时的。
2、增量计算
这是RFC1624的一种计算方法 https://www.rfc-editor.org/info/rfc1624/ ,提供了一种增量计算公式
HC' = ~(~HC + ~m + m') -> 新校验和 = ~(~旧校验和 + ~旧值 + 新值)
不管数据包多大,只要把变化的值代入公式计算得到新校验和写入数据包即可
以一个TCP包举例
//源端口 0x007B(123)
//校验和 0xaf9d
45 00 00 28 00 00 00 00 40 06 7c ce 7f 00 00 01
7f 00 00 01 00 7b 01 c8 00 00 00 00 00 00 00 00
50 02 00 00 af 9d 00 00
//源端口 0x0085(133)
//校验和 0xaf93
45 00 00 28 00 00 00 00 40 06 7c ce 7f 00 00 01
7f 00 00 01 00 85 01 c8 00 00 00 00 00 00 00 00
50 02 00 00 af 93 00 00
//公式
HC' = ~(~HC + ~m + m')
= ~(~旧校验和 + ~旧值 + 新值)
= ~(~0xaf9d + ~0x007b + 0x0085)
= 0x1506b ->折叠进位-> 0x506b + 0x0001
= 0x506c -> 取反 -> ~0x506c
= 0xaf93