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

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首部有没有附加数据部分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值