网络字节顺序和字节序问题

3

我在互联网上读到,网络标准字节序是大端序,也称为网络字节序。在将数据传输到网络之前,数据首先会转换为网络字节序(大端序)。

  1. 但请问谁来负责这个转换?
  2. 对于代码开发人员来说,是否真的需要关注这种字节序?如果是,您能否举出需要注意的例子(在C、C++中)。

3
无论何时进行数据序列化(例如通过某种数据流发送内存中的整数),您都需要考虑到这一点。您必须确保另一端可以检索到您发送的相同值。 - M.M
尽管大端序被称为网络字节序(许多网络协议出于充分的原因使用它),但您始终必须关注手头的特定协议,这可能是不同的。 - Deduplicator
3个回答

4
第一个需要考虑网络与本地字节顺序的地方是创建套接字并指定IP地址和端口号。这些必须按正确的顺序进行,否则您将无法与正确的计算机通信,或者如果您映射了IP地址但没有映射端口号,则会与正确的计算机上的不正确端口通信。
程序员有责任按正确的顺序获取地址。有一些函数,例如htonl(),可以将主机(h)转换为网络(n)顺序;l表示“long”,即“4个字节”;s表示“short”,即“2个字节”(这些名称来自64位系统之前的时代)。
另一个需要注意的情况是,如果您正在两台计算机之间传输二进制数据,可以通过正确设置套接字的网络连接或文件进行传输。对于单字节代码集(SBCS)或UTF-8,您不会遇到文本数据问题。对于多字节代码集(MBCS)或UTF-16LE与UTF-16BE或UTF-32,您需要关注字符内的字节顺序,但字符将一个接一个地出现。如果您将32位整数作为32位数据发送,则接收端需要知道前4个字节是32位数量的MSB(最高有效字节 - 对于大端)还是LSB(最低有效字节 - 对于小端)。类似地,对于16位整数或64位整数也是如此。对于浮点数,您可能会遇到额外的问题,即不同的计算机可以独立于字节顺序问题使用不同的浮点格式。由于IEEE 744的存在,这比以前更少见了。
请注意,IBM主机使用EBCDIC字符集而不是ASCII或ISO 8859-x字符集(至少默认情况下),并且浮点格式不是IEEE 744(比该标准早十年或更多)。因此,在与主机通信时,这些问题至关重要。两端的程序必须同意每一端如何理解另一端。一些协议定义了字节顺序(例如网络字节顺序);其他协议定义了“发送者正确”、“接收者正确”、“客户端正确”或“服务器正确”,将转换工作负载放在系统的不同部分。
文本协议(特别是使用SBCS的协议)的一个优点是它们避免了字节序问题——尽管需要将文本转换为值和反向转换,但计算与甚至吉比特网络速度相比都很便宜。

1
在C和C++中,您需要在低级网络代码中担心字节序问题。通常,序列化和反序列化代码将调用一个函数或宏来调整字节序 - 在小端机器上反转字节序,在大端机器上不进行任何操作 - 当使用多字节数据类型时。

0

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