计算机网络实验【验证性实验,WireShark实验,CiscoPacketTracer实验】
验证性实验
ipconfig
✍ ipconfig 是微软操作系统的计算机上用来控制网络连接的一个命令行工具。它的主要用来显示当前网络连接的配置信息(/all 参数)。
实作一
使用
ipconfig/all
查看自己计算机的网络配置,尽可能明白每行的意思,特别注意 IP 地址、子网掩码Subnet Mask、网关Gateway。
- 物理地址:38-68-93-80-6B-0F。物理地址指的是电脑的MAC地址,MAC地址是识别局域网节点的标识,具有全球唯一性。
- IPv6地址:fe80::ccec:a218:b131:15d7%10。IPv6地址有128位,通常写成8组,每组为四个十六进制数的形式。
- IPv4地址:192.168.0.103。 IPV4地址有32位,通常用点分十进制表示。 用来表示电脑在局域网内的ip地址。
- 子网掩码:255.255.255.0。子网掩码也具有32位,它被用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。
- 默认网关:192.168.0.1。是电脑所在的网络的第一台主机,当要与本子网之外的子网通信时,就要把数据发给网关,由网关完成通信。
- DNS:192.168.1.1。DNS指的是域名服务,是一项互联网上的服务,它可以理解成一个域名和IP地址相互映射的分布式数据库,它的功能是完成域名到IP地址的转换。
实作二
使用
ipconfig/all
查看旁边计算机的网络配置,看看有什么异同。
在linux系统中使用ifconfig
命令,查看ens33网卡相关信息
✎ 问题
你的计算机和旁边的计算机是否处于同一子网,为什么?
回答:
本机的IP地址为192.168.24.1,虚拟机的IP地址为192.168.24.16。子网掩码均为255.255.255.0,相与所得到的网络号相同,所以他们是处于同一子网的。
ping
✍ PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序 。ping 是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。
实作一
要测试到某计算机如 重庆交通大学 Web 服务器的连通性,可以使用
ping www.cqjtu.edu.cn
命令,也可直接使用 IP地址。
请掌握使用该命令后屏幕显示的反馈回来信息的意思,如:TTL、时间等。
- 字节:数据包的大小,单位为字节。
- 时间:是指数据包返回所需要的时间,单位为毫秒,时间越小,说明连接这个地址的速度越快。
- TTL(Time To Live):表示DNS记录在DNS服务器上存在的时间,它是IP协议包的一个值,告诉路由器该数据包何时需要被丢弃。一般经过一跳,TTL值会减少1。
实作二
使用
ping/?
命令了解该命令的各种选项并实际使用。
✎TroubleShooting
假设你不能 ping 通某计算机或 IP,但你确定该计算机和你之间的网络是连通的,那么可能的原因是什么?该如何处理能保证 ping 通?
回答:
原因可能有:
- 网络协议配置问题
- 网卡出现问题或是线路出现问题
- 被防火墙拦截
如何保证能够ping通:
- 先ping127.0.0.1,如果不能ping通,说明问题在主机身上。那么我们需要检查本机的网络配置是否出现问题。
- ping旁边计算机的ip,如果不能ping通,说明了本机的网络出口到交换机出现了问题,那么我们需要检查本机网卡到交换机的连线等是否出现问题。
- ping网关地址,如果不能ping通,说明问题出现在网关上。
- ping一下外网地址,如百度等。如果不能ping通,说明问题出现在网关以外。
✎ TroubleShooting
假设在秘籍中进行的网络排查中,ping 百度的 IP 即
ping 14.215.177.39
没问题,但 ping 百度的域名即ping www.baidu.com
不行,那么可能的原因是什么?如何进行验证和解决?另外,经常有同学问到的:“能上 QQ,但不能上网” 跟这个问题的原因是相似的。
回答:
如果能ping通IP但是无法ping通域名,说明是域名解析时出现了问题,可以使用ipconfig/flushdns
清空dns缓存,然后更改dns为8.8.8.8或114.114.114.114
tracert
✍ TRACERT (Trace Route 的组合缩写),也称为路由追踪,该命令行程序可用于跟踪 Internet 协议 (IP) 数据包传送到目标地址时经过的路径。
实作一
要了解到某计算机如 www.baidu.com 中间经过了哪些节点(路由器)及其它状态,可使用
tracert www.baidu.com
命令,查看反馈的信息,了解节点的个数。
可通过网站http://ip.cn
查看这些节点位于何处,是哪个公司的,大致清楚本机到百度服务器之间的路径。
实作二
ping.pe
这个网站可以探测从全球主要的 ISP 到某站点如 https://qige.io的线路状态,当然也包括各线路到该主机的路由情况。请使用浏览器访问 http://ping.pe/qige.io 进行了解。
✎问题一
tracert 能告诉我们路径上的节点以及大致的延迟等信息,那么它背后的原理是什么?本问题可结合第二部分的 Wireshark实验进行验证。
回答:
tracert是路由跟踪程序,用于确定 IP数据包访问目标所采取的路径。
- tracert先发出一个TTL值为1的数据包
- 当到达路径上第一个路由器时,路由器会将TTL的值减1
- 此时的TTL为0,该路由器将此数据包丢弃,并向源地址返回一个ICMP超时通知
- tracert再发送另一个TTL为2的数据包
- 第一个路由器会将此数据包转发给第二个路由器
- 到达第二个路由器时,TTL为0,第二个路由器返回一个ICMP超时通知
- tracert会重复这个动作,每次的TTL加1,直到到达目的地或者确定目标主机不可到达为止
✎ 问题二
在以上两个实作中,如果你留意路径中的节点,你会发现无论是访问百度还是棋歌教学网,路径中的第一跳都是相同的,甚至你应该发现似乎前几个节点都是相同的,你的解释是什么?
回答:
数据发出后经过的第一跳为本地交换机。之后才通过交换机传输到本机所在的通信子网。
✎ 问题三
在追踪过程中,你可能会看到路径中某些节点显示为 * 号,这是发生了什么?
回答:
由于安全问题或网络问题而没有收到回应,所以会显示为*号。
ARP
✍ ARP(Address Resolution Protocol)即地址解析协议,是用于根据给定网络层地址即 IP
地址,查找并得到其对应的数据链路层地址即 MAC地址的协议。 ARP 协议定义在 1982 年的 RFC 826。
实作一
运行
arp -a
命令查看当前的 arp 缓存, 请留意缓存了些什么。然后
ping
一下你旁边的计算机 IP(注意,需保证该计算机的 IP 没有出现在 arp 缓存中,或者使用arp -d *
先删除全部缓存),再次查看缓存,你会发现一些改变,请作出解释。
清空缓存且在ping其他主机之前
ping通以后,可以发现多了一条记录
ping通虚拟机的IP地址以后再次运行arp -a指令,对比发现该IP地址和MAC地址都已缓存至本机ARP中。
下次再请求目标主机时,会直接查询ARP缓存,而无须再发送ARP请求,从而节约了网络资源。
实作二
请使用
arp /?
命令了解该命令的各种选项。
实作三
一般而言,arp 缓存里常常会有网关的缓存,并且是动态类型的。
假设当前网关的 IP 地址是192.168.0.1
,MAC 地址是5c-d9-98-f1-89-64
,请使用arp -s 192.168.0.1 5c-d9-98-f1-89-64
命令设置其为静态类型的。
第一次执行失败:
🗣 TroubleShooting
你可能会在实作三的操作中得到 “ARP 项添加失败: 请求的操作需要提升” 这样的信息,表示命令没能执行成功,你该如何解决?
回答:
使用管理员身份打开cmd执行该命令。
使用管理员身份打开cmd后成功执行
使用arp -a指令查看发现添加成功
✎ 问题
在实作三中,为何缓存中常常有网关的信息?
回答:
缓存中常常有网关的信息是因为我们在通信时,大多数数据都从网关转出,将网关信息存储起来,方便路由时查表及下次使用。
✎ 问题
我们将网关或其它计算机的arp信息设置为静态有什么优缺点?
回答:
- 优点:静态IP的地址是固定的,利于管理,并且可以免除进行验证的繁琐操作。
- 缺点:有安全隐患,由于静态IP不会进行验证,因此别人可以将自己的ip伪造成arp列表中的某个ip地址,盗用你的ip地址,轻则影响网络使用,重则会造成消息泄露等安全隐患。
DHCP
✍ DHCP(Dynamic Host Configuration Protocol)即动态主机配置协议,是一个用于 IP网络的网络协议,位于 OSI 模型的应用层,使用 UDP 协议工作,主要有两个用途:
- 用于内部网或网络服务供应商自动分配 IP 地址给用户
- 用于内部网管理员对所有电脑作中央管理
简单的说,DHCP可以让计算机自动获取/释放网络配置。
实作一
一般地,我们自动获取的网络配置信息包括:IP 地址、子网掩码、网关 IP 以及 DNS 服务器 IP 等。使用
ipconfig/release
命令释放自动获取的网络配置,并用ipconfig/renew
命令重新获取,了解 DHCP工作过程和原理。
🗣 TroubleShooting
如果你没能成功的释放,请思考有哪些可能的原因并着手进行解决?
回答:
- 如果权限不够就使用管理员身份打开CMD。
- 如果还是不行就该考虑是否是网卡出现了问题,可以尝试重新安装网卡。
✎ 问题
在Windows系统下,如果由于某种原因计算机不能获取 DHCP 服务器的配置数据,那么Windows将会根据某种算法自动配置为169.254.x.x 这样的 IP 地址。显然,这样的 IP 以及相关的配置信息是不能让我们真正接入 Internet 的,为什么?既然不能接入 Internet,那么Winodws系统采用这样的方案有什么意义?
回答:
自动配置的IP地址和信息只是短暂性的解决计算机不能获取 DHCP 服务器的配置数据的问题,要真正的接入Internet还是得本身计算机的正确IP地址。这样做是为了防止IP地址冲突。
netstat
✍ 无论是使用 TCP 还是 UDP,任何一个网络服务都与特定的端口(Port Number)关联在一起。因此,每个端口都对应于某个通信协议/服务。
netstat(Network Statistics)是在内核中访问网络连接状态及其相关信息的命令行程序,可以显示路由表、实际的网络连接和网络接口设备的状态信息,以及与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络服务运行状况。
实作一
Windows 系统将一些常用的端口与服务记录在
C:\WINDOWS\system32\drivers\etc\services
文件中,请查看该文件了解常用的端口号分配。
常用端口号 20/21:FTP 80:HTTP 443:HTTPS 3306:MySQL
实作二
使用
netstat -an
命令,查看计算机当前的网络连接状况。更多的 netstat 命令选项,可参考上面链接 4 和 5 。
DNS
✍ DNS(Domain Name System)即域名系统,是互联网的一项服务。它作为将域名和 IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 的 53 号端口。
实作一
Windows 系统将一些固定的/静态的 DNS 信息记录在
C:\WINDOWS\system32\drivers\etc\hosts
文件中,如我们常用的 localhost 就对应 127.0.0.1 。请查看该文件看看有什么记录在该文件中。
实作二
解析过的 DNS 记录将会被缓存,以利于加快解析速度。请使用
ipconfig /displaydns
命令查看。我们也可以使用ipconfig /flushdns
命令来清除所有的 DNS 缓存。
实作三
使用
nslookup qige.io
命令,将使用默认的 DNS 服务器查询该域名。当然你也可以指定使 CloudFlare(1.1.1.1)或 Google(8.8.8.8) 的全球 DNS 服务器来解析,如:nslookup qige.io8.8.8.8,当然,由于你懂的原因,这不一定会得到正确的答案。
🗣 TroubleShooting
上面秘籍中我们提到了使用插件或自己修改 hosts文件来屏蔽广告,思考一下这种方式为何能过滤广告?如果某些广告拦截失效,那么是什么原因?你应该怎样进行分析从而能够成功屏蔽它?
回答:
通过修改hosts文件可以将已知的广告服务器重定向到无广告的地址。
如果某些广告拦截失效,可能是因为hosts文件被修改,需要在hosts中进行修改它的新域名。
cache
✍ cache 即缓存,是 IT 领域一个重要的技术。我们此处提到的 cache 主要是浏览器缓存。
浏览器缓存是根据 HTTP报文的缓存标识进行的,是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷。
实作一
打开 Chrome 或 Firefox 浏览器,访问 https://qige.io ,接下来敲
F12
键 或Ctrl + Shift + I
组合键打开开发者工具,选择 Network 面板后刷新页面,你会在开发者工具底部看到加载该页面花费的时间。请进一步查看哪些文件被 cache了,哪些没有。
实作二
接下来仍在 Network 面板,选择 Disable cache 选项框,表明当前不使用 cache,页面数据全部来自于 Internet,刷新页面,再次在开发者工具底部查看加载该页面花费的时间。你可比对与有 cache 时的加载速度差异。
Wireshark 实验
数据链路层
实作一 熟悉 Ethernet 帧结构
使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。
Ethernet 帧的结构:
- 目的 MAC:78:eb:14:33:d4:e8
- 源 MAC:38:68:93:80:6b:0f
- 类型:IPv4 (0x0800)
- 字段:Destination, Source, Type
✎ 问题
你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
回答:
Wireshark 等软件在抓包时已经去掉了前导同步码、FCS之外的数据,Wireshark 把8字节的前序和4字节的FCS都给过滤了。之后利用校验码CRC校验,正确才会开始抓包,因此,Wireshark 中所显示的报文长度是包含14字节以太类型头,没有校验字段。
实作二 了解子网内/外通信时的 MAC 地址
- ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
- 然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
- 再次 ping www.cqjtu.edu.cn(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
PING虚拟机
ping qige.io
✎ 问题
通过以上的实验,你会发现:
- 访问本子网的计算机时,目的 MAC 就是该主机的
- 访问非本子网的计算机时,目的 MAC 是网关的 请问原因是什么?
回答:
- 访问本子网的计算机时,可以直接到达,传输数据都是在本子网里进行,所以目的MAC就是该主机。
- 访问外网的时候,两个不同通信子网的主机之间需要通信,数据包就需要离开本通信子网,通过 mac 地址送到网关处,然后出了网关再通过 IP 地址进行查找;接收到非子网的计算机返回的数据都是先到网关,网关再根据目的 mac 送到本机。
实作三 掌握 ARP 解析过程
- 为防止干扰,先使用
arp -d *
命令清空 arp 缓存- ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
- 再次使用
arp -d *
命令清空 arp 缓存- 然后
ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
可以看到,请求的目的MAC是:ff:ff:ff:ff:ff:ff(广播),回复的是本子网的网关MAC地址。
✎ 问题
通过以上的实验,你应该会发现, ARP 请求都是使用广播方式发送的 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。 请问为什么?
回答:
当本机访问的是本子网的计算机,数据包无需离开本通信子网, ARP 解析将也是在本子网里进行,所以ARP解析得到是对方主机的MAC物理地址;
当本机访问的是非本子网的计算机,此时两个不同通信子网的主机之间需要通信,数据包就需要离开本通信子网,这里就涉及到数据包在两个通信子网的传输,传输数据要离开本通信子网,ARP 解析就势必要经过网关,因此,该ARP 解析得到的目的MAC物理地址就是本网关的物理地址。
网络层
实作一 熟悉 IP 包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
版本: IPV4
头部长度: 20
总长度: 1500
TTL: 64
协议: ICMP
✎ 问题
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
回答:
头部长度可以使得接收端计算出报头在何处结束及从何处开始读数据。总长度是为了接收方的网络层了解到传输的数据包含哪些,如果没有该部分,当数据链路层在传输时,对数据进行了填充,对应的网络层不会把填充的部分给去掉。
实作二 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中,如果路由器遇到了一个大数据包该怎么办?
回答:
由于在 IPv6中分段只能在源与目的地上执行,不能在路由器上进行。因此当数据包过大时,路由器就会直接丢弃该数据包包,并向发送端发回一个"分组太大"的ICMP差错报文,之后发送端就会使用较小长度的IP数据报重发数据。
实作三 考察 TTL 事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
tracert先发送一个TTL为1的包,位于路径上的路由器收到后将TTL减1,该路由器将此数据包丢弃,并向源地址返回一个ICMP超时通知,随后tracert会将每次的TTL加1,重复该动作直到到达目的地或者确定目标主机不可到达为止。
✎ 问题
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL
的值为 50,那么可以推断这个包从源点到你之间有多少跳?
回答:
64-50 = 14
传输层
实作一 熟悉 TCP 和 UDP 段结构
用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。 用Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
TCP
源端口:13680
目的端口: 80
序列号: 1
确认号: 1
标志位:
- URG标志:表示紧急指针(urgent pointer)是否有效。
- ACK标志:表示确认号是否有效。我们称携带ACK标识的TCP报文段为确认报文段。
- PSH标志:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP接收缓冲区中)。
- RST标志:表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。
- SYN标志:表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文段。
- FIN标志:表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。
UDP
源端口: 8000
目的端口: 60442
长度: 95
✎ 问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
回答:
源端口来表示发送终端的某个应用程序,目的端口来表示接收终端的某个应用程序。端口号就是来标识终端的应用程序,从而实现应用程序之间的通信。
实作二 分析 TCP 建立和释放连接
- 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
- 请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
- 请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
三次握手
第一次握手,此时SYN为1
告诉对方要建立连接进行通信。
第二次握手,此时SYN为1,ACK为1
对方收到我的请求后,发送的确认回复
第三次握手,此时SYN为0,ACK为1
本机如果收到了对方的确认消息之后,再发出一个确认消息告诉对方。
四次挥手
第一次,客服端打算断开链接请求,向服务器发送FIN报文,此时FIN为1,SEQ为98
第二次
服务器收到客户端发来的FIN报文后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号,此时的ACK=SEQ+1=99。
第三次
服务器也打算断开连接,向客户端发送FIN报文,之后服务器进入LASK_ACK状态,等待客户端的确认。
服务器的连接释放(FIN)报文段的FIN=1,ACK=1,ack=99。
第四次
客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1作为确认序号ack。
之后客户端进入TIME_WAIT(时间等待)状态,服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。
✎ 问题一
去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
回答:
这种连接是属于短连接,一旦数据发送完成后,就会断开连接。页面由于被缓存下来的原因,页面还是存在。一旦需要重新进行发送数据,就要再次进行连接。这种连接是为了实现多个用户进行访问,节省通道的使用,不让其长期占用通道。
✎ 问题二
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
回答:
客户端向服务端发送断开连接的请求为第一次挥手,服务端向客户端回复同意断开为第二次,然后服务端向客户端发送断开的请求为第三次挥手,客户端向服务端回复同意断开连接为第四次挥手。三次挥手是将服务器向客户端发送断开连接和回复同意断开连接合成一次挥手,其他两次挥手不变。也就是说,如果对方也没有数据发给本端,那么对方也会发送FIN给本端,使得二三次挥手合并为一次。
应用层
实作一 了解 DNS 解析
- 先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用Wireshark 任意抓包(可用 dns 过滤)。
- 你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
- 可了解一下 DNS 查询和应答的相关字段的含义
✎ 问题
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
回答:
为了使服务器的负载得到平衡,网站一般设有多台服务器。这些服务器的IP地址不一样,但它们的域名却是相同的。这样,不同的访问者访问就可能得到不同的结果。这样可以减轻服务器压力。
实作二 了解 HTTP 的请求和应答
- 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
- 请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。
- 请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。
常见请求头:
Accept:告诉WEB服务器自己接受什么介质类型
Content-Type:WEB 服务器告诉浏览器自己响应的对象的类型
Content-Length:WEB 服务器告诉浏览器自己响应的对象的长度
Cache-Control:用来指示缓存系统(服务器上的,或者浏览器上的)应该怎样处理缓存
Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号 POST:请求的方式,其中包括URI和版本
常见的状态码:
- 1xx:表示临时响应并需要请求者继续执行操作的状态码。
- 2xx:表示成功处理了请求的状态码。 200:服务器已成功处理了请求。
- 3xx:针对请求,服务器可执行多种操作。
- 4xx:这些状态码表示请求可能出错,妨碍了服务器的处理。
- 401:请求要求身份验证。
- 403:服务器拒绝请求。 404:服务器找不到请求的网页。
- 405:禁用请求中指定的方法。
- 5xx:这些状态码表示服务器在处理请求时发生内部错误。
- 500:服务器遇到错误,无法完成请求。
- 502:服务器作为网关或代理,从上游服务器收到无效响应。
- 503:服务器目前无法使用。
- 504:服务器作为网关或代理,但是没有及时从上游服务器收到请求。
✎ 问题
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?
回答:
浏览器中的缓存,可以直接在缓存区获取到需要的内容,不需要服务器在回复对应的内容,可以减少服务器的一些工作,减小开销。采用200应答就是要完全的将内容发送给客服端,这个会增加服务器的一些开销等。
CPT实验
直接连接两台 PC 构建 LAN
用交换机构建 LAN
✎ 问题
1.PC0 能否 ping 通 PC1、PC2、PC3 ?
2.PC3 能否 ping 通 PC0、PC1、PC2 ?为什么?
3.将 4 台 PC 的掩码都改为 255.255.0.0 ,它们相互能 ping 通吗?为什么?
4.使用二层交换机连接的网络需要配置网关吗?为什么?
回答:
- PC0能ping通PC1,但不能ping通PC2、PC3。
- PC0能ping通PC2,但不能ping通PC0、PC1。
- 能ping通。掩码为255.255.255.0时,PC0、PC1和PC2、PC3不是同一局域网,不能互通。而掩码改为255.255.0.0,PCv之间属于同一局域网下,可以互通。
- 需要,在二层交换机配置网关网络互联。没有网关,本机所辖主机,无法与其它网络通信,所以需要网关。
✎ 试一试
集线器 Hub 是工作在物理层的多接口设备,它与交换机的区别是什么?请在 CPT 软件中用 Hub 构建网络进行实际验证。
回答:
集线器Hub是工作在物理层,而交换机则是工作在物理层和数据链路层。两种工作的区域不同。
交换机接口地址列表
ping后的MAC表:
生成树协议(Spanning Tree Protocol)
这是初始时的状态。我们可以看到交换机之间有回路,这会造成广播帧循环传送即形成广播风暴,严重影响网络性能。
随后,交换机将自动通过生成树协议(STP)对多余的线路进行自动阻塞(Blocking),以形成一棵以 Switch1为根(具体哪个是根交换机有相关的策略)的具有唯一路径树即生成树!
经过一段时间,随着 STP 协议成功构建了生成树后,Switch3 的两个接口当前物理上是连接的,但逻辑上是不通的,处于Blocking状态(桔色)如下图所示:
在网络运行期间,假设某个时候 Switch0 与 Switch3 之间的物理连接出现问题(将 Switch0 与 Switch3 的连线剪掉),则该生成树将自动发生变化。Switch3 上方先前 Blocking 的那个接口现在活动了(绿色),但下方那个接口仍处于 Blocking 状态(桔色)。如下图所示:
路由器配置初步
拓扑图中路由器各接口配置数据如下:
交通大学路由器基本配置如下:
以太网口:
Router>enable // 从普通模式进入特权模式
Router#configure terminal // 进入全局配置模式
Router(config)#interface f0/0 // 进入配置以太网口模式
Router(config-if)#ip address 192.168.1.1 255.255.255.0 // 配置该接口的 IP
Router(config-if)#no shutdown // 激活接口
Router(config-if)#^z // 直接退到特权模式
Router#
广域网口:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#int s0/0 // 进入配置广域网口模式
Router(config-if)#ip address 192.168.2.1 255.255.255.0 //配置该接口的 IP
Router(config-if)#clock rate 64000 // 其为 DCE 端,配置时钟频率
Router(config-if)#no shutdown // 激活接口
Router(config-if)#^z // 直接退到特权模式
Router#
重庆大学路由器基本配置如下:
以太网口:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#int f0/0 // 进入配置以太网口模式
Router(config-if)#ip address 192.168.3.1 255.255.255.0 // 配置该接口的 IP
Router(config-if)#no shutdown // 激活接口
Router(config-if)#^z // 直接退到特权模式
Router#
广域网口:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#int s0/0 // 进入配置广域网口模式
Router(config-if)#ip address 192.168.2.2 255.255.255.0 //配置该接口的 IP
Router(config-if)#no shutdown // 激活接口
Router(config-if)#^z // 直接退到特权模式
Router#
静态路由
交通大学路由器静态路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#ip route 192.168.3.0 255.255.255.0 192.168.2.2 // 告诉交通大学路由器到 192.168.3.0 这个网络的下一跳是 192.168.2.2
Router(config)#exit //退到特权模式
Router#show ip route //查看路由表
重庆大学路由器静态路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#ip route 192.168.1.0 255.255.255.0 192.168.2.1 // 告诉重庆大学路由器到 192.168.1.0 这个网络的下一跳是 192.168.2.1
Router(config)#exit //退到特权模式
Router#show ip route //查看路由表
查看路由表你可看到标记为 S 的一条路由,S 表示 Static 。
至此,这些 PC 能全部相互 ping 通!
动态路由 RIP
清除静态路由配置:
直接关闭路由器电源。相当于没有保存任何配置,然后各接口再按照前面基本配置所述重新配置 IP 等参数(推荐此方法,可以再熟悉一下接口的配置命令);
使用 no 命令清除静态路由。在全局配置模式下,交通大学路由器使用:no ip route 192.168.3.0 255.255.255.0 192.168.2.2,
重庆大学路由器使用:no ip route192.168.1.0 255.255.255.0 192.168.2.1 。相当于使用 no 命令把刚才配置的静态路由命令给取消。
交通大学路由器 RIP 路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#router rip // 启用 RIP 路由协议,注意是 router 命令
Router(config-router)#network 192.168.1.0 // 网络 192.168.1.0 与我直连
Router(config-router)#network 192.168.2.0 // 网络 192.168.2.0 与我直连
Router(config-router)#^z //直接退到特权模式
Router#show ip route //查看路由表
重庆大学路由器 RIP 路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#router rip // 启用RIP路由协议,注意是 router 命令
Router(config-router)#network 192.168.3.0 // 网络 192.168.3.0 与我直连
Router(config-router)#network 192.168.2.0 // 网络 192.168.2.0 与我直连
Router(config-router)#^z //直接退到特权模式
Router#show ip route //查看路由表
查看路由表你可看到标记为 R 的一条路由,R 表示 RIP 。
至此,这些 PC 也能全部相互 ping 通!
动态路由 OSPF
清除 RIP 路由配置: 直接关闭路由器电源。相当于没有保存任何配置,然后各接口再按照前面基本配置所述重新配置 IP 等参数 使用 no 命令清除 RIP 路由。在全局配置模式下,各路由器都使用:no router rip 命令进行清除
交通大学路由器 OSPF 路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#router ospf 1 // 启用 OSPF 路由协议,进程号为1(可暂不理会进程号概念)
Router(config-router)#network 192.168.1.0 0.0.0.255 area 0 // 自治域0中的属于 192.168.1.0/24 网络的所有主机(反向掩码)参与 OSPF
Router(config-router)#network 192.168.2.0 0.0.0.255 area 0 // 自治域0中的属于 192.168.2.0/24 网络的所有主机(反向掩码)参与 OSPF
Router(config-router)#^z //直接退到特权模式
Router#show ip route //查看路由表
重庆大学路由器 OSPF 路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#router ospf 1 // 启用 OSPF 路由协议,进程号为1
Router(config-router)#network 192.168.3.0 0.0.0.255 area 0 // 自治域0中的属于 192.168.3.0/24 网络的所有主机(反向掩码)参与 OSPF
Router(config-router)#network 192.168.2.0 0.0.0.255 area 0 // 自治域0中的属于 192.168.2.0/24 网络的所有主机(反向掩码)参与 OSPF
Router(config-router)#^z //直接退到特权模式
Router#show ip route //查看路由表
查看路由表你可看到标记为 O 的一条路由,O 表示 OSPF 。
至此,这些 PC 能全部相互 ping 通!
基于端口的网络地址翻译 PAT
我们仍然使用重庆交通大学和重庆大学两个学校的拓扑进行 PAT 实验。我们需要保证两个学校的路由已经配置成功,无论使用静态路由还是动态路由,以下我们给出完整的配置过程:设定这两个学校的路由器使用 OSPF 协议,模拟交通大学使用内部 IP 地址(192.168.1.0/24),模拟重庆大学使用外部 IP 地址(8.8.8.0/24),两个路由器之间使用外部 IP 地址(202.202.240.0/24),在交通大学的出口位置即广域网口实施 PAT。
交通大学路由器接口配置如下:
以太网口:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#int f0/0 // 进入配置以太网口模式
Router(config-if)#ip address 192.168.1.1 255.255.255.0 // 配置 IP
Router(config-if)#no shutdown // 激活接口
广域网口:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#int s0/0 // 进入配置广域网口模式
Router(config-if)#ip address 202.202.240.1 255.255.255.0 //配置 IP
Router(config-if)#clock rate 64000 // 其为 DCE 端,配置时钟频率
Router(config-if)#no shutdown // 激活接口
重庆大学路由器接口配置如下:
以太网口:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#int f0/0 // 进入配置以太网口模式
Router(config-if)#ip address 8.8.8.1 255.255.255.0 // 配置 IP
Router(config-if)#no shutdown // 激活接口
广域网口:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#int s0/0 // 进入配置广域网口模式
Router(config-if)#ip address 202.202.240.2 255.255.255.0 // 配置 IP
Router(config-if)#no shutdown // 激活接口
交通大学路由器 OSPF 路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#router ospf 1 // 启用 OSPF 路由协议,进程号为1(可暂不理会进程号概念)
Router(config-router)#network 192.168.1.0 0.0.0.255 area 0 // 自治域0中的属于192.168.1.0/24网络的所有主机(反向掩码)参与 OSPF
Router(config-router)#network 202.202.240.0 0.0.0.255 area 0 // 自治域0中的属于202.202.240.0/24网络的所有主机(反向掩码)参与 OSPF
重庆大学路由器 OSPF 路由配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#router ospf 1 // 启用 OSPF 路由协议,进程号为1
Router(config-router)#network 202.202.240.0 0.0.0.255 area 0 // 自治域0中的属于202.202.240.0/24网络的所有主机(反向掩码)参与 OSPF
Router(config-router)#network 8.8.8.0 0.0.0.255 area 0 // 自治域0中的属于8.8.8.0/24网络的所有主机(反向掩码)参与 OSPF
此时,这些 PC 能全部相互 ping 通!如在交通大学内部使用 PC0(192.168.1.2)来 ping 重庆大学的PC2(8.8.8.2)应该成功。
下面我们将重庆大学的路由器看着 Internet 中的骨干路由器,那么这些路由器将不会转发内部/私有 IP 地址的包(直接丢弃)。我们通过在重庆大学路由器上实施访问控制 ACL ,即丢弃来自交通大学(私有 IP 地址)的包来模拟这个丢包的过程。
重庆大学路由器丢包的配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#access-list 1 deny 192.168.1.0 0.0.0.255 // 创建 ACL 1,丢弃/不转发来自 192.168.1.0/24 网络的所有包
Router(config)#access-list 1 permit any // 添加 ACL 1 的规则,转发其它所有网络的包
Router(config)#int s0/0 // 配置广域网口
Router(config-if)#ip access-group 1 in // 在广域网口上对进来的包实施 ACL 1 中的规则,实际就是广域网口如果收到来自 192.168.1.0/24 IP的包即丢弃
此时,再使用交通大学内部的 PC0(192.168.1.2)来 ping 重庆大学的 PC2(8.8.8.2)就不成功了,会显示目的主机不可到达(Destination host unreachable)信息。
交通大学路由器 PAT 配置:
Router>en // 从普通模式进入特权模式
Router#conf t // 进入全局配置模式
Router(config)#access-list 1 permit 192.168.1.0 0.0.0.255 // 创建 ACL 1,允许来自 192.168.1.0/24 网络的所有包
Router(config)#ip nat inside source list 1 interface s0/0 overload // 来自于 ACL 中的 IP 将在广域网口实施 PAT
Router(config)#int f0/0 // 配置以太网口
Router(config-if)#ip nat inside // 配置以太网口为 PAT 的内部
Router(config)#int s0/0 // 配置广域网口
Router(config-if)#ip nat outside // 配置广域网口为 PAT 的外部
现在,再次使用交通大学内部的 PC0(192.168.1.2)来 ping 重庆大学的PC2(8.8.8.2)则OK。
虚拟局域网 VLAN
各 VLAN 下 PC 的网络配置及连接的交换机接口如下表:
PC0(ip 192.168.0.2)与PC1(ip 192.168.0.3)在同一vlan(vlan 10)内,可以ping通,PC0(ip 192.168.0.2) 与PC5(ip 192.168.2.2)不在同一vlan,ping不通。
虚拟局域网管理 VTP
3560 VTP Server 配置:
Switch>en
Switch#conf t
Switch(config)#hostname 3560 // 更改交换机名称(可选)
3560(config)#vtp domain cqjtu // 设置 VTP 域名称为 cqjtu
3560(config)#vtp mode server // 设置其为 VTP 服务器模式
3560(config)#vlan 2 // 新建VLAN 2
3560(config-vlan)#name computer // 设置 VLAN 2 的别名(可选)
3560(config-vlan)#exit
3560(config)#vlan 3 // 再建 VLAN 3
3560(config-vlan)#name communication //设置 VLAN 2 的别名(可选)
3560(config-vlan)#exit
3560(config)#int vlan 2 // 配置接口 VLAN 2,它将是该子网(左边)的网关
3560(config-if)#ip address 192.168.1.1 255.255.255.0
3560(config-if)#exit
3560(config)#int vlan 3 // 配置接口 VLAN 3,它将是该子网(右边)的网关
3560(config-if)#ip address 192.168.2.1 255.255.255.0
2960A(左边) VTP Client 配置:
Switch>en
Switch#conf t
Switch(config)#hostname 2960A // 更改交换机名称(可选)
2960A(config)#vtp domain cqjtu // 加入名为 cqjtu 的 VTP 域
2960A(config)#vtp mode client // 设置模式为 VTP 客户
2960A(config)#int g0/1 // 配置与核心交换机 3560 连接的 g0/1 千兆接口
2960A(config-if)#switchport mode trunk // 设置该接口为中继(trunk)模式
2960A(config-if)#switchport trunk allowed vlan all // 允许为所有的 VLAN 中继
2960A(config-if)#exit
2960A(config)#int f0/1 // 配置接口 1
2960A(config-if)#switchport mode access // 设置该接口为正常访问模式
2960A(config-if)#switchport access vlan 2 // 将接口划分到 VLAN 2
2960A(config-if)#exit
2960A(config)#int f0/2 // 配置接口 2
2960A(config-if)#switchport mode access // 设置该接口为正常访问模式
2960A(config-if)#switchport access vlan 3 // 将接口划分到 VLAN 3
2960B(右边) VTP Client 配置:
Switch>en
Switch#conf t
Switch(config)#hostname 2960B // 更改交换机名称(可选)
2960B(config)#vtp domain cqjtu // 加入名为 cqjtu 的 VTP 域
2960B(config)#vtp mode client // 设置模式为 VTP 客户
2960B(config)#int g0/1 // 配置与核心交换机 3560 连接的 g0/1 千兆接口
2960B(config-if)#switchport mode trunk // 设置该接口为中继(trunk)模式
2960B(config-if)#switchport trunk allowed vlan all // 允许为所有的 VLAN 中继
2960B(config-if)#exit
2960B(config)#int f0/1 // 配置接口 1
2960B(config-if)#switchport mode access // 设置该接口为正常访问模式
2960B(config-if)#switchport access vlan 2 // 将接口划分到 VLAN 2
2960B(config-if)#exit
2960B(config)#int f0/2 // 配置接口 2
2960B(config-if)#switchport mode access // 设置该接口为正常访问模式
2960B(config-if)#switchport access vlan 3 // 将接口划分到 VLAN 3
✎ 试一试
使用 PC0(192.168.1.2) ping PC1(192.168.2.2) 的结果如何?使用 PC0 ping PC2
的结果如何?想想为什么?
PC0可以ping通PC2,但不能ping通PC1,虽然PC0和PC1在同一交换机下,但他们不处在同一vlan。
VLAN 间的通信
3560 交换机配置:
3560>en
3560#conf t
3560(config)#int g0/1 // 配置连接左边 2960A 交换机的接口
3560(config-if)#switchport trunk encapsulation dot1q // 封装 VLAN 协议
3560(config-if)#switchport mode trunk // 设置为中继模式
3560(config-if)#switchport trunk allowed vlan all // 在所有 VLAN 间转发
3560(config-if)#exit
3560(config)#int g0/2 // 配置连接右边 2960B 交换机的接口
3560(config-if)#switchport trunk encapsulation dot1q //封装 VLAN 协议
3560(config-if)#switchport mode trunk // 设置为中继模式
3560(config-if)#switchport trunk allowed vlan all // 在所有 VLAN 间转发
3560(config-if)#exit
3560(config)#ip routing // 启用路由转发功能
✎ 试一试
现在再使用 PC0(192.168.1.2) ping PC1(192.168.2.2) 的结果如何?使用 PC0 ping PC2
的结果如何?