您的位置:首页 > 其它

标准IP数据包是否保证数据部分的正确性?

2015-10-21 20:27 239 查看
[问】标准IP数据包是否保证数据部分的正确性?

【答】IPv4数据包本身包含有头部校验信息,但并不包含数据部分的校验;UDP数据包包含16比特的数据部分校验。

16比特的校验理论上可以发现1/65536~1/1024的错误,即仍存在1/65536~1/1024的错误不会背发现。

检验和计算可能由网络网络驱动,协议驱动,甚至是硬件完成。例如:以太网传输硬件计算以太网循环容易校验,接受硬件验证这个校验。如果接受验证发现错误,Wireshark抓包工具将不会接收到这个包,以太网硬件会直接丢弃这个包。

高层校验通常是由协议执行,并将完成后的包转交给硬件。比较新的网络硬件可以执行一些高级功能,如IP检验和计算,这被成为checksum offloading。网络驱动不会计算校验和,只是简单将校验和字段留空或填入无效信息,交给硬件计算。但是一般来说,校验部分在协议栈进行,通过Wireshark抓包经常可以看到校验失败的情况。

参考链接:

http://man.lupaworld.com/content/network/wireshark/c7.7.html

http://blog.gesha.net/archives/366/

【数据包的校验算法】

IP、ICMP、UDP和TCP报文头部都有校验和字段,大小都是16bit,算法也基本一样:

在发送数据时按如下步骤:

(1)把校验和字段置为0;

(2)把需校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;

(3)把得到的结果存入校验和字段中。

在接收数据时按如下步骤:

(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;

(2)检查计算出的校验和的结果是否为0;

(3)如果等于0,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要丢弃数据包。

虽然上面四种报文的校验和算法一样,但在作用范围存在不同:

IP校验和只校验20字节的IP报头;

而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);

UDP和TCP校验和不仅覆盖整个报文,而且还有12字节的IP伪首部,包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节,第一字节补0)和TCP/UDP包长(2字节)。另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(注意,填充字节只是为了计算校验和,可以不被传送)。

UDP的校验和是可选的,当校验和字段为0时,表明该UDP报文未使用校验和,接收方就不需要校验和检查。

参考链接:

/article/10964528.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: