萬盛學電腦網

 萬盛學電腦網 >> 無線網絡知識 >> 網絡字節序具體知識介紹

網絡字節序具體知識介紹

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

  首先學習啦小編要給大家科普下什麼是網絡字節序?

  網絡字節序轉化為主機字節序時,一定要注意是否需要轉換。網絡字節序是確定的。網絡字節順序是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所示:

  那麼在進行網絡通信時是否需要進行字節序轉換?

  相同字節序的平台在進行網絡通信時可以不進行字節序轉換,但是跨平台進行網絡數據通信時必須進行字節序轉換。

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

copyright © 萬盛學電腦網 all rights reserved