主机字节序 网络字节序

主机字节序又叫CPU字节序,分为大端和小端
大端字节序,就是高字节序的存在低位地址,低字节序存在高位地址
小端字节序,就是高字节序存在高位地址,低字节序存在低位地址
在这里插入图片描述
例子:
0x12是高位字节,大端会放在低地址上如0x00
可以看出数据的高位是越前面越高,内存地址的高位是越后面越高。
数据0x12345678 高字节->低字节
内存地址 0x00 0x01 0x02 0x03 低地址->高地址
在这里插入图片描述

网络字节序采用大端排序方式而主机一般采用小端
原因:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。(高字节放到低地址比较符合逻辑顺序)
面试的话可以这么说,tcp发送是按照字节流发送,因此一般取数据都是从高字节位上开始取,而存储一般指针都是在低地址上,因此采用大端比较符合逻辑。

字节序的转换可以用移位操作来实现
32位的机器,大小端互换

长整型
(((unsigned long int)(x))&0xff000000>>24)|(((unsigned long int)(x)&0x00ff0000 >>8)|(((unsigned long int)(x)&0x0000ff00<<8)|(((unsigned long int)(x)&0x000000ff<<24)

短整型
(((unsigned short int)(x)&0xff00>>8)|((((unsigned short int)(x)&0x00ff<<8)

TCP/IP协议数据发送过程
应用层 对应于 嵌入式结构的应用层

传输层 对应于 Linux内核层

网络层 对应于 Linux内核层

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

linux内核实现了网络层和传输层的协议,网卡实现了网络接口层的协议。linux内核向应用层提供了一个接口socket,程序员可以通过接口,把应用程序的数据结构传递给linux内核,然后linux内核将数据结构发送给传输层和网络层进行封装,最后发送给网络接口层通过网卡发送到以太网中。

为什么程序要判断大端小端?
网络编程,各个平台的CPU实现不一样,大部分x86都是小端字节序,而ARM可以通过设置大端小端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章