【发布时间】:2013-03-30 07:25:46
【问题描述】:
我从其中一个答案中阅读了文档:
ntohs 函数采用 TCP/IP 网络字节顺序的 16 位数字(AF_INET 或 AF_INET6 地址系列)并返回主机字节顺序的 16 位数字。
请举例说明,什么是网络字节序,什么是主机字节序。
【问题讨论】:
标签: pcap endianness
我从其中一个答案中阅读了文档:
ntohs 函数采用 TCP/IP 网络字节顺序的 16 位数字(AF_INET 或 AF_INET6 地址系列)并返回主机字节顺序的 16 位数字。
请举例说明,什么是网络字节序,什么是主机字节序。
【问题讨论】:
标签: pcap endianness
数字 1000 在二进制中是 1111101000。
如果是 16 位二进制数,则为 0000001111101000。
如果它被分成两个 8 位字节,那就是两个字节,其值为 00000011 和 11101000。
这两个字节可以有两种不同的顺序:
在字节可寻址的机器中,硬件可以是“大端”或“小端”,这取决于哪个字节存储在内存中的较低地址。大多数个人电脑都是小端的。大型计算机有 big-endian 和 little-endian 两种风格,许多大型计算机(例如 IBM 大型机和中端计算机以及 SPARC 服务器)是 big-endian。
大多数网络都是位串行的,因此位一个接一个地传输。一个字节的位可能先传输最高有效位或最低有效位,但网络硬件将对处理器隐藏这些细节。但是,它们会按照它们在主机内存中的顺序传输 bytes,因此,如果 little-endian 机器正在向 big-endian 机器传输数据,那么 little-endian机器传输在接收大端机器上看起来会有所不同;这些差异不会被网络硬件隐藏。
因此,为了让 big-endian 和 little-endian 机器进行通信,在每个协议层,要么:
各种互联网协议使用第一种策略,指定大端为字节序;它在各种 RFC 中被称为“网络字节顺序”。 (微软的 SMB 文件访问协议也使用第一种策略,但是指定了 little-endian。)
所以“网络字节顺序”是大端的。 “主机字节顺序”是您正在使用的机器的字节顺序;它可能是 big-endian,在这种情况下,ntohs() 只返回您给它的值,或者它可能是 little-endian,在这种情况下,ntohs() 交换您给它的值的两个字节并返回该值。例如,在大端机器上,ntohs(1000) 将返回 1000,而在小端机器上,ntohs(1000) 将交换高位和低位字节,给出二进制 1110100000000011 或十进制 59395。
【讨论】: