一、网络字节序
定义
TCP/IP 协议强制规定,网络上传输的数据流必须使用大端字节序(低地址存放高位字节) 通俗理解:像我们写数字一样,左边(低地址)是高位,右边(高地址)是低位。例如 0x12345678,先发 0x12,最后发 0x78。
- 统一原因
互联网由不同架构的机器组成(x86 是小端,PowerPC/某些网络设备是大端)
网络传输严格遵循从低地址到高地址的顺序发送和接收:发送端将数据在内存中从低地址字节开始依次发出,接收端按收到顺序依次存入本地的低地址到高地址。这意味着网络上的字节流顺序完全取决于发送端的内存布局——小端机发送时先发低位字节,大端机先发高位字节。接收端则原样按序存入内存,最终解释出的数值由本机字节序决定。这就是为什么直接发送会导致跨平台错误,而使用
htons/ntohs统一转换为网络字节序(大端)发送,能保证无论发送端是什么机器,网络上的字节流都是'高位在前'的标准顺序,接收端再根据自身字节序正确还原
| 机器类型 | 内存表示 (低→高) | 发送顺序 | 网络字节流 | 大端机接收解释 | 小端机接收解释 |
|---|---|---|---|---|---|
| 小端机发 | 78 56 34 12 | 78→56→34→12 | 78 56 34 12 | 0x78563412 ❌ | 0x12345678 ✅ |
| 大端机发 | 12 34 56 78 | 12→34→56→78 | 12 34 56 78 | 0x12345678 ✅ | 0x78563412 ❌ |
- 发送端(编码)
通过将数据从主机字节序转换为网络字节序,保证线上的数据流符合 TCP/IP 标准
如果是大端机:不需要转(或者说转了也不变)
如果是小端机:必须翻转字节顺序
- 接收端(解码)
通过将数据从网络字节序转换回主机字节序,保证本地 CPU 能够读取到正确的数据
如果是大端机:不需要转
如果是小端机:必须翻转字节顺序
字节序转换函数
概览
| 函数名 | 全称 | 功能 | 应用场景 |
|---|---|---|---|
| htonl | Host to Network Long | 主机序 → 网络序 (32 位) | 发送 IP 地址前转换 |
| htons | Host to Network Short | 主机序 → 网络序 (16 位) | 发送端口号前转换 |






