網路位元組序和主機位元組序

2021-05-23 08:58:34 字數 1891 閱讀 3322

1.

網路傳資料的時候是乙個位元組乙個位元組的傳.

字串裡的每乙個字元只用乙個位元組

,前面的就先傳

, 接收的後再解釋的時候也是按順序來

, 所以字串沒有網路位元組序的分別.

2.網路位元組序預設是大端,也就是說任何機器如果收到乙個

int型的

4個位元組,那麼這個機器就會認為第乙個位元組是最高位,最後乙個位元組是最低位。

我們看看下面這個例項:

比如我們要傳個

int資料,假設資料為 

/*假設網路連線已經建立好,網路描述符為

fd*/

伺服器:

...int send = 1;

write(fd, &send, sizeof(send));

我們看一下資料的傳遞過程,假設這一端主機是小端位元組序,那麼這個過程應該是:

01 00

00 00

注:從左到右位址增大,這個是在使用者空間的擺放形式

write後,資料被拷貝到核心驅動空間,形式還是一樣的。

01 00

00 00

注:從左到右位址增大

然後就是網絡卡驅動把這個位元組發出去了,形式還是一樣。但是它是這樣來表現的,01

位元組先發,最後是

00那個位元組,這樣我們的伺服器端的資料就分析完畢了。

客戶端:(大端主機位元組序)

...int get = 0;

read(fd, &get, sizeof(get));

一開始:

00 00

00 00

注:從左到右位址增大,這個是在使用者空間的擺放形式

read的過程:

網絡卡驅動收到資料

01 00

00 00

,他知道是網路傳過來的資料都是大端資料,所以他就解釋為接受到了資料:0x01000000

因為主機序也是大端,所以不轉換,直接把核心空間的資料拷貝到使用者空間,就為:get=0x01000000.

結論:資料傳輸失敗。

那麼錯誤原因在**呢?理由就是傳送資料端應該先轉換為網路位元組序;如果伺服器端這樣寫:

伺服器:

...int send =  htonl(1);

write(fd, &send, sizeof(send));

我們看一下資料的傳遞過程,假設這一端主機是小端位元組序,那麼這個過程send

的內容應該是:

00 00

00 01

注:從左到右位址增大,這個是在使用者空間的擺放形式

write後,資料被拷貝到核心驅動空間,形式還是一樣的。

注:從左到右位址增大

然後就是網絡卡驅動把這個位元組發出去了,形式還是一樣。但是它是這樣來表現的,00

位元組先發,最後是

01那個位元組,這樣我們的伺服器端的資料就分析完畢了。

那麼在客戶端收到的資料分析就為:

客戶端:(大端主機位元組序)

...int get = 0;

read(fd, &get, sizeof(get));

一開始:

00 00

00 01

注:從左到右位址增大,這個是在使用者空間的擺放形式

read的過程:

網絡卡驅動收到資料

00 00

00 00

,他知道是網路傳過來的資料都是大端資料,所以他就解釋為接受到了資料:0x00000001

(其實在這裡就決定了你的資料接受的是否正確,這裡成功解釋了,後面系統才可以正確的進行位元組序轉換)

因為主機序也是大端,所以不轉換,直接把核心空間的資料拷貝到使用者空間,就為:get=0x00000001.

結論:資料成功接受。所以傳輸資料的時候最好進行一下主機和網路位元組序的轉換。

網路位元組序和主機位元組序

不同的 cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種1 little endian2 big endian le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序...

主機位元組序和網路位元組序

1.主機位元組序和網路位元組序1 以下是從ip.h和tcp.h取的,但bsd和linux用的名稱有些不一樣主要是tcp不一樣 struct ip struct tcphdr 我所理解的big序和little序的區別 1 存整數的時候 uint32 t a 1574 1574 0x626 big序 0...

網路位元組序和主機位元組序

網路程式設計中經常用到的網路位元組序和主機位元組序的轉換,比如ip 字串 暫時只討論ipv4 是以三個點號和四個數字組成,並以點號相分隔的字串。比如說,ip是225.224.223.222,那麼整數是不是就是 0xfffefdfc呢?答案是不一定。雖然此ip位址在記憶體中的儲存順序從左至右依次是,f...