抓包过程
一、抓包分析并验证ARP协议数据单元的格式;
查找RFC0826
文档中对于ARP协议的数据单元格式为:
对应下来的ARP数据包格式如下图(前一个协议地址长度应为硬件地址长度):
ARP工作原理
根据目标主机的ip地址,想和它通信,我们就发送一个ARP请求报文,广播给此网段的所有主机,如果某主机IP和目标IP一样,那么目标主机就会回复一个ARP回复报文,告诉想和它通信的主机自己的MAC地址。然后目标主机的IP地址和MAC地址都会被写入到本机的ARP缓存表里面,后续如果还需要和目标主机通信,那不就不用再去ARP解析了。
抓包分析
1.设置过滤器仅显示ARP
2.清空本机ARP表
在cmd中使用arp -a先查看本网段内有哪些主机
执行arp -d清空ARP表并再次使用arp -a进行验证
3.ping 172.19.76.85并在wireshark中查看
点击第一个数据包查看:
request表示发送请求,目的MAC地址不为是0说明已经关联了,重新清除缓存再次ping
此时目的MAC地址为0说明此次完全清除了
最后四行分别为发送MAC地址、发送IP地址、接收MAC地址、接收IP地址
二、抓包分析并验证TCP断开连接时四次握手工作过程(请不要以访问百度或者华为网站为实验用例,可选其他TCP通信作为实验用例);
查找RFC793
TCP的数据包格式为:
TCP三次握手和四次握手工时序图及原理分析
四次握手原理分析:
第一次:客户端发送断开TCP连接请求的报文,报文包含seq序列号(由发送端随机生成的)将报文中的FIN字段置为1(表示需要断开TCP连接),最终发送的信息(FIN=1,seq=x,x由客户端随机生成)
第二次:服务端回复客户端发送的TCP断开请求报文,包含seq序列号(由服务端随机生成),产生ACK字段回复(在客户端发送过来的seq字段+1),最终发送信息(FIN=1,ACK=x+1,seq=y,y由服务端随机生成)
第三次:服务端回复完请求后,先确认数据是否已经传输完毕,如果传输完毕,将回复报文的FIN字段置为1,产生随机序列号seq,最终发送报文(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)
第四次:客户端接收到服务端的TCP断开请求后,回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段在服务端的TCP断开请求的seq基础上+1,最终发送报文(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
抓包分析
四次握手分析:
①第一次握手,222.73.142.42发送带有[FIN,ACK]标志的数据包给172.19.242.85,seq=64,Ack=1;
查看报文中的Flags位,Fin为1,说明这是一个断开连接的请求报文
②第二次握手,172.19.242.85收到222.73.142.42的FIN数据包,向222.73.142.42响应Ack数据包,Seq=1(与222.73.142.42的Ack值相同),Ack=65(222.73.142.42的Seq值+1)
查看报文:
③第三次握手,172.19.242.85需要将发送给222.73.142.42的数据发送完,发送完之后172.19.242.85向222.73.142.42发送[FIN,ACK]报文,Seq=1,Ack=65(与上一条报文的值相同)
第三次报文:
④第四次握手,222.73.142.42向172.19.242.85发送Seq=65,Ack=2(上次握手的Seq值+1)的最终报文
第四次报文:
四次握手完成,TCP释放连接
三、用snmputilg或snmputil读取被管理对象(代理系统)的管理数据,抓包分析SNMP相应PDU的格式。
查找SNMP对应的RFC文档
发现有许多不同的编号对应不同的内容
那么根据实验的内容,我需要知道SNMP的原理介绍以及其PDU的格式,根据这两个条件,我需要查找的对应rfc文档编号为1155
在查找完文档后,我大概明白了SNMP是什么。SNMP是简单网络管理协议,属于TCP/IP当中的应用层协议。主要用于网络设备的管理。
SNMP的PDU格式为:
抓包分析
1.添加SNMP服务并启动
设置SNMP属性
2.使用snmputil get 192.168.43.212 public .1.3.6.1.2.1.1.1.0获取另一台电脑设备的有关硬件信息
3.使用wireshark抓包,过滤条件设置为snmp
4.验证SNMP协议的工作过程
SNMP是基于请求-响应模型工作的,客户端发送一个请求,服务器对请求的内容进行回应
从上图wireshark抓取到的包也能直观地看到,客户端(使用命令的主机)向服务端发送一个get-request包,随后服务器发送一个回应——get-reponse包。
5.SNMP PDU分析
Wireshark抓取到的数据包
version:写入字段为版本号-1,snmpv1应写入0;
community:作为管理进程和代理进程之间的明文口令,常用的是6个字符“public”。
Data:PDU类型,根据PDU类型,填入0~4中的一个数字,0表示的是get-request类型
Request-id:由管理进程设置的一个整数值。代理进程在发送get-response报文时也要返回此请求标识符。管理进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文。
Error-status:差错状态,为0~5中的一个数字,0表示一切正常
Error-index:当出现noSuchName、badValue或readOnly的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。
实验小结:
本次实验我学会了如何wireshark捕获包,通过wireshark捕获到的包,我在实践意义上再次了解到了我之前在课上学到的知识:arp的工作原理和数据包格式、TCP的三次握手和TCP包的数据格式,以及最近学习到的SNMP包的工作原理和PDU格式。对于学过的知识有了更深刻的理解和记忆,也学习到了如何查阅rfc文档,对之后学习和复习都有很大的帮助。
问题分析:
SNMP出现错误:error on SnmpMgrRequest 40
对错误信息进行查询获得如下回复:
解决:
打开snmp服务的设置,选择陷阱添加目标为127.0.0.1
选择安全添加社区名称勾选发送身份验证陷阱和接收来自任何主机的SNMP数据包
在snmputil下执行snmputil get 172.19.240.69
public .1.3.6.1.2.1.1.1.0
成功:
WireShark无法捕获到snmp数据包
搜索资料后发现,因为我是在本机上进行实验,WinPcap无法捕获本地环回地址127.0.0.1
知道错误原因就好解决了,我借用了同学的电脑,用ip config命令获取其ip地址192.168.43.212,然后使用snmputil get 192.168.43.212
public .1.3.6.1.2.1.1.1.0命令获取其设备信息,最终捕获到了snmp数据包