網路位元組序具體知識介紹

  最近有網友想了解下網路位元組序的知識,所以小編就整理了相關資料分享給大家,具體內容如下.希望大家參考參考!!!

  首先小編要給大家科普下什麼是網路位元組序?

  網路位元組序轉化為主機位元組序時,一定要注意是否需要轉換。網路位元組序是確定的。網路位元組順序是TCP/IP中規定好的一種資料表示格式,它與具體的CPU型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。

  轉換函式

  為了進行轉換 bsd socket提供了轉換的函式 有下面四個

  htons把unsigned short型別從主機序轉換到網路序

  htonl 把unsigned long型別從主機序轉換到網路序

  ntohs 把unsigned short型別從網路序轉換到主機序

  ntohl 把unsigned long型別從網路序轉換到主機序

  在使用little endian的系統中 這些函式會把位元組序進行轉換

  在使用big endian型別的系統中 這些函式會定義成空巨集

  同樣 在網路程式開發時 或是跨平臺開發時 也應該注意保證只用一種位元組序 不然兩方的解釋不一樣就會產生bug.

  注意事項

  1、網路與主機位元組轉換函式:htons ntohs htonl ntohl ***s 就是short l是long h是host n是network***

  2、不同的CPU上執行不同的作業系統,位元組序也是不同的,參見下表。

  處理器 作業系統 位元組排序

  Alpha 全部 Little endian

  HP-PA NT Little endian

  HP-PA UNIX Big endian

  Intelx86 全部 Little endian

  網路位元組序

  網路上傳輸的資料都是位元組流,對於一個多位元組數值,在進行網路傳輸的時候,先傳遞哪個位元組?也就是說,當接收端收到第一個位元組的時候,它將這個位元組作為高位位元組還是低位位元組處理,是一個比較有意義的問題;

  UDP/TCP/IP協議規定:把接收到的第一個位元組當作高位位元組看待,這就要求傳送端傳送的第一個位元組是高位位元組;而在傳送端傳送資料時,傳送的第一個位元組是該數值在記憶體中的起始地址處對應的那個位元組,也就是說,該數值在記憶體中的起始地址處對應的那個位元組就是要傳送的第一個高位位元組***即:高位位元組存放在低地址處***;

  由此可見,多位元組數值在傳送之前,在記憶體中因該是以大端法存放的; 所以說,網路位元組序是大端位元組序; 比如,我們經過網路傳送整型數值0x12345678時,在80X86平臺中,它是以小端發存放的,在傳送之前需要使用系統提供的位元組序轉換函式htonl******將其轉換成大端法存放的數值;如下圖2所示:

  那麼在進行網路通訊時是否需要進行位元組序轉換?

  相同位元組序的平臺在進行網路通訊時可以不進行位元組序轉換,但是跨平臺進行網路資料通訊時必須進行位元組序轉換。

  原因如下:網路協議規定接收到得第一個位元組是高位元組,存放到低地址,所以傳送時會首先去低地址取資料的高位元組。小端模式的多位元組資料在存放時,低地址存放的是低位元組,而被髮送方網路協議函式傳送時會首先去低地址取資料***想要取高位元組,真正取得是低位元組***,接收方網路協議函式接收時會將接收到的第一個位元組存放到低地址***想要接收高位元組,真正接收的是低位元組***,所以最後雙方都正確的收發了資料。而相同平臺進行通訊時,如果雙方都進行轉換最後雖然能夠正確收發資料,但是所做的轉換是沒有意義的,造成資源的浪費。而不同平臺進行通訊時必須進行轉換,不轉換會造成錯誤的收發資料,位元組序轉換函式會根據當前平臺的儲存模式做出相應正確的轉換,如果當前平臺是大端,則直接返回不進行轉換,如果當前平臺是小端,會將接收到得網路位元組序進行轉換。