IP首部校验和的算法

    IP/ICMP/IGMP/TCP/UDP/等协议的校验和算法是相同的,采用的都是将数据流视为16位整数流进行重复的叠加计算。

    计算校验和的步骤:

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

(2)对IP头部的每16bit进行二进制求和。

(3)如果和的高16位不位0,则将和的高16位和低16位反复的相加,直到和的16位为0,从而获得一个16位的值。

(4)将该16位的值取反,存入校验和字段。

例如:

IP报头

45  00       00  31

89  F5      00  00

6E  06      00   00      //校验字段

DE B7      45   5D     //源IP地址

C0 A8       00   DC    //目的IP地址


根据如上的IP报头,可以求得校验和为:

4500+0031+89F5+0000+6E06+0000+DEB7+455D+C0A8+00DC = 322C4

由于计算的和为322C4的高16位不为0,所以将和的高16位和低16位进行反复的相加,直到和的高16位位0为止。

0003+22C4 = 22C7然后将结果进行取反操作~22C7 = DD38则DD38为最终的校验和。

### IP数据报首部校验和的计算方法 IP数据报首部检验和是为了确保IP数据包在网络传输过程中不会因错误而损坏其首部信息的一种机制。以下是关于如何计算IP数据报首部检验和的具体方法: #### 计算过程 在发送端,首先将IP数据报首部中的“检验和”字段设置为0[^3]。接着,按照网络字节顺序(大端模式),将整个IP首部分割成一系列16位整数序列。如果分割到最后发现剩余不足16位,则会在末尾补充零以形成完整的16位单元。 随后采用反码算术求和的方式对这些16位数值逐一累加起来。所谓反码算术是指忽略溢出的部分并将其重新加入到总和之中。最终获得的结果再取反码作为实际填入“检验和”字段的内容[^3]。 ```python def calculate_checksum(header_bytes): checksum = 0 for i in range(0, len(header_bytes), 2): word = (header_bytes[i] << 8) + header_bytes[i+1] checksum += word while checksum >> 16: checksum = (checksum & 0xFFFF) + (checksum >> 16) checksum = ~checksum & 0xFFFF return checksum ``` 以上代码展示了基于Python实现的一个简单版本用于模拟这一流程的功能函数[^3]。 --- ### 首部校验和的作用 IP数据报首部校验和的主要功能在于验证IP头部信息在整个通信链路上传输期间是否保持一致无误。具体来说,在接收端接收到一个IP分组之后会重复执行类似的计算操作——即将除开当前存储于“检验和”位置之外的所有其他部分再次依照前述规则进行累加运算,并对比所得结果预期值之间是否存在差异。假如两者完全吻合则表明该次传递成功;反之则意味着出现了某种形式上的差错,此时通常采取措施如直接丢弃有问题的数据帧来维护整体系统的稳定性以及准确性[^3]。 此外值得注意的是,这种校验仅限于保护IP头本身的安全性而不涉及更层次负载区域内的具体内容防护工作,因为后者往往由更级别的协议负责完成相应级别的保障任务,比如TCP通过自身的复杂算法提供更强健的数据完整性确认服务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值