网络字节序是在网络中传输使用的字节序,和大端字节序一致。
对于不大于一字节的字段,比如IP 报头的TTL是一个字节长度,不需要考虑字节序问题。
对于多字节的字段,比如IP 报头的IP地址(32位整形数,4字节)和TCP/UDP报头的port 端口(16位整形数,2字节)都是大于一个字节,那么小端字节序的主机需要转序,比如端口8084,网络字节序和大端主机是1f94,而小端主机不转成网络字节序是941f(wireshark抓包显示的是37919),所以小端主机需要使用htons(8084)(16位)。
目前Linux 库函数提供了16bits 和32bits 的转序函数:
htonl 和htons,分别对32位和16位整数从主机字节序转换成网络字节序,host to net long(4 bytes)/short(2 bytes);
ntohl 和ntohs,分别对32位和16位整数从网络字节序转换成主机字节序,net to host long/short;
64位的字节序转换函数,网上有一些,但并不能很好的工作,一般也用不到这么大的整数。
为了代码可移植性,不能假设当前主机需要或者不需要转序,所以所有的主机都需要进行字节序转换。
除了TCP/IP协议栈中注意字节序外,send 函数发送的数据如果是int 类型,也会需要字节转序,接收方接收了要转序。发送字符串形式的数据不需要转换字节序,这个原因暂时没有找到,需要跟踪下sendto 代码。