以下字段摘自《TCPIP协议详解卷一:协议》
1。首部检验和字段是根据I P首部计算的检验和码。它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。
2。UDP检验和覆盖UDP首部和UDP数据。回想I P首部的检验和,它只覆盖I P的首部—并不
覆盖I P数据报中的任何数据。
   UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP
的检验和是必需的。
   尽管UDP检验和的基本计算方法与我们在3 . 2节中描述的I P首部检验和计算方法相类似(16 bit字的二进制反码和),但是它们之间存在不同的地方。首先,UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。
   其次, UDP数据报和TCP段都包含一个1 2字节长的伪首部,它是为了计算检验和而设置的。伪首部包含I P首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地(例如, I P没有接受地址不是本主机的数据报,以及I P没有把应传给另一高层的数据报传给UDP)。
3。检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。TCP检验和的计算和UDP检验和的计算相似,使用
如11.3节所述的一个伪首部。
问题:
为什么我看到很多程序在IP首部校验和的校验范围却是ipheader + tcpheader(由此可能还有ipheader + udpheader)而不是单个ipheader。源程序随处可见:
http://yingzhijia.myrice.com/anquan/anf/3.htm
http://www.hzsynet.com/jswd/attacktech/attacktech-0001.htm
……
http://www.fanqiang.com/a4/b7/20010419/133203.html(这个更厉害,根本就不校验)哪位高手给解释一下,我的分全用在网络编程版块了,值啊!

解决方案 »

  1.   

    在ip头中的16位校验和只对ip头部进行校验,一般头部为16位。
    在tcp首部也有自己的校验和,它是对tcp首部和tcp的数据部分进行校验的。
    同样,icmp、igmp、udp和tcp是相同的。
      

  2.   

    to  wwwooowww:
    我也是那么理解的,可是看到的程序不是那样子
    我列出的链接你可以看看
      

  3.   

    我以前没见过,或者是没注意过。不解。
    不过能肯定的一点是,ip检验和只计算ip头。那种实现一定有错误。因为我刚刚专门抓了个tcp包,辛辛苦苦地拿计算器这种最可靠的工具(哦,对不起,我这找不着算盘)算了一遍,证明了这一点。
      

  4.   

    我对伪首部的问题一直有点迷惑,到底作用是什么,如果说udp要用它来保证质量的话,那么tcp用它来干什么呢?
    再做一次质量保证!?
      

  5.   

    to logdzc(永远的步行者):
    我肯定,你说的是对的
    我刚才也验证了一遍,咋回事呢?还有,为什么tcp头部没有segment的长度字段,而udp却有udp长度字段,出于什么考虑呢?