我從以下答案之一讀取文檔:pcap中的ntohs()究竟做了什麼?
ntohs函數以TCP/IP網絡字節順序(AF_INET或AF_INET6地址系列)取16位數字,並在主機字節中返回一個16位數字訂購。
請用一個例子來解釋一下,比如什麼是網絡字節順序和什麼是主機字節順序。
我從以下答案之一讀取文檔:pcap中的ntohs()究竟做了什麼?
ntohs函數以TCP/IP網絡字節順序(AF_INET或AF_INET6地址系列)取16位數字,並在主機字節中返回一個16位數字訂購。
請用一個例子來解釋一下,比如什麼是網絡字節順序和什麼是主機字節順序。
數1000是在二元的,1111101000.
如果這是在一個16位的二進制數,這是0000001111101000.
如果真實分成兩個8位字節,這是與兩個字節值00000011和11101000.
這兩個字節可以有兩種不同的順序:
在字節addressible機,硬件可以是「大端」或「小端「,取決於哪個字節存儲在內存中較低的地址。大多數個人電腦都是小端的;較大的計算機具有大端和小端的特點,其中一些大型計算機(例如IBM大型機和中型計算機以及SPARC服務器)是大端計算機。
大多數網絡都是位串行的,所以這些位一個接一個地傳輸。一個字節的位可能首先傳輸最重要或最不重要的位,但網絡硬件會隱藏處理器的細節。但是,它們將按照它們在主機的存儲器中的順序發送字節,因此,如果小端機器正在將數據傳輸到大端機器,則小端機器傳輸的數字看起來不同在接收端大機器上;那些差異是而不是被網絡硬件隱藏。
因此,爲了允許大端和小端機器通信,在每個協議層,或者:
各種互聯網協議使用第一種策略,指定big-endian作爲字節順序;它在各種RFC中被稱爲「網絡字節順序」。 (微軟的SMB文件訪問協議也使用第一種策略,但是指定小端。)
所以「網絡字節順序」是大端。 「主機字節順序」是您正在使用的機器的字節順序;它可能是big-endian,在這種情況下,ntohs()
只是返回您給它的值,或者它可能是小端,在這種情況下,ntohs()
會交換您給它的值的兩個字節並返回該值。例如,在一個big-endian機器上,ntohs(1000)
將返回1000,並且在小端機器上,ntohs(1000)
將交換高位和低位字節,給出二進制數1110100000000011或十進制數59395。