Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2325341
  • 博文数量: 145
  • 博客积分: 8668
  • 博客等级: 中将
  • 技术积分: 3922
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-09 21:21
个人简介

work hard

文章分类

全部博文(145)

文章存档

2016年(1)

2015年(1)

2014年(1)

2013年(12)

2012年(3)

2011年(9)

2010年(34)

2009年(55)

2008年(20)

2007年(9)

分类: 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了。
阅读(2000) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~