主机字节序和网络字节序

发布时间 2023-10-15 09:35:34作者: 王景迁

小端字节序和大端字节序

考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。
Inter x86、ARM核采用的是小端模式,Power PC、MIPS UNIX和HP-PA UNIX采用大端模式。

网络字节序和主机字节序

网络字节序是TCP/IP中规定好的一种数据表示格式,采用big endian排序方式,与具体的CPU类型、操作系统等无关,保证数据在不同主机之间传输时能够被正确解释。
不同的机器主机字节序不同,由CPU决定,与操作系统无关。某个给定系统所用的字节序称为主机字节序(host byte order)。比如x86系列CPU都是little-endian的字节序。
因为这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序。
网络字节序与主机字节序之间的转换函数:htons(), ntohs(), htons(),htonl(),位于头文件<netinet/in.h>,htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换。

用IP地址127.0.0.1为例:
第一步 127.0.0.1
把IP地址每一部分转换为8位的二进制数。
第二步 01111111 00000000 00000000 00000001=2130706433(主机字节序)
然后把上面的四部分二进制数从右往左按部分重新排列。
第三步 00000001 00000000 00000000 01111111=16777343(网络字节序)

Wireshark抓包结果是网络字节序

起始地址是高序字节。

参考资料

https://www.cnblogs.com/xingguang1130/p/11643446.html