【问题标题】:should tcp/udp data field be converted to network byte ordertcp/udp 数据字段是否应该转换为网络字节顺序
【发布时间】:2013-03-23 04:41:44
【问题描述】:

如果机器 A 和机器 B 正在相互通信,但它们具有不同的主机字节顺序 然后在网络编程中,在发送端,是否应将 tcp/udp 数据字段转换为网络字节顺序 为什么? 谢谢!

【问题讨论】:

  • 这个问题对于 Programmers.SE 来说可能是一个更好的选择,因为它是主观的。也就是说,我会给你一个主观的答案。

标签: networking tcp network-programming


【解决方案1】:

除非您遵循预先存在的规范,否则始终使用network byte order(又名“big-endian”)是最安全的:

  • 您需要指定一些字节顺序;你不能只发送二进制数据,然后希望接收方能弄清楚。
  • 因为大端数据是互联网的standard,所以有很多工具可以转换成/从主机字节顺序。您必须编写自己的工具来在主机和小端之间进行转换。

反对的传统论点是“全世界都是 VAX”(或者今天,x86),它是 little-endian,因此网络字节顺序会对数据征收性能税。也许这在 20 或 30 年前是一个有效的论点,但今天肯定不是。您的处理器转换数据所花费的时间是在网络中移动数据所花费的时间的极小部分。

【讨论】:

  • +1 用于解释性能暗示论点和反论点
【解决方案2】:

在很多情况下当然推荐。为了解释原因,我们来看一个例子:

  1. 您的程序采用 32 位无符号整数,将其放入数据包并发送到另一台主机
  2. 另一台主机从数据包中提取数据并将其存储为 32 位无符号整数。
  3. 发送主机为大端,接收主机为小端。

如果上例中的发送主机发送数字 1024,则该数字在发送主机的机器上存储为 0x00000400。如果接收主机在接收这些字节时没有更改字节顺序并将 0x00000400 存储在内存中,这将被解释为与 1024 完全不同的数字。十进制数 1024 的小端表示将是 0x00040000。在 little-endian 机器上,0x00000400 是十进制数 262,144。

转换为网络字节顺序允许程序依赖数据的标准编码以避免混淆,就像我们在上面的示例中看到的那样。接收器端的函数可以从网络字节顺序转换为它使用的任何字节顺序,这些功能很容易获得并且易于使用。

【讨论】:

    【解决方案3】:

    TCP 具有用于重新排序接收到的数据包的内置机制。 UDP 没有。我不确定“不同的主机字节顺序”是什么意思,但是如果接收到的数据包带有字节级错误,那么这就是重新传输此类数据包的第 2 层角色。

    【讨论】:

    • 不回答问题。甚至似乎都没有理解它。
    • @EJP:你明白这个问题吗?我没有,但我尽量提供帮助。如果你已经知道答案,为什么不分享呢?
    • 您对数据包的顺序和数据包中的字节顺序感到困惑。如果数据包的接收顺序与发送顺序不同,TCP 具有在接收方重新排序数据包的机制。 OP 正在讨论数据包中的字节顺序问题(参见 little-endian 与 big-endian:en.wikipedia.org/wiki/Endianness
    • @Guardian 您的回答和评论存在几个谬误。有可能在不知道答案的情况下理解一个问题;无需在此处发布即可知道答案;不理解问题也无法回答。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多