实验一:数据链路层
(一)熟悉Ethernet 帧结构
问:我们会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
答:Wireshark展现给我们的帧中没有校验字段因为:Wireshark 抓包前,在物理层网卡已经去掉了一些之前几层加的东西,比如前导同步码,FCS等等,之后利用校验码CRC校验,正确时才会进行下一步操作,因此,抓包软件抓到的是去掉前导同步码、FCS之外的数据,没有校验字段。
(二)了解子网内/外通信时的 MAC 地址
1.ping
旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
而MAC地址是处在同一子网里的该计算机的MAC地址
2.然后 ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
因为访问qige.io需要经过网关,所以他的目的mac地址就是网关的。
3.再次 ping www.cqjtu.edu.cn
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
总结:访问本子网的时候,目的mac地址是主机的,访问非本子网的计算机目的mac地址是网关的,是因为访问外部网络需要经过网关的,由于处于同一子网,ping本子网是以广播的方式去寻找,而在不同子网由于路由器不会广播,所以他们的目的mac地址都是网关的地址,所以网关就是不同子网的出入口。
(三)掌握 ARP 解析过程
1、为防止干扰,先使用 arp -d * 命令清空 arp 缓存
2、ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
3、再次使用 arp -d * 命令清空 arp 缓存
4、然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
arp请求都是通过广播的形式请求的,在同一子网得到的是对方的mac地址,访问外网arp得到的是网关的mac地址。
它的原因是因为arp请求在同一子网是在该网络里面广播请求询问的人是否是它要查询的,如果是的话对方会回话,得到对方的mac地址,而询问非子网的情况下,路由器不可能广播,所以只能通过网关,路由器事通过ip地址的方式找到对方,所以最终返回给的也是网关,mac地址就是网关。
实验二:网络层
(一)熟悉 IP 包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
(二) IP 包的分段与重组
根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。缺省的,ping
命令只会向对方发送 32 个字节的数据。
我们可以使用 ping 202.202.240.16 -l 2000
命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16
进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等。
问:分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?
答:路由器会重新排列以及组合。
(三)考察 TTL 事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。使用
tracert www.baidu.com
命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 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 段结构
1.用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
2.用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
问:由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
答:端口的作用是该进程的唯一标识。源端口标识发起通信的进程,目的端口标识接受通信进程,有了端口号,接受到报文后才能够知道报文发送到哪个进程。端口号是便于在传输层之间的端到端方式。
(二)分析 TCP 建立和释放连接
打开浏览器访问 qige.io
网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
三次握手:第一次握手的时候是客户端发送SYN包作为建立连接的请求等待确认应答。第二次握手是服务器发送ACK包确认应答,发送SYN包请求连接。第三次握手是客户端针对SYN包发送ACK确认应答。
四次握手:客户端发送就服务器请求关闭的FIN和ACK,此时的FIN和ACK置为1,第二次挥手是服务器收到FIN后发回一个ACK,第三次挥手服务器关闭与客户端的连接,发送一个FIN和ACK,第四次挥手就是客户端收到服务器发送的FIN发回ACK确认。
问1:去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
答:它们之间的连接是属于短连接,一旦数据发送完成后,就会断开连接。虽然,断开连接,但是页面还是存在,由于页面已经被缓存下来。一旦需要重新进行发送数据,就要再次进行连接。这样的连接,是为了实现多个用户进行访问,对业务频率不高的场合,节省通道的使用,不让其长期占用通道。
问2:它们之间的连接是属于短连接,一旦数据发送完成后,就会断开连接。虽然,断开连接,但是页面还是存在,由于页面已经被缓存下来。一旦需要重新进行发送数据,就要再次进行连接。这样的连接,是为了实现多个用户进行访问,对业务频率不高的场合,节省通道的使用,不让其长期占用通道。
答:可能的原因有可能是最后发出的ACK对方并没有接受,直接断开连接,还有可能是中间的发送请求和返回请求合并在一起了。
实验四:应用层
应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。
(一)了解 DNS 解析
先使用 ipconfig /flushdns
命令清除缓存,再使用 nslookup qige.io
命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。可了解一下 DNS 查询和应答的相关字段的含义。
问:你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
答;为了使服务器的负载得到平衡(因为每天访问站点的次数非常多)网站就设有好几个计算机,每一个计算机都运行同样的服务器软件。这些计算机的IP地址不一样,但它们的域名却是相同的。这样,第一个访问该网址的就得到第一个计算机的IP地址,而第二个访问者就得到第二个计算机的IP地址等等。这样可使每一个计算机的负荷不会太大。
(二)了解 HTTP 的请求和应答
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
1.请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。
post
数据是以流的方式(所以一定要指定数据长度)写过去,不会在地址栏上面显示。 现在一般提交数据到服务器使用的都是POST以流的方式写数据,所以数据没有大小限制。
Get
会在地址栏后面拼接数据,所以有安全隐患。 一般从服务器获取数据,并且客户端也不用提交上面数据的时候,可以使用,GET能够带的数据有限, 1kb大小
部分字段的含义:
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
2.请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。
1xx:信息,请求收到,继续处理
2xx:成功,行为被成功地接受、理解和采纳
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误,请求包含语法错误或者请求无法实现
5xx:服务器错误,服务器不能实现一种明显无效的请求
问:HTTP 请求和应答的头部字段值得大家认真的学习,因为基于 Web 的编程中我们将会大量使用。如:将用户认证的令牌信息放到头部,或者把 cookie 放到头部等。
答:第一次访问的时候,向服务器发送请求,成功收到响应,返回200.再次访问的时候,比较当前时间和上一次返回200的时间的时间差,如果未超时则缓存,如果超时就给服务器发送信息。服务器收到请求后根据ETAG值如果被请求的文件没有修改则返回304,如果修改了就返回200.如果服务器没有ETAG值,则看最后的修改时间,一致返回304,不一致返回200。