网络字节序

来源:互联网 发布:如何查看淘宝月销售额 编辑:程序博客网 时间:2024/06/08 07:45

1.为什么需要网络字节序?

先看一下不存在网络字节序时两台主机之间是如何进行网络通信的?

在不存在网络字节序的情况下,当网络中的主机A和主机B需要通信时,主机A会向主机B发送数据包。主机B收到数据包后会将其拷贝到对应的内存区域,此时主机B内存中的数据包和从主机A发出来的数据包完全相同。

当主机B收到数据包时需要根据相关协议标准对数据包进行解析,由于协议中有具体的字段值,协议中的字段可能是单字节也可能是多字节。

  当协议字段为单字节时
  A主机和B主机对于单字节协议字段的表示方式完全相同,所以能够正确的解析单字节字段。

  当协议字段为多字节时
  B主机能否正确的解析取决于A主机和B主机的系统存储模式。A主机和B主机如果系统存储模式相同时,B主机能够正确的解析多字节字段。如果A主机和B主机的系统存储模式不相同,那么B主机将不能正确的解析多字节字段。
  比如,A主机为大端模式、B主机为小端模式时,由于对于多字节数据而言,小端模式的低地址内存存储的为多字节数据的低字节,大端模式的低地址内存存储的为多字节数据的高字节。当主机B从内存中解析多字节数据时就会认为低地址内存处存储的为多字节数据的高位,而实际上数据包的低地址存储的为这个多字节数据的低字节部分,从而错误的解析多字节数据。

2 什么是网络字节序?

为了解决不同系统存储模式的主机之间能够正确通信的问题,就出现了网络字节序的概念。网络字节序规定了在网络中传输的多字节数据以大端模式存储。不管任何主机发送数据包时都需要将其中的多字节数据由本机字节序转换为网络字节,当接收端收到数据包需要解析其中的多字节数据时需要网络字节序转换为本机字节序。在由本机转换为网络字节序或者由网络字节序转换为本机字节序时需要调用具体的API,在API的内部会去判断本机字节序和网络字节序是否相同,如果相同则不进行转换,如果不同则进行转换。

注意:

网络字节序是针对网络传输中的多字节数据而言的,如果针对单字节的数据流则不存在网络字节序。当接收端收到数据包时直接解析单字节数据即可,不需要考虑字节序的问题。比如,数据包的MAC地址就是单字节数据,进行解析时只需要按次序取出即可,不需要转换字节序。

网络字节序为大端存储模式是针对单个多字节数据而言,而不是针对整个数据包。在构造数据包的时候,就需要分别将单个多字节数据转换为网络字节序后写入到相应的字段部分。在解析多字节数据时,需要针对单个多字节数据进行字节序转换后再进行解析。比如,数据包中的IP地址,进行解析时就需要进行字节序的转换。

原创粉丝点击