关于校验,感觉大家和我一样一直对这个概念很模糊,对一些细节还不是很了解!所以就写了一篇博客,总结一下校验和的知识,也加深一下印象!
首先TCP,UDP,IP三个协议中校验和都占16位,也就是两个字节。
UDP的校验和结算相对简单。首先UDP报文长度不是确定的,所以计算校验和前要先将报文的末尾用‘0’补齐。使报文为偶数个字节。
发送端计算校验和:
计算UDP的校验和方法是计算16位的二进制和包括UDP首部数据,将校验和字段(16位)置0,将每个16位的按位相加,第17、18位出现进位的话,将结果值重新与结果的第1,2位相加,再将所得的结果取反码,最后得到的结果即为UDP校验和,存在校验和字段中。
PS:求校验和的方法写的有点笼统,详细算法自行google二进制反码求和!
接收端验证校验和:
若传输中没有任何差错,包含之前的校验和对报文进行二进制反码求和,接收端计算的结果为全1,即报文正确,否则有错。
在这额外多说一句,一旦验证UDP报文出错时,报文在分组转发时,正常发送转发,不会被丢弃。他被丢弃的地方发生在应用层向上转发的时候。一般路由器等三层设备,不会验证其校验和!但是UDP的校验是可选的!也就是可以选择接收端是否对其进行校验!
TCP的校验和算法和UDP的基本相同!不够偶数个字节同样需要‘0’填充。求法也是将每个16位进行二进制反码求和。但是不同的地方,TCP必须进行校验,而且他有自己的一些重传机制,来确保可靠传输。
最后再说IP的校验和,检验和的算法几个协议都是相同的。唯一不同就是IP协议只验证头部。求校验和时,他并不包括数据部分!