【发布时间】:2013-03-23 04:41:44
【问题描述】:
如果机器 A 和机器 B 正在相互通信,但它们具有不同的主机字节顺序 然后在网络编程中,在发送端,是否应将 tcp/udp 数据字段转换为网络字节顺序 为什么? 谢谢!
【问题讨论】:
-
这个问题对于 Programmers.SE 来说可能是一个更好的选择,因为它是主观的。也就是说,我会给你一个主观的答案。
标签: networking tcp network-programming
如果机器 A 和机器 B 正在相互通信,但它们具有不同的主机字节顺序 然后在网络编程中,在发送端,是否应将 tcp/udp 数据字段转换为网络字节顺序 为什么? 谢谢!
【问题讨论】:
标签: networking tcp network-programming
除非您遵循预先存在的规范,否则始终使用network byte order(又名“big-endian”)是最安全的:
反对的传统论点是“全世界都是 VAX”(或者今天,x86),它是 little-endian,因此网络字节顺序会对数据征收性能税。也许这在 20 或 30 年前是一个有效的论点,但今天肯定不是。您的处理器转换数据所花费的时间是在网络中移动数据所花费的时间的极小部分。
【讨论】:
在很多情况下当然推荐。为了解释原因,我们来看一个例子:
如果上例中的发送主机发送数字 1024,则该数字在发送主机的机器上存储为 0x00000400。如果接收主机在接收这些字节时没有更改字节顺序并将 0x00000400 存储在内存中,这将被解释为与 1024 完全不同的数字。十进制数 1024 的小端表示将是 0x00040000。在 little-endian 机器上,0x00000400 是十进制数 262,144。
转换为网络字节顺序允许程序依赖数据的标准编码以避免混淆,就像我们在上面的示例中看到的那样。接收器端的函数可以从网络字节顺序转换为它使用的任何字节顺序,这些功能很容易获得并且易于使用。
【讨论】:
TCP 具有用于重新排序接收到的数据包的内置机制。 UDP 没有。我不确定“不同的主机字节顺序”是什么意思,但是如果接收到的数据包带有字节级错误,那么这就是重新传输此类数据包的第 2 层角色。
【讨论】: