通过TCP / IP进行网络数据传输的字节顺序

时间:2013-02-12 23:00:17

标签: networking language-agnostic tcp ip endianness

这是我很久以前一直试图解决的问题。这并没有达到特定的语言,尽管对于那些拥有指定字节序的VM的人来说并不是真的有益。我知道,就像使用套接字使用TCP / IP发送数据的99.9999%的人一样,该协议指定了传输元素的字节顺序,如目标地址,端口等。我不知道的是如果它要求有效负载采用特定格式以防止不兼容

例如,假设我开发的协议不是presentation layer,而且由于小端设备现在拥有的优势,我决定将其设为小端(例如,玩家等以小端顺序传输)。例如,用于游戏引擎的网络模块,其中延迟很重要并且字节转换将花费相当多的时间。当然,协议相关的地址,端口和所有数据都将以大端指定为强制性,我正在谈论有效载荷,而且只是那个。

在大端机器上,该协议是否可以开箱即用(当然,一旦收到传输,就会根据需要翻译内容)?或者,由于数据的顺序不同,IP协议的校验和或类似的东西会被计算错误,如果不使用raw_sockets,程序员也无法控制它们吗?

由于整个解释可能会产生误导,请随时要求澄清。

非常感谢。

2 个答案:

答案 0 :(得分:5)

  

我不知道的是,它是否要求有效载荷采用特定格式以防止不兼容。

它没有,也没有办法说明。对TCP来说,它只是一个字节流。由应用程序协议来决定字节序,并且由每个端的实现者来正确地实现它。有一个约定来使用big-endian,但是没有强制性。

答案 1 :(得分:1)

应用层协议决定了它们自己的字节顺序。但是,按照惯例,应在network-byte order (big endian)中发送多字节整数值,以实现跨平台的一致性,例如使用平台提供的hton...()(主机到网络)和ntoh...()(代码中的网络到主机功能实现。在little-endian系统上,他们将进行必要的字节交换。在大端系统上,它们是无操作系统。这些函数提供了一个减法层,因此代码不必担心这一点。