Nemesis2k
驱动牛犊
驱动牛犊
  • 注册日期2002-03-29
  • 最后登录2004-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1972回复:4

关于IP 包头与字节顺序的问题。。。

楼主#
更多 发布于:2002-03-29 18:44
关于IP 包头与字节顺序的问题。。。

在IP头的定义中,最初4位是IP协议版本,然后的4位是IP包头
的长度。而bsd对ip头的定义是这样的:
struct ip
{
#if defined(_LITTLE_ENDIAN_BITFIELD)
_u8 ip_hl:4; // for little-endian machine,such as x86
_u8 ip_v:4;
...
#else
_u8 ip_v:4; // for big-endian machine, such as 68000
_u8 ip_hl:4;
...
};
注意两种情况下协议版本和ip包头长度的位置不同。
这是为什么呢?如果是因为网络字节顺序和主机字节
顺序不同的话,但是这里是字节内部两个
半字节的顺序不同阿。。。
望高手解惑。。。

guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-29 23:18
在不同结构类型的机器里面有两种方式,就是大头在后和大头在前
对于X86都是大头在后
对于十六进制
数据 ab cd ef 00
大头在后就是数值0x00efcdab
大头在前就是数值0xabcdef00了
所以不同结构类型的机器,他们处理的数据是不一样的
而你说的这个定义就是为了在编译的时候可以适应不同的类型机器
而最后得到的数据包是一样的!
lljyxh1
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2002-07-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-03 13:44
我觉得这里说的不是字节序,而是位序,既一个字节中每个位在机器中的存放顺序。可以看一看

linux 辕马/usr/src/linux/include/linux/byteorder中的文件。
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-03 17:17
关于IP 包头与字节顺序的问题。。。

在IP头的定义中,最初4位是IP协议版本,然后的4位是IP包头
的长度。而bsd对ip头的定义是这样的:
struct ip
{
#if defined(_LITTLE_ENDIAN_BITFIELD)
_u8 ip_hl:4; // for little-endian machine,such as x86
_u8 ip_v:4;
...
#else
_u8 ip_v:4; // for big-endian machine, such as 68000
_u8 ip_hl:4;
...
};
注意两种情况下协议版本和ip包头长度的位置不同。
这是为什么呢?如果是因为网络字节顺序和主机字节
顺序不同的话,但是这里是字节内部两个
半字节的顺序不同阿。。。
望高手解惑。。。

 

这是因为在在各种CPU的处理顺序不同。
因为你要定义两个,表示各4位,而编译器首先会当作两个BYTE,再结合;
而如果你定义一处如 _u8 ip_v_hl……
也既如果定义一处是一样的。
当然,定义两处是为了更清晰。
一剑西来,天外飞仙
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-05 20:59
X86计算机系统CPU在处理和存储数据的时候按照低位在前高位在后的顺序存放的,而小型/中型计算机系统(如SUN SPARC芯片系统)则是恰好相反的,在这二中机器系统进行数据交互的时候就要按照标准的网络顺序来传输;
你所述的定义方法正是位了实现程序在不同芯片/系统之间的程序移植方便而定义的,当然,如果你使用了这样的定义来描述一个IP HEADER结构的话,那么,你的程序也可以到SUN OS下去用GCC OR CC编译就能直接使用了,前提是你不使用WINDOWS相关的API
 :P :P :P
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
游客

返回顶部