Networking tcp/udp数据字段是否应转换为网络字节顺序

Networking tcp/udp数据字段是否应转换为网络字节顺序,networking,tcp,network-programming,Networking,Tcp,Network Programming,如果机器A和机器B正在相互通信,但它们的主机字节顺序不同 然后在网络编程中,在发送端,tcp/udp数据字段是否应转换为网络字节顺序 为什么? 谢谢 TCP具有用于对接收到的数据包重新排序的内置机制UDP没有。我不知道你所说的“不同主机字节顺序”是什么意思,但如果接收到的数据包存在字节级错误,那么这就是第二层角色重新传输此类数据包。除非你遵循预先存在的规范,否则始终使用它是最安全的(也称为“big-endian”): 您需要指定一些字节顺序;你不能只发送二进制数据,然后希望接收者能找到它 由于

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

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

除非你遵循预先存在的规范,否则始终使用它是最安全的(也称为“big-endian”):

  • 您需要指定一些字节顺序;你不能只发送二进制数据,然后希望接收者能找到它
  • 由于big-endian数据是互联网的一个重要组成部分,因此有很多工具可以与主机字节顺序进行转换。您必须编写自己的工具来在主机和little endian之间进行转换

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

在许多情况下,当然建议这样做。为了解释原因,让我们看一个例子:

  • 您有一个程序,它接受32位无符号int,将其放入数据包并发送到另一台主机
  • 另一台主机从数据包中取出数据,并将其存储为32位无符号整数
  • 发送主机为大端,接收主机为小端
  • 如果上述示例中的发送主机发送数字1024,则该数字将作为0x00000400存储在发送主机的机器上。如果接收主机在接收这些字节时不更改字节顺序,并在内存中存储0x00000400,则这将被解释为与1024完全不同的数字。十进制数1024的小端表示形式为0x00040000。在little endian机器上,0x00000400是十进制数262144


    转换为网络字节顺序允许程序依赖于数据的标准编码,以避免像上面示例中所示的混淆。接收器端将网络字节顺序转换为其使用的任何字节顺序的函数都很容易获得且使用简单

    没有回答这个问题。甚至看起来都不明白。@EJP:你明白这个问题吗?我不知道,但我尽力帮你。如果你已经知道答案,为什么不分享呢?你会混淆数据包的顺序和数据包中字节的顺序。如果数据包的接收顺序与发送顺序不同,TCP具有在接收方重新排序数据包的机制。OP讨论的是数据包中字节顺序的问题(参见little-endian vs.big-endian:)@Guardian您的回答和评论显示了一些谬误。理解一个问题而不知道答案是可能的;可以知道答案,而无需在此处张贴;回答一个不理解的问题也是不可能的。对于程序员来说,这个问题可能是一个更好的选择,因为它是主观的。这就是说,我会给你一个主观的答案。+1用于解释性能蕴涵论点和反论点