实验一 wireshark基本操作及ARP协议分析
1、熟悉并掌握Wireshark的基本使用;
3、分析以太网帧,MAC地址和ARP协议。
与因特网连接的计算机,操作系统为Windows,安装有Wireshark、IE等软件。
下载地址:https://www.wireshark.org/#download
注意操作系统版本,特别是32位操作系统和64位操作系统的区别。
安装时选择默认设置即可。
要深入理解网络协议,需要观察它们的工作过程并使用它们,即观察两个协议实体之间交换的报文序列,探究协议操作的细节,使协议实体执行某些动作,观察这些动作及其影响。这种观察可以在仿真环境下或在因特网这样的真实网络环境中完成。
观察正在运行的协议实体间交换报文的基本工具被称为分组嗅探器(packet sniffer),又称分组捕获器。顾名思义,分组嗅探器捕获(嗅探)你的计算机发送和接收的报文。
图1显示了一个分组嗅探器的结构。
图1
图1右边是计算机上正常运行的协议和应用程序(如:Web浏览器和FTP客户端)。分组嗅探器(虚线框中的部分)主要有两部分组成:第一是分组捕获器,其功能是捕获计算机发送和接收的每一个链路层帧的拷贝;第二个组成部分是分组分析器,其作用是分析并显示协议报文所有字段的内容(它能识别目前使用的各种网络协议)。
Wireshark是一种可以运行在Windows, UNIX, Linux等操作系统上的分组嗅探器,是一个开源免费软件。
运行Wireshark程序时,其图形用户界面如图2所示。最初,各窗口中并无数据显示。Wireshark的界面主要有五个组成部分:
图2
命令菜单(command menus):命令菜单位于窗口的最顶部,是标准的下拉式菜单。
协议筛选框(display filter specification):在该处填写某种协议的名称,Wireshark据此对分组列表窗口中的分组进行过滤,只显示你需要的分组。
捕获分组列表(listing of captured packets):按行显示已被捕获的分组内容,其中包括:分组序号、捕获时间、源地址和目的地址、协议类型、协议信息说明。单击某一列的列名,可以使分组列表按指定列排序。其中,协议类型是发送或接收分组的最高层协议的类型。
分组首部明细(details of selected packet header):显示捕获分组列表窗口中被选中分组的首部详细信息。包括该分组的各个层次的首部信息,需要查看哪层信息,双击对应层次或单击该层最前面的“+”即可。
分组内容窗口(packet content):分别以十六进制(左)和ASCII码(右)两种格式显示被捕获帧的完整内容。
(1)查看自己的IP地址和MAC地址。Windows系统用命令提示符查看,在运行中输入CMD,或在开始菜单“Windows附件”/“Windows系统”中打开命令提示符。在命令提示符中输入ipconfig -all,查看本机物理地址和IP地址。MAC系统在系统更偏好设置-网络-选择已连接网络查看本机物理地址和IP地址。
(2)启动wireshark软件,选择准备捕获数据包的网卡接口。
(3)过几秒钟后停止捕获,观察捕获到的数据包。
(4)在过滤条件中,选择查看自己IP地址发出的数据包,使用过滤条件“ip.src==步骤2中查看到的IP地址”,并在数据包详情窗口查看源MAC地址是否是步骤2中查看到的本机的物理地址。
(5)重新设置过滤条件,选择查看由自己MAC地址接收的数据包,使用过滤条件“eth.dst == 步骤2中查看到的物理地址”( 注意地址内16进制以冒号隔开),并在数据包详情窗口查看目的IP地址是否是自己的IP地址。
(6)思考:
(1)在命令提示符输入arp,查看arp工具的参数。输入arp –a,查看本地的arp缓存表,并记录下表(不够可添加行):
| Internet地址 | 物理地址 | 类型 |
ARP的包减少了
(4)运行wireshark抓包分析工具,开始进行捕获,捕获前或者捕获中运行arp –d清除arp缓存表然后在命令提示符输入“ping 网关地址”,过一段时间后停止捕获,观察捕获到的数据包。
说明:很多时候不需要“ping 网关地址”,系统很快也会自动运行ARP协议,获得网关物理地址。因此往往在删除缓存表后再查看缓存表时,会发现网关的ARP项目仍然存在。
(5)在过滤栏中,设置过滤条件为arp数据包。
(6)查看从本机mac地址发出的arp数据包,查看捕获数据包的第一个分组的链路层帧结构及arp协议分组结构,截图并记录下表。
| 目的MAC地址 | 源MAC地址 | 类型 | |||||
| 90:e7:10:b8:13:3e | c8:d9:d2:19:fe:c8 | ARP | |||||
| 硬件类型 | 上层协议类型 | MAC长度 | IP长度 | 操作类型 | |||
| Ethernet(1) | IPv4 | 6 | 4 | Request(1) | |||
| 源MAC地址 | 源IP地址 | ||||||
| c8:d9:d2:19:fe:c8 | 10.0.132.22 | ||||||
| 目的MAC地址 | 目的IP地址 | ||||||
| 90:e7:10:b8:13:3e | 10.0.132.254 | ||||||
根据捕获的数据包信息思考并回答以下问题:
90:e7:10:b8:13:3e 目的主机收到了该ARP请求之后,会发送一个ARP应答,里面包含了目的主机的MAC地址。
硬件类型:该字段2个字节,用于表明ARP分组是跑在什么类型的网络上的,例如如果是我们最常用的以太网值是1。
协议类型:该字段2个字节,用于表明使用ARP分组的上层协议是什么类型,例如如果是我们最常用的IPv4协议值是32。
操作类型:该字段2个字节,用于表明该ARP分组的类型。现在已经有的类型只有2中:ARP请求(值是1),ARP应答(值是2)
| 目的MAC地址 | 源MAC地址 | 类型 | |||||
| c8:d9:d2:19:fe:c8 | 90:e7:10:b8:13:3e | ARP | |||||
| 硬件类型 | 上层协议类型 | MAC长度 | IP长度 | 操作类型 | |||
| Ethernet(1) | IPv4 | 6 | 4 | Request(2) | |||
| 源MAC地址 | 源IP地址 | ||||||
| 90:e7:10:b8:13:3e | 10.0.132.254 | ||||||
| 目的MAC地址 | 目的IP地址 | ||||||
| c8:d9:d2:19:fe:c8 | 10.0.132.22 | ||||||
根据捕获的数据包信息回答以下问题:
主机发送给本机
Request(1)→Request(2)
源IP地址和MAC地址与目的IP地址和MAC地址交换
(6)思考:请根据今天实验的所有实验结果
在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
1、每个主机都会有自己的ARP缓存区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系
2、当源主机要发送数据时,首先检测ARP列表中是否对应IP地址的目的主机的MAC地址。如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包。
3、当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和mac地址写入到ARP列表中,如果以存在,则覆盖。然后将自己的mac地址写入arp响应包中,告诉源主机自己是它想要找的mac地址。
4、源主机收到ARP响应包后,将目的主机的IP和mac地址写入arp列表,并利用此信息发送数据如果源主机一直没有收到arp响应数据包,表示arp查询失败。
1. 假冒ARP应答
2. 点对点的假冒查询
3. 自动定时ARP欺骗
4. 对网关的干扰
5. 推测ARP解析时间
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in