網絡字節序——大小端
計算機內部因爲系統差異,數據存儲分爲大端存儲和小端存儲。
大端存儲:數據的高位存儲在低地址處,數據的低位存儲在高地址處(大高低)。
小端存儲:數據的低位存儲在低地址處,數據的高位存儲在高地址處(小低低)。
網絡通信要連接兩臺不同的主機,如果兩臺主機的大小端不一致,那麼通信的數據交換會無法識別。
場景1:主機A、B進行通信。主機A是大端存儲,主機B是小端存儲。
已知:發送主機發送緩衝區數據時從低地址到高地址發送的,
接收主機接收時也是用低地址到高地址保存的。
假設A要發送的數據是ABCDEFGH,那麼B接收到的數據將是GHEFCDAB。
這樣無法正常通信。
所以TCP/IP規定,網絡數據流應採用大端字節序:即低地址高字節,不管自己的主機是大端存儲還是小端存儲,都應按照這個TCP/IP規定的網絡字節序來發送/接收數據。
爲了使網絡程序具有移植性,所以有C語言的庫函數做網絡字節序和主機字節序的轉換
NAME
htonl, htons, ntohl, ntohs - convert values between host and network
byte order
SYNOPSIS /*摘要*/
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
//h表示host,n表示network,l表示32位整數,s表示16位短整數
//to表示從...變化到...
- 如果主機是小端存儲,這些函數會將參數做相應變化再返回。
- 如果主機是大端存儲,則不做轉換,數據原封不動返回。