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首部有没有附加数据部分