Chinaunix首页 | 论坛 | 博客
  • 博客访问: 534473
  • 博文数量: 120
  • 博客积分: 3030
  • 博客等级: 中校
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-05 01:00
文章存档

2011年(1)

2009年(2)

2008年(32)

2007年(33)

2006年(52)

我的朋友

分类: LINUX

2007-08-28 15:22:00

最近在内核态构造http包 ,对于ip tcp校验的认识纪录如下 :
1.   IP首部的16位首部校验和只对首部作校验,步骤如下:  
  首先把校验和字段置位0,然后对首部   中每个16bit进行二进制反码求和,结果存在校验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。如果传输中没有任何差错,那么接受方结果应该是全1,否则就有出错。  
   
  2.   TCP和UDP的校验和是覆盖了首部和数据两部分的,UDP的校验和可选,TCP则是必须的。另外,还有两个方面是跟IP的校验和不同的:  
   
  (1)UDP数据报的长度可以是奇数字节的,但校验和是每个16bit进行二进制反码求和,所以必要是要在最后填充字节0,但是这些字节不一定会被传输。  
   
  (2)这TCP和UDP两个数据报都有12字节的伪首部,在各自的首部之前,他们是为了计算校验和的需要。格式如下:  
                                                                32位源IP地址  
                                                                32位目的IP地址  
                                        0             |     8位协议       |       16位UDP/TCP长度  
  共12字节  
  后面就是真正的首部
阅读(3018) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-17 19:26:56

草本兄,TCP带数据的时候,效验为什么必须这样才正确: memcpy(buf, &psdheader,sizeof(psdheader)); memcpy(buf+sizeof(psdheader),&tcpheader,sizeof(tcpheader)); memcpy(buf+sizeof(psdheader)+sizeof(tcpheader),data,datalen); tcpheader.checksum = checksum((unsigned short *)buf,sizeof(psdheader)+sizeof(tcpheader)+datalen); tcpheader.checksum = htons(ntohs(tcpheader.checksum) - (unsigned short)datalen); 看,后面要有个减操作,才能正确,为什么呢?