Chinaunix首页 | 论坛 | 博客
  • 博客访问: 290119
  • 博文数量: 67
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 802
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 16:23
文章分类
文章存档

2011年(4)

2010年(18)

2009年(32)

2008年(13)

我的朋友

分类: LINUX

2008-11-03 14:14:19

贴出这段源码,正好了解一下如果一个数据包中只有一个字段(不超过2 bytes)被修改,如何重新快速计算校验和的。
位于include/net/ip.h, 内核版本是2.4.22.

/* The function in 2.2 was invalid, producing wrong result for
* check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */

static inline
int ip_decrease_ttl(struct iphdr *iph)
{
   u32 check = iph->check;
   check += __constant_htons(0x0100);
   iph->check = check + (check>=0xFFFF);
   return --iph->ttl;
}


不过根据注释,在check=0xFEFF的时候,根据此种方法计算会得出错误结果。
偶分析的情况应该是,check=0xFEFF时,如果修改TTL,使其减1. 那么经过
check += __constant_htons(0x0100)
计算出来的check=0xFFFF.
从理论上讲,用二进制补码得出的校验和的值是不会为0xFFFF的。可能作者指的是这个意思。 因此,作者加上了这样一行代码
iph->check = check + (check>=0xFFFF);
这样就保证了采用这种方式计算校验和的时候,不会出现0xFFFF的情况,而应该时0x0000了。
阅读(1557) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~