udp校验和计算方法C语言,IP.ICMP.UDP.TCP 校验和算法分享

本文详细介绍了IP、ICMP、UDP和TCP报文头部的校验和计算方法,强调了校验和在数据包传输中的重要性。通过C语言代码展示了如何进行二进制反码求和,并解释了为何在TCP/IP协议中使用反码求和,包括其端序独立性、校验和计算和验证的便捷性以及在路由器转发时的高效性。
摘要由CSDN通过智能技术生成

以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是16bit字的二进制反码和(晕,以前都没注意原来是反码和,看来以前看书不仔细啊!罪过,罪过~~),觉得很奇怪,为什么会用反码和,而不是直接求和呢?(因为我认为TCP/IP协议里面的算法和思想一般都是非常经典的,人家这么做一定有原因的)下面就来探索一下这个校验和算法具体怎么实现的。

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

在发送数据时,为了计算数据包的校验和。应该按如下步骤:

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

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

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

在接收数据时,计算数据包的校验和相对简单,按如下步骤:

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

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

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

虽然上面四种报文的校验和算法一样,但在作用范围存在不同:IP校验和只校验20字节的IP报头;而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);UDP和T

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值