主機字節序 網絡字節序

主機字節序又叫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可以通過設置大端小端。

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