文章目录
一.验证性实验
ipconfig
实作一
使用 ipconfig/all
查看自己计算机的网络配置,尽可能明白每行的意思,特别注意 IP
地址、子网掩码 Subnet Mask
、网关 Gateway
。
实作二
使用 ipconfig/all
查看旁边计算机的网络配置,看看有什么异同。
ip地址和网关不同,子网掩码相同。
问题
你的计算机和旁边的计算机是否处于同一子网,为什么?
处于同一子网,因为子网掩码相同。
ping
实作一
要测试到某计算机如 重庆交通大学 Web 服务器的连通性,可以使用 ping www.cqjtu.edu.cn
命令,也可直接使用 IP 地址。
请掌握使用该命令后屏幕显示的反馈回来信息的意思,如:TTL、时间等。
“字节=32” 表示ICMP报文中有32个字节的测试数据;
“时间” 是往返时间
"已发送=4"是发送多个秒包、"已接收=4"是收到多个回应包、"丢失=0"丢弃了多少个;
TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。
实作二
使用 ping/?
命令了解该命令的各种选项并实际使用。
实际使用
tracert
实作一
要了解到某计算机如 www.baidu.com 中间经过了哪些节点(路由器)及其它状态,可使用 tracert www.baidu.com
命令,查看反馈的信息,了解节点的个数。
可通过网站 http://ip.cn 查看这些节点位于何处,是哪个公司的,大致清楚本机到百度服务器之间的路径。
实作二
ping.pe
这个网站可以探测从全球主要的 ISP 到某站点如 https://qige.io 的线路状态,当然也包括各线路到该主机的路由情况。请使用浏览器访问 http://ping.pe/qige.io 进行了解。
问题一
tracert
能告诉我们路径上的节点以及大致的延迟等信息,那么它背后的原理是什么?本问题可结合第二部分的 Wireshark 实验进行验证。
背后的原理是利用TTl,就是帧的生命周期,要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP 已超时”的消息发回源系统。 Tracert 先发送 TTL 为 1的回应数据包,并在随后的每次发送过程将TTL递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。
问题二
在以上两个实作中,如果你留意路径中的节点,你会发现无论是访问百度还是棋歌教学网,路径中的第一跳都是相同的,甚至你应该发现似乎前几个节点都是相同的,你的解释是什么?
因为要从一个子网出到外界进行连接需要通过网关,而这个相同的网关正是这个子网的出口。
问题三
在追踪过程中,你可能会看到路径中某些节点显示为 * 号,这是发生了什么?
从该节点没有收到具体的信息反馈,才会出现*号
ARP
实作一
运行 arp -a
命令查看当前的 arp 缓存, 请留意缓存了些什么。
然后 ping
一下你旁边的计算机 IP(注意,需保证该计算机的 IP 没有出现在 arp 缓存中,或者使用 arp -d *
先删除全部缓存),再次查看缓存,你会发现一些改变,请作出解释。
ARP缓存是一个缓冲区,用来储存IP地址和MAC地址,本质就是<IP地址,MAC地址>的对应表。表中一个条目记录了网络上一个主机的IP地址和其对应的MAC地址。当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送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
命令设置其为静态类型的。
你可能会在实作三的操作中得到 “ARP 项添加失败: 请求的操作需要提升” 这样的信息,表示命令没能执行成功,你该如何解决?
进入管理员模式,提高权限后再运行
在实作三中,为何缓存中常常有网关的信息?
我们将网关或其它计算机的 arp 信息设置为静态有什么优缺点?
ARP在发数据包前会先发广播包,问谁是目的IP,然后得到对应的MAC地址,访问外网,你要先到网关那,也就要知道网关的MAC。
我们将网关或其他计算机的arp信息设置为静态优点是便于管理,特别是在根据ip地址限制网络流量的局域网中,以固定的ip地址或ip地址分组产生的流量为依据管理,可以免除在按用户方式计费时用户每次上网都必须进行的身份认证的繁琐过程。静态分配ip地址的缺点是合法用户分配的地址可能被非法盗用,不仅对网络的正常使用造成影响,同时由于被盗用的地址往往具有较高的权限,因而也容易给合法用户造成损失和潜在的安全隐患。
DHCP
实作一
一般地,我们自动获取的网络配置信息包括:IP 地址、子网掩码、网关 IP 以及 DNS 服务器 IP 等。使用 ipconfig/release
命令释放自动获取的网络配置,并用 ipconfig/renew
命令重新获取,了解 DHCP 工作过程和原理。
如果你没能成功的释放,请思考有哪些可能的原因并着手进行解决?
很可能没有开启DHCP客户端服务;解决办法是在 “ win+R ” 然后输入 “ sc config DHCP start= AUTO ” 后重启。
在Windows系统下,如果由于某种原因计算机不能获取 DHCP 服务器的配置数据,那么Windows将会根据某种算法自动配置为 169.254.x.x 这样的 IP 地址。显然,这样的 IP 以及相关的配置信息是不能让我们真正接入 Internet 的,为什么?既然不能接入 Internet,那么Winodws系统采用这样的方案有什么意义?
这样的地址是为了告诉主机,IP 地址池里面没有多余的 IP ,或者 DHCP 中继代理失效。采用这种方案的意义是如果计算机都采用了 DHCP 来获得网络配置。假如某天因 DHCP 服务器问题从而不能获得网络配置,那么我们可以查看隔壁教室计算机的配置信息来手动进行网络配置,从而使该计算机能够接入 Internet。
netstat
实作一
Windows 系统将一些常用的端口与服务记录在 C:\WINDOWS\system32\drivers\etc\services
文件中,请查看该文件了解常用的端口号分配。
实作二
使用 netstat -an
命令,查看计算机当前的网络连接状况。更多的 netstat
命令选项,可参考上面链接 4
和 5
。
DNS
实作一
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.io 8.8.8.8,当然,由于你懂的原因,这不一定会得到正确的答案。
秘籍
当我们使用浏览器上网时,或多或少的会看到一些广告。某些网站的广告是非常没有节操的,所以我们一般可以通过安装浏览器插件如 AdGuard、AdBlocker 等来拦截和过滤。
这种方法简单方便有效,不过有一定安全或隐私问题,因为该插件实时知道你访问的 URL。
假设不使用这种第三方的插件,希望自己完全控制,那么就请考虑在我们前面提到的 hosts
文件中添加 DNS 记录。有自愿者时时在维护全球正确的 DNS 记录文件
上面秘籍中我们提到了使用插件或自己修改 hosts
文件来屏蔽广告,思考一下这种方式为何能过滤广告?如果某些广告拦截失效,那么是什么原因?你应该怎样进行分析从而能够成功屏蔽它?
修改hosts文件是指将某个网站重定向到一个地址,使之无法访问达到屏蔽广告的效果。
cache
实作一
打开 Chrome 或 Firefox 浏览器,访问 https://qige.io ,接下来敲 F12
键 或 Ctrl + Shift + I
组合键打开开发者工具,选择 Network
面板后刷新页面,你会在开发者工具底部看到加载该页面花费的时间。请进一步查看哪些文件被 cache了,哪些没有。
实作二
接下来仍在 Network
面板,选择 Disable cache
选项框,表明当前不使用 cache,页面数据全部来自于 Internet,刷新页面,再次在开发者工具底部查看加载该页面花费的时间。你可比对与有 cache 时的加载速度差异。
速度变慢了
二.Wireshark 实验
数据链路层
实作一 熟悉 Ethernet 帧结构
使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。
目的MAC为Destination,源MAC为Source,类型为IPv4
你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
wireshark把尾部四个字节的校验字段给过滤了。
实作二 了解子网内/外通信时的 MAC 地址
-
ping
你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?旁边这台计算机的MAC地址。
-
然后
ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?发出帧的目的mac和返回帧的源mac是d8:c8:e9:63:aa:31,都是我主机所处网关的mac地址
-
再次
ping www.cqjtu.edu.cn
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是d8:c8:e9:63:aa:31,这个 MAC 地址是我的主机所处子网的网关MAC地址。
通过以上的实验,你会发现:
- 访问本子网的计算机时,目的 MAC 就是该主机的
- 访问非本子网的计算机时,目的 MAC 是网关的
请问原因是什么?
因为在子网之内的计算机就不需要经过网关,可以直接查询MAC地址并建立连接;而访问子网外的需要先将数据发送到网关处,然后ARP或者DNS解析得到MAC地址后到达目的子网发送到目的地址,所以无论是发送还是接受都要经过本计算机的网关。
实作三 掌握 ARP 解析过程
-
为防止干扰,先使用
arp -d *
命令清空 arp 缓存 -
ping
你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。访问的是本子网的 IP,回应的源MAC是 IP 对应的 MAC,即旁边计算机的MAC地址;目的 MAC 地址是我的主机MAC地址。
-
再次使用
arp -d *
命令清空 arp 缓存 -
然后
ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。通过以上的实验,你应该会发现,
- ARP 请求都是使用广播方式发送的
- 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
请问为什么?
1.因为在我们ping之前(抓包之前),我们首先将arp缓存清楚了,所以当我们去ping任意一台主机或网页,我们本地的arp缓存中都没有相应的MAC地址,所以需要广播寻找目的地址。2.因为在子网之内的计算机就不需要经过网关;而访问子网外的需要先将数据发送到网关处。
网络层
实作一 熟悉 IP 包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
①IP包头长度(Header Length):长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。
②IP包总长(Total Length):长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。
所以头部长度可以使得接收端计算出报头在何处结束及从何处开始读数据;总长度是为了接收方的网络层了解到传输的数据包含哪些,如果没有该部分,当数据链路层在传输时,对数据进行了填充,对应的网络层不会把填充的部分给去掉。实作二 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 中,如果路由器遇到了一个大数据包该怎么办?
会把数据包丢掉,同时会通过ICMPv6的“packet too big”且携带有本端MTU 的消息发送给源主机,源主机收到此消息后,会根据此值对其进行分片,然后再 次发送此数据。
实作三 考察 TTL 事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了
tracert
命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。请使用
tracert www.baidu.com
命令进行追踪,此时使用 Wireshark 抓包(用icmp
过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?
经过14跳,一般TTL的设置为与其最靠进的2的n次幂。
传输层
实作一 熟悉 TCP 和 UDP 段结构
-
用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
-
用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
端口的作用就是用来唯一标识这个进程。源端口标识发起通信的那个进程,目的端口标识接受通信的那个进程。有了端口号,接受到报文后才能够知道将报文发送到哪个进程。
实作二 分析 TCP 建立和释放连接
-
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上
Follow TCP Stream
),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。 -
请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
第一次握手,同步位(SYN)是1,确认位(ACK)是0;第二次握手,同步位(SYN)是1,确认位(ACK)是1;
第三次握手,同步位(SYN)是0,确认位(ACK)是1。 -
请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
确认位(ACK)仍然为1和终止控制位(FIN)变为1。
去掉 Follow TCP Stream
,即不跟踪一个 TCP 流,你可能会看到访问 qige.io
时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
它们之间的连接是属于短连接,一旦数据发送完成后,就会断开连接。虽然,断开连接,但是页面还是存在,由于页面已经被缓存下来。一旦需要重新进行发送数据,就要再次进行连接。这样的连接,是为了实现多个用户进行访问,对业务频率不高的场合,节省通道的使用,不让其长期占用通道。
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
因为第二次握手和第三次握手合并了,如果对方没有数据发给本端,那么对方也会发FIN给本端,这样ACK和FIN就可能出现在一起导致握手合并了。
应用层
应用层的协议非常的多,我们只对 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 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。 -
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:
GET, POST
。并仔细了解请求的头部有哪些字段及其意义。 -
请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:
200, 304, 404
等。并仔细了解应答的头部有哪些字段及其意义。**200* – 服务器成功返回网页
· *404* – 请求的网页不存在
· *503* – 服务器超时
三.Cisco Packet Tracer 实验
各PC的基本网络配置如下表:
机器名 | IP | 子网掩码 |
---|---|---|
PC0 | 192.168.1.1 | 255.255.255.0 |
PC1 | 192.168.1.2 | 255.255.255.0 |
PC2 | 192.168.2.1 | 255.255.255.0 |
PC3 | 192.168.2.2 | 255.255.255.0 |
构建如下拓扑结构的局域网:
-
PC0 能否
ping
通 PC1、PC2、PC3 ?PC0 能 ping 通 PC1,不能ping通PC2、PC3。
-
PC3 能否
ping
通 PC0、PC1、PC2 ?为什么?PC3 能 ping 通 PC2,不能ping通PC0、PC1。
-
将 4 台 PC 的掩码都改为
255.255.0.0
,它们相互能ping
通吗?为什么?可以,此时他们属于同一子网。
-
使用二层交换机连接的网络需要配置网关吗?为什么?
需要,因为没有网关就连接不了其他网络。
交换机接口地址列表
二层交换机是一种即插即用的多接口设备,它对于收到的帧有 3 种处理方式:广播、转发和丢弃(请弄清楚何时进行何种操作)。那么,要转发成功,则交换机中必须要有接口地址列表即 MAC 表,该表是交换机通过学习自动得到的!
仍然构建上图的拓扑结构,并配置各计算机的 IP 在同一个一个子网,使用工具栏中的放大镜点击某交换机如左边的 Switch3,选择 `MAC Table`,可以看到最初交换机的 MAC 表是空的,也即它不知道该怎样转发帧(那么它将如何处理?),用 PC0 访问(`ping`)PC1 后,再查看该交换机的 MAC 表,现在有相应的记录,请思考如何得来。随着网络通信的增加,各交换机都将生成自己完整的 MAC 表,此时交换机的交换速度就是最快的!
**如果是空的就通过广播来获取。**
路由器配置初步
我们模拟重庆交通大学和重庆大学两个学校的连接,构建如下拓扑:
现在交通大学内的各 PC 及网关相互能 `ping` 通,重庆大学也类似。但不能从交大的 PC `ping` 通重大的 PC,反之亦然,也即不能跨子网。为什么?
使用ping功能时,本地PC会首先查询本地的ARP地址映射表,如果目的IP不在ARP缓存中,则受限会查询ARP映射表。这里的是一般路由器,没有三层交换路由功能,本地电路查询ARP映射表的时候,会发出一个MAC层目的地址为路由器MAC地址的ICMP数据包,路由器收到ICMP数据包之后,经过地址过滤,发现目的IP地址不是其路由器的子网,则会将此ICMP包抛弃,不会发出ARP查询包进行ARP地址查询。所以不能ping通。
自己完整的 MAC 表,此时交换机的交换速度就是最快的!
**如果是空的就通过广播来获取。**