why (iphdr->ihl)*4 or (iphdr->ihl)<<2?

来源:互联网 发布:windows loader v2.4 编辑:程序博客网 时间:2024/06/05 04:24

naihe2010 发表于 2010-4-13 06:47

struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
        __u8        ihl:4,
                version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
        __u8        version:4,
                  ihl:4;
#else
#error        "Please fix "
#endif
        __u8        tos;
        __be16        tot_len;
        __be16        id;
        __be16        frag_off;
        __u8        ttl;
        __u8        protocol;
        __sum16        check;
        __be32        saddr;
        __be32        daddr;
        /*The options start here. */
};

tot_len,就是IP包的长度。把网络字节序,转为本机序就可以了!

VIP_fuck 发表于 2010-4-13 08:05

单独计算这个结构体倒是也好办。不过计算ICMP头里的IP包长度就不能这么做了吧。

VIP_fuck 发表于 2010-4-13 09:23

我见过的做法是:
struct ip *ip;
.....;
ip->ip_hl

VIP_fuck 发表于 2010-4-13 10:41

看过RFC791。
ip->ip_hl 的最小合法大小是5.
没有更多资料了,期待大牛们指教。

ghp268 发表于 2010-4-13 11:59

[quote]原帖由 [i]VIP_fuck[/i] 于 2009-10-30 11:22 发表 [url=http://bbs3.chinaunix.net/redirect.php?goto=findpost&pid=11407409&ptid=1605500][attach]21103[/attach][/url]
我见过的做法是:
struct ip *ip;
.....;
ip->ip_hl  [/quote]


因为IP首部的IHL域在计算IP首部长度是是以32位为单位的(4字节)
所以得到IHL域的值要乘以4(

VIP_fuck 发表于 2010-4-13 13:17

没理解上去。

详细说说。

谢谢。

VIP_fuck 发表于 2010-4-13 14:36

ok,谢谢。
明白了。

但是如果ip头部有附加数据怎么办?这个长度改怎么计算?

ghp268 发表于 2010-4-13 15:54

IHL域就是用来计算IP首部长度的,得到它的值乘以4就是IP首部长度
IP首部包括!20字节的定长部分+可选的变长部分!
一般IP首部都没附加部分,所以算出来的就是20个字节

总之,要算IP首部长度,只要IHL×4,不管IP首部有没有附加数据部分