将IPv6存储为大端的原因是什么?

时间:2015-03-08 16:01:42

标签: c++ c sockets

我对如何在我的系统上存储IPv6地址表示怀疑。在我的系统上,我接受来自网络运行统计数据的数据包并将其发送出去。

我已经读过,无论CPU的字节顺序如何,存储它的常用方法都是big-endian(网络顺序)。虽然我的几位同事说他们也熟悉这种表示法,但是包括谷歌在内的任何人都无法对为什么的习惯传统做出具体解释。

我看到它的方式,数据将在系统中多次访问,因此将其更改为主机顺序(在我的情况下是它的小端)更简单,并在整个系统中使用它每次我想对它运行一些算术运算时都不必运行 ntoh 调用,如果我想在我要发送回的数据包上使用此地址,只需将其更改为网络顺序。网络

2 个答案:

答案 0 :(得分:1)

原因很简单:因为RFC-1700这样说。

在关于哪个字节序是单一的“正确的”之后的三十年争议之后,Danny Cohen发表了On Holy Wars and a Plea of Peace以试图揭示问题(这不仅仅是“字节顺序”)和毫无疑问,该行业会就一致的订单达成一致 最重要的是,只要您将消息作为“一条消息”发送,就没有订单这样的问题,但是一旦您在消息中传输子部分(字,字节或位),您需要决定一个订单。只要你坚持自己的决定,你选择哪一个并不重要。关于哪个顺序比另一个更正确的辩论与关于如何在“格列佛游记”中打破鸡蛋的辩论一样毫无生产力和愚蠢,科恩提到并将其称为“终结”。

1994年,RFC-1700的作者决定结束辩论,至少就知识产权套件而言,通过陈述:

  

Internet协议文档中的惯例是以十进制表示数字,以“big-endian”顺序表示图像数据。也就是说,字段从左到右描述,左边是最重要的八位字节,右边是最不重要的八位字节。

此后的每个RFC都遵循(明确或默默地)该约定,当然包括IPv6。

实际上,IP地址的字节顺序并不重要。它们可能是little-endian或big-endian中的单词或字节,或者是半字节,或者如果实现者认为实用,它们可以计算 Quatloos 。 对于99%的人来说,99%的时间都是零差异,因为你不应该看到或理解地址,也不需要记住“魔法价值”,也不需要(通常)需要修改地址。

通常获取一个不透明的内存块,这是一个来自“某处”(例如getaddrinforecvfrom)的IP地址和端口,并且您使用该blob作为 - 例如使用socketsendto 您通常不需要在地址或类似的地方执行“数学运算”。充其量,您可能希望比较两个地址是否相等。

是的,存在需要执行更复杂的地址的应用程序,但它们是迄今为止少数应用程序。

答案 1 :(得分:-1)

  

我看到它的方式,数据将在系统中被多次访问,所以将它更改为主机顺序(在我的情况下是它的小端)并不是更简单,并且在整个系统上使用它而不需要每次我想对它运行一些算术运算时运行ntoh调用,如果我想在我想要在网络上发回的数据包上使用这个地址,只需将它改为网络顺序?

嗯,你是对此感到好奇,但我相信你所谓的习惯传统,只是做一个应用程序时的设计选择。

我可能会改回你的问题:当你不需要在地址上做任何算术时,为什么只是为了让它保持在主机的顺序而陷入两次颠倒顺序的麻烦?

如果你的应用程序对IP地址进行了大量的数学计算,那么将它转换为little-endianness并在发回之前将其反转可能确实很明智。但如果你不做任何数学计算,那就保持它的大端。并且不要忘记x86不是唯一的CPU,你还有其他主机架构,如ARM或PPC,that were big-endian until they became bi-endian