计算机网络(3) 字节顺序:网络字节序与IPv4-低字节保存在内存低地址,高字节保存在内存高地址。

例如(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头文件提供了字节序转换相关的辅助函数如下:

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

h表示主机序  
n表示网络序
s表示short类型
l表示long类型

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

uint32_t htonl(uint32_t hostint32);
功能:
  将 32 位主机字节序数据转换成网络字节序数据
参数:
  hostint32:需要转换的 32 位主机字节序数据,uint32_t 为 32 为无符号整型
返回值:
  成功:返回网络字节序的值
uint16_t htons(uint16_t hostint16);
功能:
  将 16 位主机字节序数据转换成网络字节序数据
参数:
  hostint16:需要转换的 16 位主机字节序数据,uint16_t,unsigned short int
返回值:
  成功:返回网络字节序的值
uint32_t ntohl(uint32_t netint32);
功能:
  将 32 位网络字节序数据转换成主机字节序数据
参数:
  netint32:待转换的 32 位网络字节序数据,uint32_t,unsigned int
返回值:
  成功:返回主机字节序的值
uint16_t ntohs(uint16_t netint16);
功能:
  将 16 位网络字节序数据转换成主机字节序数据
参数:
  netint16:待转换的 16 位网络字节序数据,uint16_t,unsigned short int
返回值:
  成功:返回主机字节序的值

 三.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分配规则,可以指定掩码长度。

上一篇:【微信小程序】uni-app 配置网络请求


下一篇:2024.6.13 bailuo-Docker 安装与镜像拉取