一、在进行网络通信时是否需要进行字节序转换?
二、大端和小端
"大端"和"小端"表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序; 或者说: 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类型从网络序转换到主机序