用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. 微信公众平台如何与Web App结合?

    Web App简而言之就是为移动平台而优化的网页,它可以表现得和原生应用一样,并且克服了原生应用一些固有的缺点.一般而言Web App最大的入口是浏览器,但现在微信公众平台作为新兴的平台,结合其内置浏 ...

  2. DropDownList切换选择,服务器控件Repeater未更新

    将EnableViewState属性设置为false,这样禁止服务器控件使用视图状态,也就是禁止发送给浏览器HEML中的缓存副本, 每次都会使用新数据. 一旦页面的控件很多,频繁的传递控件状态值对网络 ...

  3. image的关闭和开启

    image1.gameObject.SetActive(true);开启image,image1.gameObject.SetActive(false);关闭image,可以用事件或者button开启 ...

  4. Ruby on Rails 目录结构

    目录结构 + app/ #控制器.模型.视图.帮助方法.邮件.静态资源 + bin/ #rails脚本 + config/ #路由.数据库等 + db/ #数据库模式.迁移文件 + lib/ #扩展模 ...

  5. BitAdminCore框架应用篇:(二)创建一个简单的增删改查模块

    NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/cookie ...

  6. FunDA(9)- Stream Source:reactive data streams

    上篇我们讨论了静态数据源(Static Source, snapshot).这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不安全的资源使用方式.Slick3.x已经增加了支 ...

  7. Flask从入门到精通之使用Flask-SQLAlchemy管理数据库

    Flask-SQLAlchemy 是一个Flask 扩展,简化了在Flask 程序中使用SQLAlchemy 的操作.SQLAlchemy 是一个很强大的关系型数据库框架,支持多种数据库后台.SQLA ...

  8. Flask从入门到精通之flask安装

    使用虚拟环境 安装Flask最简单的方式是使用虚拟环境,虚拟环境是python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装的全局的Python解释器.虚拟环境非常有用,可 ...

  9. iOS开发总结——协议代理的认识

    1.前言 自今年5月底正式转iOS之后,天天get新技能,很多技能在脑子里回旋不吐不快,所以,写点东西整理一下.先从协议代理开始. 2.协议方法的声明 @protocol EventMenuBarDe ...

  10. 【xsy1143】 兔子的数字 搜索

    题目大意:请找到第$k$大的数,满足各位数字之和等于各位数字之积.其中$k≤10^{18}$. 首先我们要确定这个第$k$大的数有多大 我们用$f[i][j][he][ji]$表示我们要搜索一个$i$ ...