gpt4 book ai didi

pcap - pcap 中的 ntohs() 到底是做什么的?

转载 作者:行者123 更新时间:2023-12-04 00:06:39 26 4
gpt4 key购买 nike

我从一个答案中阅读了文档:

ntohs 函数采用 TCP/IP 网络字节顺序(AF_INET 或 AF_INET6 地址族)的 16 位数字,并以主机字节顺序返回一个 16 位数字。

请举例说明,什么是网络字节序,什么是主机字节序。

最佳答案

数字 1000 在二进制中是 1111101000。

如果是 16 位二进制数,则为 0000001111101000。

如果它被分成两个 8 位字节,那就是两个字节,其值为 00000011 和 11101000。

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

  • 在“big-endian”字节序中,包含高 8 位的字节在前,包含低 8 位的字节在后,因此第一个字节为 00000011,第二个字节为 11101000。
  • 在“little-endian”字节顺序中,包含低8位的字节在前,包含高8位的字节在后,因此第一个字节为11101000,第二个字节为00000011。

  • 在字节可寻址的机器中,硬件可以是“大端”或“小端”,这取决于哪个字节存储在内存中的较低地址。大多数个人电脑都是小端的。大型计算机有 big-endian 和 little-endian 两种风格,许多大型计算机(例如 IBM 大型机和中端计算机以及 SPARC 服务器)是 big-endian。

    大多数网络都是位串行的,因此位是一个接一个地传输的。一个字节的位可能先传输最高有效位或最低有效位,但网络硬件将对处理器隐藏这些细节。但是,它们将按照它们在主机内存中的顺序传输字节,因此,如果小端机器正在向大端机器传输数据,那么小端机器传输的数字在主机上看起来会有所不同。接收大端机;这些差异并没有被网络硬件隐藏。

    因此,为了让 big-endian 和 little-endian 机器进行通信,在每个协议(protocol)层,要么:
  • 需要选择“标准”字节顺序,使用不同字节顺序的机器需要移动多字节数字的字节,使它们不在机器的标准字节顺序中,在传输数据之前,移动它们, 使它们在接收数据后以机器的标准字节顺序排列;
  • 两台机器需要为 session 协商特定的字节顺序(例如,对于 X11 网络窗口协议(protocol),从客户端到服务器的初始消息指定使用的字节顺序);
  • 协议(protocol)消息需要指定正在使用的字节顺序(例如,DCE RPC 就是这样做的;这是用于“Microsoft RPC”的协议(protocol));
  • 接收机器需要以某种方式正确猜测字节顺序(我不知道任何当前使用的协议(protocol),但旧的 BSD“谈话”协议(protocol)没有使用上面使用的任何技术,并且实现Sun386i 必须使用它来处理大端的摩托罗拉 68K 机器和小端的 Intel x86 机器)。

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

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

    关于pcap - pcap 中的 ntohs() 到底是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15875282/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com