IP 包头的 checksum 是如何计算的?

IP 包头的 checksum 是如何计算的?

 

struct HdrIp {
   byte: ihl_ver;      // IP header (RFC 791) - Internet Layer
                       // Combined field:
                      //   ihl:4 - IP header length divided by 4
                      //   version:4 - IP version
   byte: tos;         // IP type-of-service field
   word: tot_len;     // total length
   word: id;          // unique ID
   word: frag_off;    // Fragment Offset + fragmentation flags (3 bits)
   byte: ttl;         // time to live
   byte: protocol;     // protocol type
   word: checksum;    // IP header checksum
   InAddr : saddr;    // source IP
   InAddr : daddr;   // destination IP
};

这是一个IP包头格的说明. 里面有一个 checksum

RFC791 里是这样说的:

    The checksum algorithm is:
      The checksum field is the 16 bit one's complement of the one's
      complement sum of all 16 bit words in the header.  For purposes of
      computing the checksum, the value of the checksum field is zero.


说实话我没太看明白它的意思.大约是说这个 checksum 只是头格式的 checksum 不包括数据部份. 计算方式是把每个 字段补足16bit 来相加,计算前把 checksum 域计为 0.

但我抓了几个包来试,发现都得不到那个 checksum 呢? 是我没看明白,还是方法不正确? 哪个大侠给我说一下 这个 checksum 是如何计算出来的???

这是我抓的这几个包的包头.

第一个:

45                  // ihl_ver
00                  // tos
00 28               // tot_len
16 B9               // id
40 00               // frag_off
80                  // time to live
06                  // IP Protocel
61 8F               // checksum  这个是 checksum
C0 A8 00 D1         // saddr
C0 A8 00 66         // daddr  

这是第二个:

45                    // ihl_ver
00                    // tos
00 28                 // tot_len
5B CC                 // id
40 00                 // frag off
80                    // time to live   
06                    // tcp ,udp
1C 7C                 // checksum
C0 A8 00 66           // saddr
C0 A8 00 D1           // daddr

第三个
45                  // ihl_ver
00                  // tos
00 30               // tot-len   // 48 byte , 总长度 - mac 头
16 BA               // id
40 00               // frag off   
80                  // time to live
06                  // tcp udp
61 86               // check sum
C0 A8 00 D1         // saddr
C0 A8 00 66         // daddr

总之我一连计算了几个. 用不同的计算方法都得不到这个 checksum. 这个 checksum 是如何计算的?

 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值