why (iphdr->ihl)*4 or (iphdr->ihl)
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包的長度。把網絡字節序,轉爲本機序就可以了! 單獨計算這個結構體倒是也好辦。不過計算ICMP頭裏的IP包長度就不能這麼做了吧。 我見過的做法是:
struct ip *ip;
.....;
ip->ip_hl 看過RFC791。
ip->ip_hl 的最小合法大小是5.
沒有更多資料了,期待大牛們指教。 [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( 沒理解上去。
詳細說說。
謝謝。 ok,謝謝。
明白了。
但是如果ip頭部有附加數據怎麼辦?這個長度改怎麼計算? IHL域就是用來計算IP首部長度的,得到它的值乘以4就是IP首部長度
IP首部包括!20字節的定長部分+可選的變長部分!
一般IP首部都沒附加部分,所以算出來的就是20個字節
總之,要算IP首部長度,只要IHL×4,不管IP首部有沒有附加數據部分
#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包的長度。把網絡字節序,轉爲本機序就可以了! 單獨計算這個結構體倒是也好辦。不過計算ICMP頭裏的IP包長度就不能這麼做了吧。 我見過的做法是:
struct ip *ip;
.....;
ip->ip_hl 看過RFC791。
ip->ip_hl 的最小合法大小是5.
沒有更多資料了,期待大牛們指教。 [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( 沒理解上去。
詳細說說。
謝謝。 ok,謝謝。
明白了。
但是如果ip頭部有附加數據怎麼辦?這個長度改怎麼計算? IHL域就是用來計算IP首部長度的,得到它的值乘以4就是IP首部長度
IP首部包括!20字節的定長部分+可選的變長部分!
一般IP首部都沒附加部分,所以算出來的就是20個字節
總之,要算IP首部長度,只要IHL×4,不管IP首部有沒有附加數據部分
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.