如果机器 A 和机器 B 正在相互通信,但是它们具有不同的主机字节顺序,那么在网络编程中,在发送端,应该将 tcp/udp 数据字段转换为网络字节顺序,为什么?谢谢!
3 回答
除非您遵循预先存在的规范,否则始终使用网络字节顺序(又名“big-endian”)是最安全的:
- 您需要指定一些字节顺序;您不能只发送二进制数据并希望接收者能够弄清楚。
- 因为大端数据是 Internet 的标准,所以有很多工具可以与主机字节顺序进行转换。您必须编写自己的工具来在主机和小端之间进行转换。
反对的传统论点是“全世界都是 VAX”(或者今天,x86),它是 little-endian,因此网络字节顺序对数据施加了性能税。也许这在 20 或 30 年前是一个有效的论点,但今天肯定不是。处理器转换数据所花费的时间是在网络上移动数据所花费时间的极小部分。
在许多情况下肯定会推荐它。为了解释原因,让我们看一个例子:
- 您有一个程序,它采用 32 位无符号整数,将其放入数据包中并发送到另一台主机
- 另一台主机从数据包中提取数据并将其存储为 32 位无符号整数。
- 发送主机为大端,接收主机为小端。
如果上例中的发送主机发送号码 1024,则该号码将作为 0x00000400 存储在发送主机的机器上。如果接收主机在接收这些字节时没有更改字节顺序并将 0x00000400 存储在内存中,则这将被解释为与 1024 完全不同的数字。十进制数 1024 的小端表示将是 0x00040000。在 little-endian 机器上,0x00000400 是十进制数 262,144。
转换为网络字节顺序允许程序依赖数据的标准编码以避免混淆,就像我们在上面的示例中看到的那样。接收端从网络字节顺序转换为它使用的任何字节顺序的功能很容易获得且易于使用。
TCP具有用于重新排序接收到的数据包的内置机制。UDP没有。我不确定“不同的主机字节顺序”是什么意思,但是如果接收到的数据包带有字节级错误,那么这就是重新传输此类数据包的第 2 层角色。