学习网络原理校验和的,要么就觉得不就是16bit的和嘛一笑而,要么对一长串的计算吓到了,算了一次结果错了,还不知道哪里错了。现在总算搞明白了一些内容,记录一下。
一、简单快速了解
加上伪首部的所有数据,以16bit为单位求和,进位“回卷”,回卷就是进位加到和上,所得结果按位取反,即为校验和。
二、发送和接收
在发送数据时,计算数据包的检验和,把得到的结果存入校验和字段中。
在接收数据时,计算数据包的检验和相对简单:
1、所有数据以16bit求和;
2、判是否为16bit全1;
3、全1则正确,否则错误。
三、详细计算解释
对于一个udp数据包,进行以16bit为单位的划分,对其二进制码(机器数)进行按位和( 1s complement of the sum),直到计算完全部内容(包括数据)。
得到一个16bit的和,记之为A,按位取反,记之为Ã。将Ã填入校验位。
举简单例子
步骤介绍完了,简而言之就是发送方把udp的包看成二进制,看成以16bit为单位的二进制,每个单位每个单位的加起来,加出来的结果放入校验位。
接收方更无脑,将UDP包看成二进制后,16bit加完,看结果是不是全1.
现在解释为啥结果会是全1,这里没有任何高深数学知识,只是一个小小的trick。
无论发送方,还是接收方,计算包中除了校验位的内容,得到的结果就是A(上文提到的16bit和),接收方再将A+Ã,即为全1.
四、为什么时间
为什么是16bit为单位求和?*可能16位cpu计算的原因?
为什么用这个加法来计算?*我其实觉得,要是简单的来说,发一个UDP包可以看成我给你了多少钱(过年红包),我先点一遍钱,在红包封皮上写上数额,比如68,你收到了红包,点了一遍里面的钱,一看少了一块,是67,特别生气,直接把红包扔了。简单的办法也能计算校验和,反正都是求和运算。但这里主要存在机器数的大端小端表示问题,索性避免歧义使用机器数来进行加减。
为什么使用这种校验和方式?方便计算,结果简单。简直就是喂到计算机嘴里的校验方式。
五、复杂的例子
我觉得这个例子不合格,反正我看这个图算了半天也不知道是啥,但是理解原理后,看这个图就比较明白了。
六、存在的困难
理解校验和存在的困难就是中文资料太少,并且不少内容已经失效;
专有名词太多,这个主要是没搞清楚本质而被表象迷惑了。
七、参考内容
- 《计算机网络-第7版》-谢希仁著
- https://www.cnblogs.com/noble/p/4144139.html
- https://www.ques10.com/p/10930/how-is-checksum-computed-in-udp-1/
- https://www.quora.com/Why-is-it-that-UDP-takes-the-1s-complement-of-the-sum-that-is-why-not-just-use-the-sum