大端模式小端模式以及网络字节序

主机字节序有两种:大端模式和小端模式

大端模式:高字节存放在低地址,低字节存放在高地址;

小端模式:低字节存放在低地址,高字节存放在高地址;

不同的CPU有不同的主机字节序类型。

Ø  典型的使用小端存储的CPU有:Intel x86和ARM 

Ø  典型的使用大端存储CPU有:Power PC、MIPS UNIX和HP-PAUNIX。

 

网络字节序类似于大端模式,注意是类似,为什么?

因为UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,类似于大端模式低地址存放高字节的存储方式,实际上也确实像,因为无论是收还是发,都是从低字节开始的,那么收到的第一个字节理应放到低地址。

 

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

相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。

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

举个例子:

X86和powerPC通过TCP/IP协议通信。

X86定义int a = 0x12345678。在调用write函数发送的时候先从低地址开始发(即&a),发送4个字节,即78->56->34->12的顺序。在PPC端接收的时候,很明显会先收到78,顺序是78->56->34->12,收到的78会被放到低地址中,依次类推,12会被放到最高地址里。但是因为PPC是大端模式,PPC会认为12是低字节,78是高字节,所以PPC解析出来的这个数是0x78563412。可以看出来,其实网络通信并没有改变这个数的存储方式,它只是遵循简单的先进先出规则,谁先进去谁就先出来。具体到TCP协议内部他认为先读进来的是高字节等等,其实都是无关紧要的,对应用层开发来说是透明的,根本不用关心它内部怎么认为。应用层开发者只需要明确一点:0x12345678这个数之所以在x86中是0x12345678,而在PPC中是0x78563412仅仅是因为x86和PPC对这个数的解读方式不一样(大小端模式不一样)导致的。

你可能感兴趣的:(大端模式小端模式以及网络字节序)