用Winpcap编程构造ARP包选择网卡并发出,遇到若干问题,学到了许多新知识,但是有的还尚未解决,在这里记录下没解决的和解决的问题。

  先来看下ARP协议的格式,ARP字段有28个字节,发到以太网中还要加上14字节的以太网首部和4字节的FCS尾部,一共是28+14+4=46字节,以太网帧的最小长度为64字节,所以还要在尾部之前填充18个字节。 

依据此原理我用winpcap编程实现了构造发送ARP包的源程序,并用Wireshark抓到了构造的ARP包,长度为64字节。

但是我在局域网的环境下抓包发现,惊奇的发现ARP帧长度竟然是42字节

对比之下发现与64字节的包相比少了4字节的FCS和18字节的填充位,由于之前我自己抓的64字节的ARP包都是在本机与虚拟机之间做的测试,为了消除不定因素,我准备了同一局域网中的两台真实的计算机做测试:

发送我构造ARP包的主机IP为:172.31.57.222  255.255.192.0

接收我构造ARP包的主机IP为:172.31.40.147  255.255.192.0

分别在两天主机上抓包

发送方抓到的包:

接收方抓到的包:

这下发现发送方和接收方抓到的包都是64字节,考虑到局域网中都是Windows系统,用mac发送ARP包同样是42字节,我又用Linux系统发送ARP包,又发现抓到的包是60字节,对比发现少了4字节的FCS,为什么会这样,我还没有找到资料,先记下来,再解决。

在真实的局域网中抓包的时候还发现了一个奇怪的ARP包,叫Gratuitous ARP,查下资料发现

百度百科的解释和例子:

Gratuitous ARP也称为免费ARP,无故ARP。Gratuitous ARP不同于一般的ARP请求,它并非期待得到ip对应的mac地址,而是当主机启动的时候,将发送一个Gratuitous arp请求,即请求自己的IP地址的mac地址。

免费ARP可以有两个方面的作用:
1) 一个主机可以通过它来确定另一个主机是否设置了相同的I P地址。主机bsdi并不希望对此请求有一个回答。但是,如果收到一个回答,那么就会在终端日志上产生一个错误消息“以太网地址a:b:c:d:e:f发送来重复的I P地址”。这样就可以警告系统管理员,某个系统有不正确的设置。
2) 如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。一个比较著名的ARP协议事实[Plummer 1982]是,如果主机收到某个I P地址的A R P请求,而且它已经在接收者的高速缓存中,那么就要用ARP请求中的发送端硬件地址(如以太网地址)对高速缓存中相应的内容进行更新。主机接收到任何ARP请求都要完成这个操作(ARP请求是在网上广播的,因此每次发送ARP请求时网络上的所有主机都要这样做)。
很多系统都使用双机热备份系统(即一个主用,另一个备用, 如果主用没有问题,备用一直处于空闲状态;如果主用出现问题,备用立刻接管)。假设主用服务器的MAC地址为:1111-1111-1111,备用服务器 的MAC地址为:2222-2222-2222,通过某种软件,两台服务器对外共用一个IP,例如10.10.10.1,这样客户机在需要同服务器进行通 信的时候(第一次通信时ARP的缓存是空的,或至少没有10.10.10.1的MAC地址),先向局域网发送广播ARP请求报文,请求 10.10.10.1这个IP地址的MAC地址,得到主用服务器响应后,将10.10.10.1和对应的MAC地址放入自己的ARP缓存中,然后向这个 IP发送请求就可以进行通信了。如果在通信的过程中,主用服务器突然发生故障,宕机了,这时备用服务器立刻接管10.10.10.1这个IP进行服务,可 是刚才那台客户机的ARP缓存表中10.10.10.1这个IP对应的MAC地址是1111-1111-1111,再往这个MAC地址发送数据包肯定是石 沉大海的,怎样才能让备用接管了服务之后立刻能起作用呢?
我们能想到的方法有两种,一种就是在使用双机热备份系统,接管那个IP的时候,生成一个不依赖于任何一个主机的虚拟MAC地址,接管IP的同时也接管那个 虚拟的MAC地址,这样客户机不需要做任何更改动作,ARP缓存表不变。另外一种就是在接管的同时,接管的服务器对外广播一个ARP报文给所有主机,例如 在刚才的例子中,ARP广播报文的数据字段中源IP地址是10.10.10.1,源MAC地址是2222-2222-2222,目的IP地址也是 10.10.10.1,目的MAC地址也是2222-2222-2222,IP报文的目的地址是FFFF-FFFF-FFFF,这样让所有的广播网络上的 主机接收该报文,并更新自己的ARP缓存表,已告知10.10.10.1这个IP的对应MAC地址已经变为2222-2222-2222,这样,刚才的那 个客户机就能正确地同服务器进行通信了。
 
也就是源IP地址和目的IP地址相同的ARP包就是这个神奇的Gratuitous ARP,启动网卡时WINDOWS会发送这个神奇的Gratuitous ARP,但是LINUX不发送和识别这个包。

ARP协议抓包之帧长度和Gratuitous ARP的问题的更多相关文章

  1. ARP 协议抓包分析

    ARP(Address Resolution Protocol)- 地址解析分析 ARP 协议是根据IP地址获取物理地址的一个TCP/IP协议. 当PC1 想与 PC2 进行通信时,需要同时知道PC2 ...

  2. 第04节-BLE协议抓包演示

    在上几篇博客中,形象的讲解了BLE各个层的作用,各个层的数据结构.本篇博客将研究BLE协议抓包.在实际开发中,有一个中央设备(central)和一个外设(Peripheral).所谓中央设备就是指它可 ...

  3. 网络协议抓包分析——ARP地址解析协议

    前言 计算机之间可以相互通信的前提是要知道对方的地址,才可以发送信息给其他计算机,就像别人要联系你也得先知道你的电话号码一样.这里的地址因为网络分层的原因就包括IP地址和MAC地址(即网卡地址.硬件地 ...

  4. 从零开始学安全(四十二)●利用Wireshark分析ARP协议数据包

    wireshark:是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换,是目前 ...

  5. 网络协议抓包分析——IP互联网协议

    前言 IP协议是位于OSI模型的第三层协议,其主要目的就是使得网络间可以相互通信.在这一层上运行的协议不止IP协议,但是使用最为广泛的就是互联网协议. 什么是IP数据报 TCP/IP协议定义了一个在因 ...

  6. 网络协议抓包分析——TCP传输控制协议(连接建立、释放)

    前言 TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方.TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手) ...

  7. 初识Http协议抓包工具—Fiddler

    1.Fiddler简介 Fiddler是用一款使用C#编写的http协议调试代理工具.它支持众多的http调试任务,能够记录并检查所有你的电脑和互联网之间的http通讯,可以设置断点,查看所有的“进出 ...

  8. Fiddler系列教程1:初识Http协议抓包工具

    1. Fiddler简介 Fiddler是用一款使用C#编写的http协议调试代理工具.它支持众多的http调试任务,能够记录并检查所有你的电脑和互联网之间的http通讯,可以设置断点,查看所有的“进 ...

  9. dhcp协议抓包分析

    dhcp协议 DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server),68(DHCP client). wires ...

随机推荐

  1. MySql采用range分区可提升查询效率

    简介: RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区.在5.7版本中DATE.DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的R ...

  2. Linux(Debian)网卡设置

    debian IP地址配置 vim /etc/network/interface   配置网卡eth0的IP地址 auto eth0 表示网卡随系统自动请 iface eth0 inet static ...

  3. 第五章 HashMap源码解析

    5.1.对于HashMap需要掌握以下几点 Map的创建:HashMap() 往Map中添加键值对:即put(Object key, Object value)方法 获取Map中的单个对象:即get( ...

  4. TOJ_12470

    #include <stdio.h> struct node{ int x; int y; int step;}first; int zx[4]={-1,0,1,0};int zy[4]= ...

  5. go get golang.org/x/net 安装失败的解决方法!

    GO语言在github.com上建立了自己的项目,对应的包如果不能下载,那么可以到这里去下载,比如:"go get golang.org/x/net"不能下载这个包,那么我们可以访 ...

  6. git命令上传项目到码云总结

    码云上传项目git命令总结: git clone https://git.oschina.net/xh-lxx/xh-lxx.oschina.io.git 进入到克隆下来的文件夹,然后操作git命令 ...

  7. HttpComponents组件探究 - HttpClient篇

    在Java领域,谈到网络编程,可能大家脑海里第一反应就是MINA,NETTY,GRIZZLY等优秀的开源框架.没错,不过在深入探究这些框架之前,我们需要先从最original的技术探究开始(当然,需要 ...

  8. Java之IO(四)DataInputStream和DataOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6986155.html 1.前言 DataInputStream和DataOutputStream分别继承了Fil ...

  9. 【Canal源码分析】Canal Server的启动和停止过程

    本文主要解析下canal server的启动过程,希望能有所收获. 一.序列图 1.1 启动 1.2 停止 二.源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...

  10. ubuntu16.04更改源为阿里源

    一.通过系统更换源 第一步:备份原来的源文件cd /etc/apt/  然后会显示下面的源文件sources.list输入命令sudo cp sources.list sources.list.bak ...