当前位置:   article > 正文

计算机网络(3) 字节顺序:网络字节序与IPv4

计算机网络(3) 字节顺序:网络字节序与IPv4

一.小端与大端

小端(Little endian):低字节保存在内存低地址,高字节保存在内存高地址。

大端(Big endian):低字节保存在内存高地址,高字节保存在内存低地址。

例如(1400(十进制)): 内存地址        0x0000        0x0001

                                             数据(小端)      0x78            0x05              

                                             数据(大端)    0x05            0x78

        可以看出大端符合人类直觉,我们计算Hex时的表示方法其实是大端的表示。但是一般x86架构的计算机CPU使用的是小端。再举一个例子如下:

如果我们将0x1234abcd 写入到以 0x0000 开始的内存中,则Little endian 和 Big endian 模式的存放结果如下: 
地址           0x0000         0x0001        0x0002          0x0003
big-endian   0x12           0x34            0xab            0xcd 
little-endian  0xcd           0xab            0x34            0x12

二.网络字节序

        因为处理器架构的不同CPU内部使用的字节序也不尽相同,例如x86使用小端字节序,ARM使用大端字节序。为了在网络服务中统一字节序,我们规定网络字节序为大端字节序(Big endian)。因而针对不同的处理器架构,可能在进行网络编程时需要进行网络字节序的转换。

        在Linux下inet.h头文件提供了字节序转换相关的辅助函数如下:

  1. #include <arpa/inet.h>
  2. uint32_t htonl(uint32_t hostlong);
  3. uint16_t htons(uint16_t hostshort);
  4. uint32_t ntohl(uint32_t netlong);
  5. uint16_t ntohs(uint16_t netshort);
  6. h表示主机序
  7. n表示网络序
  8. s表示short类型
  9. l表示long类型

        htonl表示将主机字节序转换为网络字节序(大端)且入参为uint32。使用转换函数必须特别小心,需要知道自己的平台架构信息,否则转换将导致错误。详细转换函数如下:

  1. uint32_t htonl(uint32_t hostint32);
  2. 功能:
  3. 32 位主机字节序数据转换成网络字节序数据
  4. 参数:
  5. hostint32:需要转换的 32 位主机字节序数据,uint32_t32 为无符号整型
  6. 返回值:
  7. 成功:返回网络字节序的值
  1. uint16_t htons(uint16_t hostint16);
  2. 功能:
  3. 16 位主机字节序数据转换成网络字节序数据
  4. 参数:
  5. hostint16:需要转换的 16 位主机字节序数据,uint16_tunsigned short int
  6. 返回值:
  7. 成功:返回网络字节序的值
  1. uint32_t ntohl(uint32_t netint32);
  2. 功能:
  3. 32 位网络字节序数据转换成主机字节序数据
  4. 参数:
  5. netint32:待转换的 32 位网络字节序数据,uint32_tunsigned int
  6. 返回值:
  7. 成功:返回主机字节序的值
  1. uint16_t ntohs(uint16_t netint16);
  2. 功能:
  3. 16 位网络字节序数据转换成主机字节序数据
  4. 参数:
  5. netint16:待转换的 16 位网络字节序数据,uint16_tunsigned short int
  6. 返回值:
  7. 成功:返回主机字节序的值

 三.IPv4

        IPv4地址用于在命名和识别一个网络设备,IPv4处于TCP/IP4层模型的网络层,它的长度为32Bits,也就是四字节。 格式形如A.B.C.D。

        子网掩码用于分辨两个不同的IP Addr是否处在同一子网段下,通过与子网掩码做与操作判断。如果与操作后得到的结果相同则在同一网段下。例如:192.168.1.111 192.168.1.104子网掩码为255.255.255.0(0xffffff00)与操作后结果都为192.168.1.0故这两个IPV4地址在同一网段下。

三.IPv4分配规则

 目前广泛使用CIDR分配规则,可以指定掩码长度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/731387
推荐阅读
相关标签
  

闽ICP备14008679号