亚洲AV无码成人网站久久精品大最新的|A区色逼逼不卡91AV一区二区|免费涩涩夜夜骑一区|亚洲中日韩成人在钱|男女视频在线观看无人一区二区|欧美精品成人在线观看一区二区|国产青青草原一区二区三区精品在线|久久免费观看伊人网|亚洲一区二区在线导航|日韩字幕一区二区

學習啦 > 學習電腦 > 網絡知識 > 無線網絡 > 網絡字節(jié)序具體知識介紹

網絡字節(jié)序具體知識介紹

時間: 曉斌668 分享

網絡字節(jié)序具體知識介紹

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

  首先學習啦小編要給大家科普下什么是網絡字節(jié)序?

  網絡字節(jié)序轉化為主機字節(jié)序時,一定要注意是否需要轉換。網絡字節(jié)序是確定的。網絡字節(jié)順序是TCP/IP中規(guī)定好的一種數(shù)據(jù)表示格式,它與具體的CPU類型、操作系統(tǒng)等無關,從而可以保證數(shù)據(jù)在不同主機之間傳輸時能夠被正確解釋。網絡字節(jié)順序采用big endian排序方式。

  轉換函數(shù)

  為了進行轉換 bsd socket提供了轉換的函數(shù) 有下面四個

  htons把unsigned short類型從主機序轉換到網絡序

  htonl 把unsigned long類型從主機序轉換到網絡序

  ntohs 把unsigned short類型從網絡序轉換到主機序

  ntohl 把unsigned long類型從網絡序轉換到主機序

  在使用little endian的系統(tǒng)中 這些函數(shù)會把字節(jié)序進行轉換

  在使用big endian類型的系統(tǒng)中 這些函數(shù)會定義成空宏

  同樣 在網絡程序開發(fā)時 或是跨平臺開發(fā)時 也應該注意保證只用一種字節(jié)序 不然兩方的解釋不一樣就會產生bug.

  注意事項

  1、網絡與主機字節(jié)轉換函數(shù):htons ntohs htonl ntohl (s 就是short l是long h是host n是network)

  2、不同的CPU上運行不同的操作系統(tǒng),字節(jié)序也是不同的,參見下表。

  處理器 操作系統(tǒng) 字節(jié)排序

  Alpha 全部 Little endian

  HP-PA NT Little endian

  HP-PA UNIX Big endian

  Intelx86 全部 Little endian

  網絡字節(jié)序

  網絡上傳輸?shù)臄?shù)據(jù)都是字節(jié)流,對于一個多字節(jié)數(shù)值,在進行網絡傳輸?shù)臅r候,先傳遞哪個字節(jié)?也就是說,當接收端收到第一個字節(jié)的時候,它將這個字節(jié)作為高位字節(jié)還是低位字節(jié)處理,是一個比較有意義的問題;

  UDP/TCP/IP協(xié)議規(guī)定:把接收到的第一個字節(jié)當作高位字節(jié)看待,這就要求發(fā)送端發(fā)送的第一個字節(jié)是高位字節(jié);而在發(fā)送端發(fā)送數(shù)據(jù)時,發(fā)送的第一個字節(jié)是該數(shù)值在內存中的起始地址處對應的那個字節(jié),也就是說,該數(shù)值在內存中的起始地址處對應的那個字節(jié)就是要發(fā)送的第一個高位字節(jié)(即:高位字節(jié)存放在低地址處);

  由此可見,多字節(jié)數(shù)值在發(fā)送之前,在內存中因該是以大端法存放的; 所以說,網絡字節(jié)序是大端字節(jié)序; 比如,我們經過網絡發(fā)送整型數(shù)值0x12345678時,在80X86平臺中,它是以小端發(fā)存放的,在發(fā)送之前需要使用系統(tǒng)提供的字節(jié)序轉換函數(shù)htonl()將其轉換成大端法存放的數(shù)值;如下圖2所示:

  那么在進行網絡通信時是否需要進行字節(jié)序轉換?

  相同字節(jié)序的平臺在進行網絡通信時可以不進行字節(jié)序轉換,但是跨平臺進行網絡數(shù)據(jù)通信時必須進行字節(jié)序轉換。

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

374603