Wireshark 实验
-
实作一 熟悉 Ethernet 帧结构
由上图可以知道目的地址,它的源地址,它的类型等等。 -
在Wireshark里面没有校验码的原因是因为Wireshark它已经进行了校验所以里面就没有了。
-
实作二 了解子网内/外通信时的 MAC 地址
1.使用ping旁边的计算机,要位于同一子网
在这里能看到发出帧的mac地址以及返回帧的mac地址
可以看到目的mac地址是destination,源地址是source,这边是因为附近没有电脑,然后ping网关。
2.ping qige.io
因为访问qige.io需要经过网关,所以他的目的mac地址就是网关的。
3.ping www.cqjtu.edu.cn
和上面类似,访问时需要经过网关,所以其目的mac地址也是网关
综合上诉的实验,访问本子网的时候,目的mac地址是主机的,访问非本子网的计算机目的mac地址是网关的,是因为访问外部网络需要经过网关的,由于处于同一子网,ping本子网是以广播的方式去寻找,而在不同子网由于路由器不会广播,所以他们的目的mac地址都是网关的地址,所以网关就是不同子网的出入口。 -
实作三 掌握 ARP 解析过程
ping同一子网
pingqige.io
arp请求都是通过广播的形式请求的,在同一子网得到的是对方的mac地址,访问外网arp得到的是网关的mac地址。
它的原因是因为arp请求在同一子网是在该网络里面广播请求询问的人是否是它要查询的,如果是的话对方会回话,得到对方的mac地址,而询问非子网的情况下,路由器不可能广播,所以只能通过网关,路由器事通过ip地址的方式找到对方,所以最终返回给的也是网关,mac地址就是网关。 -
网络层
-
实作一 熟悉 IP 包结构
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
这是因为在分段与重组的时候需要这些信息。 -
实作二 IP 包的分段与重组
分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?
会丢失以及重新组合。 -
实作三 考察 TTL 事件
TTL追踪是根据每次TTL的死亡返回的,比如上图的TTL=1,但是经过该点TTL=0就失效了会返回回去,这时候就可以知道一个站点信息了,直到到baidu,它就会记录路径。
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?
如果该值为64则跳了64-50=14次,如果是128则跳了128-50=78,以此类推,TTL一般设置为2的n次方。 -
传输层
-
实作一 熟悉 TCP 和 UDP 段结构
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
端口的作用是该进程的唯一标识。源端口标识发起通信的进程,目的端口标识接受通信进程,有了端口号,接受到报文后才能够知道报文发送到哪个进程。端口号是便于在传输层之间的端到端方式。 -
实作二 分析 TCP 建立和释放连接
抓包wige.io,用浏览器访问qige.io,然后等待一段时间再停止抓包,在搜索栏搜索tcp,得到的都是tcp。再从里面寻找三次握手的包。
三次握手的流程为
根据上述的流程图我们从抓包的内容里面寻找
我们可以知道第一次握手的时候是客户端发送SYN包作为建立连接的请求等待确认应答。第二次握手是服务器发送ACK包确认应答,发送SYN包请求连接。第三次握手是客户端针对SYN包发送ACK确认应答。
四次挥手的流程图
四次挥手就是客户端发送就服务器请求关闭的FIN和ACK,此时的FIN和ACK置为1,第二次挥手是服务器收到FIN后发回一个ACK,第三次挥手服务器关闭与客户端的连接,发送一个FIN和ACK,第四次挥手就是客户端收到服务器发送的FIN发回ACK确认。
去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
可以建立多个端到端的连接。
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
可能的原因有可能是最后发出的ACK对方并没有接受,直接断开连接,还有可能是中间的发送请求和返回请求合并在一起了。
应用层
- 实作一 了解 DNS 解析
首先用ipconfig/flushdns清除缓存,再用nslookup qige.io,使用抓包软件抓包
dns
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
因为这样做可以平衡服务器的负载。
- 实作二 了解 HTTP 的请求和应答
使用浏览器打开qige.io,然后抓包,查找http的包
部分请求字段的具含义
Accept:浏览器可接受的MIME类型。 Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
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
post
数据是以流的方式(所以一定要指定数据长度)写过去,不会在地址栏上面显示。 现在一般提交数据到服务器使用的都是POST
以流的方式写数据,所以数据没有大小限制。
Get
会在地址栏后面拼接数据,所以有安全隐患。 一般从服务器获取数据,并且客户端也不用提交上面数据的时候,可以使用GET
能够带的数据有限, 1kb大小
请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。
1xx:信息,请求收到,继续处理
2xx:成功,行为被成功地接受、理解和采纳
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误,请求包含语法错误或者请求无法实现
5xx:服务器错误,服务器不能实现一种明显无效的请求
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?
第一次访问的时候,向服务器发送请求,成功收到响应,返回200.再次访问的时候,比较当前时间和上一次返回200的时间的时间差,如果未超时则缓存,如果超时就给服务器发送信息。服务器收到请求后根据ETAG值如果被请求的文件没有修改则返回304,如果修改了就返回200.如果服务器没有ETAG值,则看最后的修改时间,一致返回304,不一致返回200.