最近在搞車聯網項目,后台服務器要與車載終端進行通訊,進行遠程車輛控制(開窗,開空調,啟動發動機、查看車況)、車況數據的實時上報等。我們決定使用長連接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對大小端的處理