pcap中的ntohs()究竟做了什么?

问题描述:

我从以下答案之一读取文档:pcap中的ntohs()究竟做了什么?

ntohs函数以TCP/IP网络字节顺序(AF_INET或AF_INET6地址系列)取16位数字,并在主机字节中返回一个16位数字订购。

请用一个例子来解释一下,比如什么是网络字节顺序和什么是主机字节顺序。

数1000是在二元的,1111101000.

如果这是在一个16位的二进制数,这是0000001111101000.

如果真实分成两个8位字节,这是与两个字节值00000011和11101000.

这两个字节可以有两种不同的顺序:

  • 在“大端”字节顺序,将含有高8位字节是第一和Th e字节,低8位是第二位,所以第一个字节是00000011,第二个字节是11101000.
  • 在“little-endian”字节顺序中,包含8位的字节是第一位,而字节含有 8位是第二,所以第一个字节是11101000,第二个字节是00000011

在字节addressible机,硬件可以是“大端”或“小端“,取决于哪个字节存储在内存中较低的地址。大多数个人电脑都是小端的;较大的计算机具有大端和小端的特点,其中一些大型计算机(例如IBM大型机和中型计算机以及SPARC服务器)是大端计算机。

大多数网络都是位串行的,所以这些位一个接一个地传输。一个字节的位可能首先传输最重要或最不重要的位,但网络硬件会隐藏处理器的细节。但是,它们将按照它们在主机的存储器中的顺序发送字节,因此,如果小端机器正在将数据传输到大端机器,则小端机器传输的数字看起来不同在接收端大机器上;那些差异是而不是被网络硬件隐藏。

因此,为了允许大端和小端机器通信,在每个协议层,或者:

  • 一个“标准”的字节顺序需要选择,并且使用机械的不同字节顺序需要移动多字节数字的字节,以便它们不在机器的标准字节顺序中,在传输数据之前,将它们移动,以使它们在机器的标准字节顺序中为,接收后数据;
  • 这两台机器需要协商会话的特定字节顺序(例如,对于X11网络窗口协议,从客户机到服务器的初始消息指定要使用的字节顺序);
  • 协议消息需要指定正在使用的字节顺序(例如,使用DCE RPC完成;例如,这是用于“Microsoft RPC”的协议);接收机需要以某种方式正确地猜测字节顺序(我不知道任何当前使用的协议在哪里完成,但旧的BSD“谈话”协议没有使用上述任何技术,并且Sun386i的实施必须使用它来处理高端的摩托罗拉68K机器和小端英特尔x86机器)。

各种互联网协议使用第一种策略,指定big-endian作为字节顺序;它在各种RFC中被称为“网络字节顺序”。 (微软的SMB文件访问协议也使用第一种策略,但是指定小端。)

所以“网络字节顺序”是大端。 “主机字节顺序”是您正在使用的机器的字节顺序;它可能是big-endian,在这种情况下,ntohs()只是返回您给它的值,或者它可能是小端,在这种情况下,ntohs()会交换您给它的值的两个字节并返回该值。例如,在一个big-endian机器上,ntohs(1000)将返回1000,并且在小端机器上,ntohs(1000)将交换高位和低位字节,给出二进制数1110100000000011或十进制数59395。