TCP的Checksum计算方法[转]

如果要自己填充IP数据报,那么计算Checksum是必不可少的一步,算法如下。

按16位一组,取补码相加,然后对和取补码
USHORT Checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;

while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size)
cksum += *(UCHAR*)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}

===================

checksum的计算:除去checksum以外的所有ip头数据,以16-bit的形式,计算其1‘s component和,即溢出位加在最小位上(any overflows from the most significant bits are added into the least significant bits.),再将其和的反码(1‘s component查了半天,英语真是差=.=)放入checksum field
校验的过程:头部的数据,包括checksum,计算其和,取反,如果结果为全1,则succeed(原文见 ftp://ftp.rfc-editor.org/in-notes/rfc1071.txt)
当其中的数据发生了改变,如何进行计算呢?如ttl,每过一个网关,ttl减一,而checksum当然也得相应发生改变,重新计算?
当然是离不开数学滴,于是有了 Incremental Updating of the Internet Checksum(原文见 ftp://ftp.rfc-editor.org/in-notes/rfc1141.txt),于是就以下一个checksum的计算式子:
HC' = ~(C + (-m) + m')= HC + m + ~m'
当然,也不能离开计算机的特性滴:+0,-0(溢出吧,算),于是又出来了一个Computation of the Internet Checksum via Incremental Update(原文见ftp://ftp.rfc-editor.org/in-notes/rfc1624.txt)于是就有了以下一个计算式子,消除特殊情况下的副作用的:

HC' = ~(C + (-m) + m') = ~(~HC + ~m + m')

HC - old checksum in header

C   - one's complement sum of old header

HC' - new checksum in header

C' - one's complement sum of new header

m   - old value of a 16-bit field

m' - new value of a 16-bit field

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值