博客
关于我
Wireshark抓包实验
阅读量:117 次
发布时间:2019-02-28

本文共 6073 字,大约阅读时间需要 20 分钟。

摘要

本文是通过Wireshark的抓包实验来学习数据链路层、网络层、传输层、应用层,了解帧、IP包、段等的结构,对网络有更深的认识。

文章目录

数据链路层

实作一 熟悉 Ethernet 帧结构

Wireshark随意抓包

分析:

目的MAC为:

处于包的头部,源MAC地址为:

至于为什么没有校验字段,原因就是校验和会由网卡计算,这时,wireshark抓到的本机发送的数据包和校验和都是错误的,所以默认关闭了wireshark自己的校验和

实作二 了解子网内/外通信时的 MAC 地址

ping旁边机器一下,获得MAC地址

ping qige.io获得MAC地址

ping www.cqjtu.edu.cn

得到如下结论:

访问本子网的计算机时,目的MAC就是该主机的;但是访问非本子网的计算机时,目的MAC是网关的,思考原因如下:

如果在同一子网下,需要知道其MAC地址直接进行通信;但如果不在同一子网下,需要知道对方的网关MAC,发送到对方的网关上,然后网关再根据IP目的地址找到对方网络MAC因此,目的MAC是网关的

另外,如果不在学校机房的话想要构建在同一子网下的主机,我考虑将两台不同的电脑连接在同一热点下,观察他们确实在同一子网(102.168.43.***)下:

但是,主机相互之间却不能ping通,经过查阅思考并查阅相关资料,得出以下结论:

主机间的防火墙没关,可以在==Win+R->输入:control->选择网络和Internet->点击网络和共享中心->点击Windows防火墙->关闭(这样也是有风险的)==这样就可以成功ping通对方主机了。

实作三 掌握 ARP 解析过程

arp -d *清空arp缓存

如果出现ARP项删除失败,请求操作需要提升,那么可以右键后,选择Window PowerShell,进入管理员界面,再输入arp -a 即可

ping旁边的机器,同时抓包

同样清除缓存,ping qige.io

得到如下结论:

如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP,, 那么 ARP 解析将得到网关的 MAC。

同样像上面的分析,在同一子网下,需要知道对方的MAC,而不在同一子网下,需要知道目的网关的MAC,


网络层

实作一 熟悉 IP 包结构

随意抓包:

目的MAC和源MAC之后就是IP包,依次为版本、头部长度、服务类型、总长度。对应第三行为生存周期、协议等字段

头部长度有什么用:

IP包的头部长度,保证了上层在进行处理时可以直接将IP头部去掉处理段内容

实作二 IP 包的分段与重组

ping 202.202.240.16 -l 2000

同时进行抓包,且过滤

遇到大数据包,就往回报包过大,并丢弃,保证了路由器专注于解决路径问题,包被切成了1500左右大小的小包

实作三 考察 TTL 事件

输入命令:

tracert www.baidu.com

用Wireshark(icmp)追踪并过滤:

主机发的报文所设置的生存周期在从1开始不断地变大,因为TTL每经过一个路由器的时候都会被减一,当TTL等于0的时候就会被抛弃,并且返回一个超时的ICMP数据包。这时我们就可以知道路由结点的地址了。

总有一次我们发送最后一个数据刚刚到达目的主机时,数据报的TTL是1,这时候我们就不减1了。


传输层

实作一 熟悉TCP UDP段结构

Wireshark抓包,经过tcp过滤抓到TCP段的结构,如下

TCP相对于UDP段较为复杂,TCP字段中包含了源端口号、目的端口号、顺序号、确认号、头部长度,特殊位窗口大小、校验和等信息

抓取UDP包:

UDP相对于TCP来说简单许多,作为面向非连接的服务,UDP段里只有源端口、目的端口、头部长度、校验和,可以看到,校验和还是忽略的

实作二 分析TCP建立和释放连接

访问qige.io 并进行抓包,观察到三次握手:

三次握手中,一个典型的标志就是SYN,前两次握手SYN都为0,第三次握手SYN为1。

四次挥手,典型的标志就是,有连词FIN为1,表示一方想要中断连接。


应用层

实作一 了解DNS解析

用nslookuo qige.io 进行解析,然后用Wireshark进行抓包(dns过滤)

解释字段意思:DNS地53号端口,末尾Response In 表示DNS地53号端口发出回应到114号端口

为什么请求不止一个:对于部署再服务器上地应用来说,不需要进行任何代码地修改就可以实现不同机器上地应用访问。

实作二 了解HTTP的请求和应答

打开浏览器访问qige.io,同时用Wireshark进行抓包:

可以看到这个请求其命令使用的是POST;

下面是查阅资料得到的请求字段的具体含义

Accept:浏览器可接受的MIME类型。

Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Content-Length:表示请求消息正文的长度。
Cookie:设置cookie,这是最重要的请求头信息之一
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Host:初始URL中的主机和端口。
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU

响应码分为五种类型,由他们第一位数字表示

如图,看到抓到的包响应码为304

总结响应码的五种类型:

1xx:信息,请求收到,继续处理

2xx:成功,行为被成功地接受、理解和采纳
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误,请求包含语法错误或者请求无法实现
5xx:服务器错误,服务器不能实现一种明显无效的请求

下面是收集到的状态代码 状态信息的含义

100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)

101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新
200 OK 一切正常,对GET和POST请求的应答文档跟在后面。
201 Created 服务器已经创建了文档,Location头给出了它的URL。
202 Accepted 已经接受请求,但处理尚未完成。
203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。
204 No Content 没有新文档,浏览器应该继续显示原来的文档。
205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。
206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”,出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。
303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)
400 Bad Request 请求出现语法错误。
401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
404 Not Found 无法找到指定位置的资源。这也是一个常用的应答,
405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)
406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。
407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)
408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)
409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)
410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)
411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)
412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。
413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。
414 Request URI Too Long URI太长(HTTP 1.1新)。
416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)
500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
503 Service Unavailable 服务器由于维护或者负载过重未能应答。
504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)
505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本

问题回答

为什么发现不少304应答而不是常见的200应答?

因为第一次访问时成功收到响应,就会返回200,浏览器这时会下载资源文件,记录response header和返回返回时间

但是当再次请求相同资源的时候,如果没有超过过期时间,直接读取本地缓存资源,大如果国企了就会向服务器发出If-None-Match和If-Modified-Since的请求,

服务器街道请求后根据Etag的值判断被请求文件有没有做修改,若没修改,返回304,不一致返回200(参考https://blog.csdn.net/sinat_31231955/article/details/81876774)

总结

通过对计算机网络的抓包的实验,我对数据链路层、网络层、传输层、应用层以及他们相关的协议有了更加深刻的认识,通过对一些问题的思考,使我对网络有了自己的理解。

你可能感兴趣的文章
数据结构-栈
查看>>
C++关键字
查看>>
Spring boot Banner和icon
查看>>
spring-data-redis-hashoperations源码方法
查看>>
SpringBoot学习系列(二十)------SpringBoot和SpringCloud
查看>>
numpy_数组的基本访问和修改
查看>>
shareResourse_第一行代码(第三版 源代码+课件)quick download
查看>>
Java实现八大内部排序算法
查看>>
数组与链表的优缺点/效率问题
查看>>
Kafka使用前准备(二)
查看>>
《Linux网络编程》学习导图
查看>>
《TCP/IP协议族》:IP地址详解
查看>>
《TCP/IP协议族》:子网掩码详解
查看>>
新概念英语一 : 语法整理 unit4 47-66
查看>>
《程序员代码面试指南》按照左右半区的方式重新组合单链表
查看>>
Linux(Linux系统简介)
查看>>
《程序员代码面试指南》判断两个字符串是否互为变形词
查看>>
记录踩过的坑-WPS文字
查看>>
机器学习中的random_state参数
查看>>
android缓存封装-没有最简只有更简
查看>>