主机字节序及网络字节序
1. 大端模式&小端模式
“大端”和”小端”表示多字节值的哪一端存储在该值的起始地址处;
小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;具体的说:
①大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处;
②小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。
如下图:当以不同的存储方式,存储数据为0x12345678时:
2. 网络字节序
网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;
UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;
所以说,网络字节序是大端字节序;
在实际中,当在两个存储方式不同的主机上传输时,需要借助字节序转换函数。
3. 主机字节序转网络字节序
#include <arpa/inet.h>
//将主机字节序转换为网络字节序
unit32_t htonl (unit32_t hostlong);
unit16_t htons (unit16_t hostshort);
说明:h -----host;n----network ;s------short;l----long
4. 网络字节序转主机字节序
#include <arpa/inet.h>
//将网络字节序转换为主机字节序
unit32_t ntohl (unit32_t netlong);
unit16_t ntohs (unit16_t netshort);
说明:h -----host;n----network ;s------short;l----long
5. 抓包
tcpdump -i eth0 -vnn port 9764 -w /data0/fil1 -c 10
说明:
eth0是网卡
port是我们抓包的端口,凡是过这个端口的数据,不论进的还是出的都会被catch
/data0/fil1是我们抓包结果文件保存的路径
10表示我们抓10包数
然后分析数据推荐使用wireshark,导入fil1文件即可。
上指令中需要指定网卡,该指令中对应“eth0”。实际使用时,我们需要调用指令来查看当前机器处于工作状态的网卡,能看出网卡速度的就是在工作状态的。
ethtool ${eth} | grep Speed