1.ARP数据包格式
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
ARP数据报的格式如下所示
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。
下面举一个具体的例子。
请求帧如下(为了清晰在每行的前面加了字节计数,每行16个字节):
以太网首部(14字节)
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
ARP帧(28字节)
0000: 00 01
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
0020: 00 00 00 00 00 00 c0 a8 00 02
填充位(18字节)
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太网首部:目的主机采用广播地址,源主机的MAC地址是00:05:5d:61:58:a8,上层协议类型0x0806表示ARP。
ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0001表示请求目的主机的MAC地址,源主机MAC地址为00:05:5d:61:58:a8,源主机IP地址为c0 a8 00 37(192.168.0.55),目的主机MAC地址全0待填写,目的主机IP地址为c0 a8 00 02(192.168.0.2)。
由于以太网规定最小数据长度为46字节,ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。
应答帧如下:
以太网首部
0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06
ARP帧
0000: 00 01
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
0020: 00 05 5d 61 58 a8 c0 a8 00 37
填充位
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太网首部:目的主机的MAC地址是00:05:5d:61:58:a8,源主机的MAC地址是00:05:5d:a1:b8:40,上层协议类型0x0806表示ARP。
ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0002表示应答,源主机MAC地址为00:05:5d:a1:b8:40,源主机IP地址为c0 a8 00 02(192.168.0.2),目的主机MAC地址为00:05:5d:61:58:a8,目的主机IP地址为c0 a8 00 37(192.168.0.55)。
实际在开发板上的测试结果:
开发板发送给pc机实际抓包的结果一致:
发送60字节 ok
0000 ff ff ff ff ff ff 08 90 90 90 90 90 08 06 00 01 ........ ........
0010 08 00 06 04 00 01 08 90 90 90 90 90 c0 a8 00 fa ........ ........
0020 00 00 00 00 00 00 c0 a8 00 64 00 00 00 00 00 00 ........ .d......
0030 00 00 00 00 00 00 00 00 00 00 00 00 ........ ....
抓包软件实际显示发送的数据为:
收到42字节arp响应包但是实际上是64个字节?
0000 08 90 90 90 90 90 00 1e c9 45 61 9e 08 06 00 01 ........ .Ea.....
0010 08 00 06 04 00 02 00 1e c9 45 61 9e c0 a8 00 64 ........ .Ea....d
0020 08 90 90 90 90 90 c0 a8 00 fa
开发板调试打印的结果:
interrupt : st=1 status=1 len= 40
receive data len=64
08 90 90 90 90 90 00 1e c9 45 61 9e 08 06 00 01
08 00 06 04 00 02 00 1e c9 45 61 9e c0 a8 00 64
08 90 90 90 90 90 c0 a8 00 fa
00 00 00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 0a
1f b2 53
现在有个问题:
在上文表述过以太网规定最小数据长度为46字节但是实际抓包的分析只有42个字节,这个怎么解释:
答:46个字节指的是以太网的帧,关键的是不包含以太网的首部也就是说14个字节的首部+28个字节的ARP响应帧(由于不够46个字节需要加上一些填充位,但是这些数据没有意义)+18个字节的填充位+4个字节的CRC校验位=64个字节,也就是说抓包得到的42个字节,实际在开发板上调试得到的数据为64个字节是正确的