发送数字到网络中时是否必须要反转字节顺序?

3

在Web上的大多数示例中,作者通常会在将数字从主机字节顺序转换为网络字节顺序之前更改字节顺序。然后在接收端,作者通常会将顺序恢复回来从网络字节顺序到主机字节顺序。

Q1:考虑到两个系统的架构未知,如果作者在反转字节顺序之前简单地检查机器的字节顺序,那么效率会更高吗?

Q2:即使数字被传递给和接收自相同的机器架构,是否真的有必要反转它们的字节顺序?

7个回答

8

一般情况下,你无法知道远程系统的架构。如果每个人都使用特定的字节顺序 - 网络字节顺序,那么就不会有混淆。所有反转的成本都是一些代价,但重新设计所有网络设备的代价将远远超过这些。

A1:假设我们要尝试建立远程系统的字节顺序。我们需要在系统之间建立通信,并确定远程系统的字节顺序。在不知道字节顺序的情况下,我们如何进行通信?

A2:如果您知道两个系统具有相同的架构,则不需要在每个端口反转字节。但是,总体而言,你并不知道。如果您确实设计了这样的系统,则已经做出了一项网络架构决策,该决策排除了将来不同的CPU架构。考虑苹果从86k到PPC再到x86的转换。


关于A1:在建立共同字节顺序之前,您可以始终在初始通信期间反转字节顺序,然后切换到共同的字节顺序。当然,缺点是这引入了相当多的复杂性,而收益却很少。 - Ethan
这很好用,直到有人意外使用了一个端对称的位模式来建立字节顺序。然后就会想知道为什么他们的通信不可靠。 - ObscureRobot

3
A1:不,这正是关键。您不想担心另一端计算机的字节顺序。在大多数情况下(除了严格控制的环境...绝对不是互联网),您不会知道。如果每个人都使用相同的字节顺序,您就不必担心它。
A2:不可以。除非在未来发现不是这种情况,并且所有内容都已经破裂,否则有人将想知道为什么没有遵循众所周知的最佳实践。通常这将是签发您薪水的人。

2

小端或大端是与平台相关的,但对于网络通信而言,大端序是常见的,请参见维基百科


1

问题1:是的,如果发送方和接收方测试它们的字节序(更准确地说,彼此通信并测试它们是否相同),那么效率会更高。

问题2:不,不总是需要使用“标准”字节顺序。但对于希望可移植互操作的代码来说,这样做更简单。

然而,编码的易用性可能比通信性能更重要 - 除非你有大量数据,否则网络成本比交换字节高得多。

阅读关于序列化和例如这个问题以及我的答案


没有什么比测试更重要了,这是一个非常明显的事实。我想你必须得了解自己的电脑。 - Jaseem
字节序是静态已知的。在Linux上,请查看包含文件<endian.h> - Basile Starynkevitch
真的吗?如果我给你一个IP地址、一个协议和一个端口,本地字节序是什么?你可能知道你本地的字节序,但不知道远程的——除非你同意所有网络通信都应该使用网络字节序。 - ObscureRobot
我的意思是每个机器都知道自己的字节序,因此它可以将其通知给另一端。(如果我没记错的话,X11协议就是这样做的) - Basile Starynkevitch

1

这不是盲目反转的问题。 所有网络都使用大端字节序。我的电脑[linux + intel i386]使用小端字节序。所以当我为我的电脑编写代码时,我总是需要反转顺序。我认为Mac也使用大端字节序。一些移动电话平台也是如此。


1
你的 Linux 机器是小端字节序。如果是旧的 68k Mac 或 PPC Mac,则 Mac 是大端字节序,但如果是 x86,则是小端字节序。 - ObscureRobot

1

网络字节顺序是大端序。如果发送或接收架构也是大端序,您可以跳过该端上的步骤,因为翻译相当于 nop。然而,为什么要麻烦呢?翻译一切更简单、更安全,并且几乎没有性能影响。


1

如果您使用 ntohl()、htonl() 等函数/宏,就不需要测试字节序。在大端机器上,它们已经是无操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接