2013-04-08 56 views
10

我從以下答案之一讀取文檔:pcap中的ntohs()究竟做了什麼?

ntohs函數以TCP/IP網絡字節順序(AF_INET或AF_INET6地址系列)取16位數字,並在主機字節中返回一個16位數字訂購。

請用一個例子來解釋一下,比如什麼是網絡字節順序和什麼是主機字節順序。

回答

22

數1000是在二元的,1111101000.

如果這是在一個16位的二進制數,這是0000001111101000.

如果真實分成兩個8位字節,這是與兩個字節值00000011和11101000.

這兩個字節可以有兩種不同的順序:

  • 在「大端」字節順序,將含有高8位字節是第一和Th e字節,低8位是第二位,所以第一個字節是00000011,第二個字節是11101000.
  • 在「little-endian」字節順序中,包含8位的字節是第一位,而字節含有 8位是第二,所以第一個字節是11101000,第二個字節是00000011

在字節addressible機,硬件可以是「大端」或「小端「,取決於哪個字節存儲在內存中較低的地址。大多數個人電腦都是小端的;較大的計算機具有大端和小端的特點,其中一些大型計算機(例如IBM大型機和中型計算機以及SPARC服務器)是大端計算機。

大多數網絡都是位串行的,所以這些位一個接一個地傳輸。一個字節的位可能首先傳輸最重要或最不重要的位,但網絡硬件會隱藏處理器的細節。但是,它們將按照它們在主機的存儲器中的順序發送字節,因此,如果小端機器正在將數據傳輸到大端機器,則小端機器傳輸的數字看起來不同在接收端大機器上;那些差異是而不是被網絡硬件隱藏。

因此,爲了允許大端和小端機器通信,在每個協議層,或者:

  • 一個「標準」的字節順序需要選擇,並且使用機械的不同字節順序需要移動多字節數字的字節,以便它們不在機器的標準字節順序中,在傳輸數據之前,將它們移動,以使它們在機器的標準字節順序中爲,接收後數據;
  • 這兩臺機器需要協商會話的特定字節順序(例如,對於X11網絡窗口協議,從客戶機到服務器的初始消息指定要使用的字節順序);
  • 協議消息需要指定正在使用的字節順序(例如,使用DCE RPC完成;例如,這是用於「Microsoft RPC」的協議);接收機需要以某種方式正確地猜測字節順序(我不知道任何當前使用的協議在哪裏完成,但舊的BSD「談話」協議沒有使用上述任何技術,並且Sun386i的實施必須使用它來處理高端的摩托羅拉68K機器和小端英特爾x86機器)。

各種互聯網協議使用第一種策略,指定big-endian作爲字節順序;它在各種RFC中被稱爲「網絡字節順序」。 (微軟的SMB文件訪問協議也使用第一種策略,但是指定小端。)

所以「網絡字節順序」是大端。 「主機字節順序」是您正在使用的機器的字節順序;它可能是big-endian,在這種情況下,ntohs()只是返回您給它的值,或者它可能是小端,在這種情況下,ntohs()會交換您給它的值的兩個字節並返回該值。例如,在一個big-endian機器上,ntohs(1000)將返回1000,並且在小端機器上,ntohs(1000)將交換高位和低位字節,給出二進制數1110100000000011或十進制數59395。