# computer-network-experiment-ii **Repository Path**: joise_vip/computer-network-experiment-ii ## Basic Information - **Project Name**: computer-network-experiment-ii - **Description**: 计算机网路-Wireshark - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-11 - **Last Updated**: 2021-12-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Wireshark 实验 ## Wireshark抓包教程 1、主界面 ![image-20211027082943380](Wireshark.assets/image-20211027082943380.png) 2、捕获->选项,勾选电脑网卡。点击start,启动抓包。 ![image-20211027083223528](Wireshark.assets/image-20211027083223528.png) 3、wireshark启动后,wireshark处于抓包状态中。 ![image-20211027083428513](Wireshark.assets/image-20211027083428513.png) 4、在cmd执行ping www.baidu.com ![image-20211027083621164](Wireshark.assets/image-20211027083621164.png) 5、可以通过在过滤栏设置过滤条件进行数据包列表过滤 ![image-20211027084436975](Wireshark.assets/image-20211027084436975.png) ## 数据链路层 ### 实作一 熟悉 Ethernet 帧结构 ![image-20211027084741735](Wireshark.assets/image-20211027084741735.png) 源Mac地址:3c:f0:11:ea:a5:1f 目的Mac地址:00:74:9c:9f:40:13 类型IPv4 源IP: 10.161.172.184 目的IP: 14.215.177.39 字段为:19 字节长度为:74bytes(592 bits) **问题**:你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。 **答:**校验字段是在物理层进行校验传输是否出错的,wireshark抓的包是校验后的包,所以wireshark展现给我们的帧中没有校验字段。 ### 实作二 了解子网内/外通信时的 MAC 地址 1. `ping` 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的? ![image-20211027090229786](Wireshark.assets/image-20211027090229786.png) 发送 ![image-20211027091339967](Wireshark.assets/image-20211027091339967.png) 返回 ![image-20211027091315288](Wireshark.assets/image-20211027091315288.png) 发出帧的目的 MAC 地址:00:74:9c:9f:40:13 返回帧的源 MAC 地址:00:74:9c:9f:40:13 MAC 地址是是旁边的计算机的 2. 然后 `ping qige.io` (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的? ![image-20211027091446731](Wireshark.assets/image-20211027091446731.png) 发出 ![image-20211027091606545](Wireshark.assets/image-20211027091606545.png) 返回 ![image-20211027091640580](Wireshark.assets/image-20211027091640580.png) 3. 再次 `ping www.cqjtu.edu.cn` (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的? ![image-20211027091931538](Wireshark.assets/image-20211027091931538.png) 发出 ![image-20211027092017980](Wireshark.assets/image-20211027092017980.png) 返回 ![image-20211027092042991](Wireshark.assets/image-20211027092042991.png) **问题** 通过以上的实验,你应该会发现, 1. 访问本子网的计算机时,目的 MAC 就是该主机的 2. 访问非本子网的计算机时,目的 MAC 是网关的 请问原因是什么? ​ **答:**ARP代理,访问非子网计算机时是通过路由器转接的,MAC地址是接入路由器端口的地址,再通过路由器发给想要访问的计算机。 ### 实作三 掌握 ARP 解析过程 1. 为防止干扰,先使用 `arp -d *` 命令清空 arp 缓存 ![image-20211110084424360](Wireshark.assets/image-20211110084424360.png) 1) 先运行:netsh i i show in 找到正在使用的网卡idx号 2) 解绑ARP:netsh -c i i delete neighbors **11** 这里的11为网卡idx号 **命令的效果等同与**arp -d ![image-20211110084525307](Wireshark.assets/image-20211110084525307.png) 2. `ping` 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。 ![image-20211110083513838](Wireshark.assets/image-20211110083513838.png) 请求的目的mac ![image-20211110085308690](Wireshark.assets/image-20211110085308690.png) 回应的目的mac与回应的源mac ![image-20211110085433699](Wireshark.assets/image-20211110085433699.png) 3. 再次使用 `arp -d *` 命令清空 arp 缓存 ![image-20211110085840345](Wireshark.assets/image-20211110085840345.png) 4. 然后 `ping qige.io` (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。 ![image-20211110090055079](Wireshark.assets/image-20211110090055079.png) ARP 请求的是 Who has 10.160.255.254? Tell 10.161.172.184 回应的MAC地址 ![image-20211110091424980](Wireshark.assets/image-20211110091424980.png) **问题** 通过以上的实验,你应该会发现, 1. ARP 请求都是使用广播方式发送的 2. 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。 请问为什么? **答:**如果访问的是我所处的本子网的ip,ARP 缓存中没有该 IP,那么发送一个广播,在子网中找寻这个 IP。如果有,那么ARP解析协议将会直接得到该ip对应的Mac地址。 如果访问的是非本子网的ip,那么ARP解析将直接得到网关的mac地址。因为要想访问对方,在处于同一子网的条件下,应该知道对方的MAC地址,但是不处于同一子网,就需要对方所处子网网关的mac地址。 ## 网络层 ### 实作一 熟悉 IP 包结构 使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。 ![image-20211110094144610](Wireshark.assets/image-20211110094144610.png) 版本:IPV4 服务类型:0x00 头部长度:20 bytes 总体长度:60 标识符:0x084f 存活时间TTL:128s 协议类:ICMP 头部校验数:0x0000 源地址:10.161.172.184 目的地址:172.67.143.53 **问题** 为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么? **答**:为了在此基础上更加提高效率,有头部长度字段和总长度字段是为了方便上层将 IP 包中的数据提取出来,当数据长度超过1500B时就会被返回链路层进行分段,所以标明是为了更方便的读取数据。 ### 实作二 IP 包的分段与重组 根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。 缺省的,`ping` 命令只会向对方发送 32 个字节的数据。我们可以使用 `ping 202.202.240.16 -l 2000` 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 `ip.addr == 202.202.240.16` 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等 ![image-20211124084008464](Wireshark.assets/image-20211124084008464.png) ![image-20211124084023684](Wireshark.assets/image-20211124084023684.png) ![image-20211124084903228](Wireshark.assets/image-20211124084903228.png) Total Length : 1500 总长度1500 **问题** 分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办? 答:丢掉然后通知发送端重新传送 ### 实作三 考察 TTL 事件 在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 **64、128**等。 在验证性实验部分我们使用了 `tracert` 命令进行**路由追踪**。其原理是**主动设置 IP 包的 TTL 值**,从 1 开始逐渐增加,直至到达最终目的主机。 请使用 `tracert www.baidu.com` 命令进行追踪,此时使用 Wireshark 抓包(用 `icmp` 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。 ![image-20211124085610297](Wireshark.assets/image-20211124085610297.png) ![image-20211124085639166](Wireshark.assets/image-20211124085639166.png) 本机发送的第一个包,TTL=1,只跳一次,这一跳是本网的网关。网关返回通知包过期,得到网关的地址。 ![image-20211124085719653](Wireshark.assets/image-20211124085719653.png) ![image-20211124085943549](Wireshark.assets/image-20211124085943549.png) 以后的每一次发送的包的TTL+1,每次包过期,都可以获得返回包的源地址。 ![image-20211124090231360](Wireshark.assets/image-20211124090231360.png) **问题** 在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳? **答:**64 - 50 = 14 推断这个包从源点到你之间有14跳。 ## 传输层 ### 实作一 熟悉 TCP 和 UDP 段结构 1. 用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。 ![image-20211124090657903](Wireshark.assets/image-20211124090657903.png) ![image-20211124090913100](Wireshark.assets/image-20211124090913100.png) Source Port源端口:53845 Destination Port目的端口:443 sequence Number序列号:14587 Acknowledgment Number确认号:55950 Checksum校验和:ox7da6 2. 用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。 ![image-20211124091529668](Wireshark.assets/image-20211124091529668.png) ![image-20211124091553756](Wireshark.assets/image-20211124091553756.png) Source Port源端口:54915 Destination Port目的端口:54915 Length长度:271 Checksum校验:0x3dc4 **问题** 由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么? **答:**传输层实现的是端到端的通信,需要源端口号与目的端口号实现两边的确认。 ### 实作二 分析 TCP 建立和释放连接 1. 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 `Follow TCP Stream`),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。 ![image-20211211141221573](Wireshark.assets/image-20211211141221573.png) 2. 请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。 ![image-20211211141344130](Wireshark.assets/image-20211211141344130.png) SYN 同步序列号,用来发起一个TCP连接 3. 请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。 ![image-20211211141537625](Wireshark.assets/image-20211211141537625.png) TCP断开连接是通过发送FIN报文,来告诉对方数据已经发送完毕,可以释放连接了。 **问题一** 去掉 `Follow TCP Stream`,即不跟踪一个 TCP 流,你可能会看到访问 `qige.io` 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么? **答:**访问网页是有多个连接组成的。每个连接传送完数据后就会断开。断开连接,由于页面已经被缓存下来,页面仍然存在。若要重新进行发送数据,就要再次进行连接。作用:实现多个用户进行访问,对业务频率不高的场合,节省通道的使用。 **问题二** 我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么? **答:**因为第二次和第三次合并,如果对方没有数据发给本端,也会发送FIN给本端,用于关闭从对方到本端的连接,这时候就可能出现ACK和FIN合在一起的情况。 ## 应用层 应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。 ### 实作一 了解 DNS 解析 1. 先使用 `ipconfig /flushdns` 命令清除缓存,再使用 `nslookup qige.io` 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。 ![image-20211211142435901](Wireshark.assets/image-20211211142435901.png) ![image-20211211142517391](Wireshark.assets/image-20211211142517391.png) 2. 你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。 ![image-20211211142620216](Wireshark.assets/image-20211211142620216.png) 3. 可了解一下 DNS 查询和应答的相关字段的含义 **答:** 16位的标志位 QR:查询/应答标志。0表示这是一个查询报文,1表示这是一个应答报文 opcode,定义查询和应答的类型。0表示标准查询,1表示反向查询(由IP地址获得主机域名),2表示请求服务器状态 AA,授权应答标志,仅由应答报文使用。1表示域名服务器是授权服务器 TC,截断标志,仅当DNS报文使用UDP服务时使用。因为UDP数据报有长度限制,所以过长的DNS报文将被截断。1表示DNS报文超过512字节,并被截断 RD,递归查询标志。1表示执行递归查询,即如果目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询,如此递归,直到获得结果并把该结果返回给客户端。0表示执行迭代查询,即如果目标DNS服务器无法解析某个主机名,则它将自己知道的其他DNS服务器的IP地址返回给客户端,以供客户端参考 RA,允许递归标志。仅由应答报文使用,1表示DNS服务器支持递归查询 zero,这3位未用,必须设置为0 rcode,4位返回码,表示应答的状态。常用值有0(无错误)和3(域名不存在) 应答字段 域名,类型,生命周期,数据长度,地址 **问题** 你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因? **答:**这与DNS的解析过程有关。 1、DNS解析过程是先从浏览器的DNS缓存中检查是否有这个网址的映射关、系,如果有,就返回IP,完成域名解析; 2、如果没有,操作系统会先检查自己本地的hosts文件是否有这个网址的映射关系,如果有,就返回IP,完成域名解析; 3、如果还没有,电脑就要向本地DNS服务器发起请求查询域名;本地DNS服务器拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话直接返回; 4、没有的话本地DNS服务器会从配置文件中读取13个根DNS服务器的地址,然后向其中一台发起请求;直到获得对应的IP为止。所以DNS解析的请求不止一个 ### 实作二 了解 HTTP 的请求和应答 1. 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 `Follow TCP Stream`),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。 ![image-20211211144247949](Wireshark.assets/image-20211211144247949.png) 2. 请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:`GET, POST`。并仔细了解请求的头部有哪些字段及其意义。 ![image-20211211144439609](Wireshark.assets/image-20211211144439609.png) 请求头(Request): Host:远程服务器的域名 Connection:keep-alive 告诉服务器当前保持活跃 User-agent:客户端的一些信息,浏览器信息 版本 Accept:text/html application/xml 告诉服务器客户端浏览器这边可以出里什么数据; Accept-Encodeing:gzip 告诉服务器我能支持什么样的压缩格式 返回头(response-header): cache-control:private/no-cache; 私有的不需要缓存/no-cache也不需要缓存 connection:keep-live; 服务器同意保持连接 content-Enconding:gzip;除去头的剩余部分压缩返回格式 content-length:内容长度 content-type:text/css;返回内容支持格式 Date: 时间 server:ngnix 服务器类型 3. 请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:`200, 304, 404` 等。并仔细了解应答的头部有哪些字段及其意义。 ![image-20211211144845091](Wireshark.assets/image-20211211144845091.png) 301 Moved Permanently 301重定向 200 成功处理了请求,一般情况下都是返回此状态码; 304 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 404 服务器找不到请求的网页。 **问题** 刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 `304` 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 `304` 应答而不是常见的 `200` 应答? **答:**第一次访问时成功收到响应,就会返回200,浏览器第二次发送请求的时候,缓存还在浏览器中,如果资源没有修改,就可以不用传送给我,就答应304,304表示自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。