最近在搞车联网项目,后台服务器要与车载终端进行通讯,进行远程车辆控制(开窗,开空调,启动发动机、查看车况)、车况数据的实时上报等。我们决定使用长连接TCP/IP进行通讯,最后服务端决定使用Netty实现服务器与车载终端进行交互的网关。制定协议成为我们项目开始的起点,在这里涉及了网络通讯的字节顺序也就是我们要说的大小端模式。
计算机为什么要搞大小端模式
在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8 bit。但是在C 语言中除了 8 bit 的char之外,还有 16 bit 的 short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如果将多个字节安排的问题。大端存储模式和小端存储模式也就应运而生
字节顺序很少由软件设计者决定:它通常取决于硬件设计。字节顺序的两种类型有时被称为字节性别,在当今被广泛使用。两种方式都具有自身的优势。Intel处理器使用小端字节顺序涉及。摩托罗拉的CPU系列、SUN 的 sparc 工作站,以及 PowerPc的CPU架构都采用大端字节顺序。字节顺序的问题甚至胜过CPU硬件设计。当Internet 的设计者为互联各种类型的计算机而设计网际协议(IP)时,他们意识到了在具有不同内部字节顺序的系统间传递数值数据的问题。因此,IP协议规定了使用大端的网络字节顺序概念。所有在IP分组报文的协议部分中使用的多字节数值必须先在本地主机字节顺序和通用的网络字节顺序之间进行转换。
两个计算机系统之间通信,通过网络发送字节数据,双方必须为字节数据的顺序达成一致的协议,否则将无法对数据进行正确的解析,不同的计算机体系结构有不同的字节序,字节序可分为大端字节序(big-endian)和小端字节序(little-endian)。
什么是大小端模式
大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 也就是我们人类读数字的顺序,我们从左往右读,byte的摆放也就从高字节到底字,从左往右进行摆放。
小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
Netty对大小端模式的处理
Netty中的解码器 LengthFieldBasedFrameDecoder
Netty 中ByteBuf对大小端的处理