why (iphdr->ihl)*4 or (iphdr->ihl)

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首部有沒有附加數據部分
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章