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

cpp 复制代码
#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。使用转换函数必须特别小心,需要知道自己的平台架构信息,否则转换将导致错误。详细转换函数如下:

cpp 复制代码
uint32_t htonl(uint32_t hostint32);
功能:
  将 32 位主机字节序数据转换成网络字节序数据
参数:
  hostint32:需要转换的 32 位主机字节序数据,uint32_t 为 32 为无符号整型
返回值:
  成功:返回网络字节序的值
cpp 复制代码
uint16_t htons(uint16_t hostint16);
功能:
  将 16 位主机字节序数据转换成网络字节序数据
参数:
  hostint16:需要转换的 16 位主机字节序数据,uint16_t,unsigned short int
返回值:
  成功:返回网络字节序的值
cpp 复制代码
uint32_t ntohl(uint32_t netint32);
功能:
  将 32 位网络字节序数据转换成主机字节序数据
参数:
  netint32:待转换的 32 位网络字节序数据,uint32_t,unsigned int
返回值:
  成功:返回主机字节序的值
cpp 复制代码
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分配规则,可以指定掩码长度。

相关推荐
计算机安禾2 小时前
【计算机网络】第14篇:TCP连接管理的有限状态机模型——三次握手与四次挥手的严格推导
网络·tcp/ip·计算机网络
计算机安禾5 小时前
【计算机网络】第16篇:TCP流量控制——接收窗口调度的缓冲管理问题
网络·tcp/ip·计算机网络
里晓山7 小时前
SOME/IP协议(上)
网络·网络协议·tcp/ip·车载系统
wangl_927 小时前
Modbus TCP/IP 地址完全解析手册
网络·tcp/ip·php·modbus·kepware·kepserverex
05候补工程师8 小时前
[408考研笔记] 传输层与网络层核心辨析:从逻辑通信到滑动窗口计算
网络·经验分享·笔记·网络协议·tcp/ip·考研·ip
如君愿10 小时前
考研复习 Day 31 | 习题--计算机网络 第五章(运输层 中)、数据结构 图 (中)
数据结构·计算机网络·课后习题
代码中介商10 小时前
Linux TCP 协议深度解析:从状态机到拥塞控制
linux·网络·tcp/ip
落羽的落羽10 小时前
【网络】TCP与UDP协议使用指南,Socket编程实现Echo服务
linux·服务器·网络·c++·网络协议·tcp/ip·机器学习
Zzzzmo_1 天前
计算机网络原理初识
计算机网络·java-ee
如君愿1 天前
考研复习 Day 30 | 习题--计算机网络 第五章(运输层 上)、数据结构 图(上)
数据结构·计算机网络·课后习题