大端、小端、与网络字节序 和 Tcp/IP 协议

一、在进行网络通信时是否需要进行字节序转换? 

     相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。
     原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。而相同平台进行通信时,如果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是没有意义的,造成资源的浪费。而不同平台进行通信时必须进行转换,不转换会造成错误的收发数据,字节序转换函数会根据当前平台的存储模式做出相应正确的转换,如果当前平台是大端,则直接返回不进行转换,如果当前平台是小端,会将接收到得网络字节序进行转换。

二、大端和小端

     "大端"和"小端"表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序; 或者说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),高位字节排放在内存的高地址端; 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端; 举个简单的例子,对于整型数据0x12345678,它在大端法和小端法的系统中,各自的存放方式如下图1所示:

三:字节转换

在计算机的通信过程中,(tcp/ip协议结构),数据被一步步封装,然后加入信息首部,当传送到目的段时,被一步步解封,然后获取数据。

即数据在传输过程中,一定有一个标准化过程。(从主机a到主机b进行通信)

基本格式如下所示:

a的固有数据结构—>标准化结构—>转换成b的固有数据结构

a的固有数据结构即是主机a的字节序

标准化结构即是网络字节序(在网络传输过程中的结构,一般而言指的是大端字节序)

b的固有数据结构即是主机b的字节序。


四:Tcp/IP 协议

Tcp/IP 协议主要分为四层结构:

应用层               对应于        嵌入式结构的应用层         

传输层               对应于        Linux内核层

网络层               对应于        Linux内核层

网络接口层           对应于        硬件层(网卡)

由上述可以看出:Linux内核实现了传输层和网络层的协议,网卡实现了网络接口层协议。且Linux内核会向应用程序空间提供了一个接口socket,所以网络编程也称之为socket编程。程序员可以通过socket接口,把应用程序的数据结构传递给Linux内核,再然后,Linux内核,会将数据结构传送给传输层和网络层。最后,通过网卡的驱动程序将数据通过网卡硬件传送到以太网中。

五:字节转换函数

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序






猜你喜欢

转载自blog.csdn.net/leikun153/article/details/79943702