拿TCP帧来说,构造一帧网络数据的时候,应用层的原始数据,被不同的层封装,最后发到网络上。
从层的角度来看,TCP和UDP都是工作在运输层的,而ARP是工作在数据链路层的。即ARP在构造数据的时候,是从数据链路层开始的,所以一个完整的arp协议是不包含IP头的,更不可能包含TCP,UDP头。
从协议上来看,ARP和TCP,UDP相同的地方,只有以太网首部是相同的了。另外UDP和ARP都是面向无连接的广播协议,所以都可以调用sendto()函数来发送数据。再看下图的arp协议,就简单明了了
在开始编程之前,我们可以手动构造一个arp数据帧,来加深一下对arp的理解。现在我用Hack向被欺骗者发送虚假IP地址192.168.0.108, 和虚假的MAC地址aa.bb.cc.dd.ee.ff,注意这里是hack发给被欺骗者,hack是源头,被欺骗者是目标。
我们来看以太网首部(也叫以太帧头)
ARP 应答包的格式具体如下:
以太网目的地址:被欺骗者mac地址-01.02.03.04.05.06(16进制);
主机的 MAC 地址:hack的地址(要欺骗,就要填假地址)-aa.bb.cc.dd.ee.ff(16进制);
帧类型:0x0806 表示 ARP 帧;
硬件类型:0x0001 表示以太网;
协议类型:0x0800 表示 IPv4 协议;
硬件地址长度:0x06;
协议地址长度:0x04;
OP 操作选项:0x0002 表示 ARP 应答;
发送端以太网地址:再填一遍刚刚的假地址aa.bb.cc.dd.ee.ff(16进制);
发送端 IP 地址:hack的假IP地址-192.168.0.108,换成16进制就是c0.a8.0.6c;
目的以太网地址:再填一遍被欺骗者的mac地址01.02.03.04.05.06;
目的 IP 地址:被欺骗者的 IP 地址-192.168.0.102,换成16进制就是c0.a8.0.66;
把上面的组装起来就是
01 02 03 04 05 06 aa bb cc dd ee ff 0806 0001 0800 06 04 0002 aa bb cc dd ee ff c0 a8 00 6c 01 02 03 04 05 06 c0 a8 00 66
由hack发送给被欺骗者,就能实现arp欺骗。