一、验证性实验
ipconfig /all
实作一
ipconfig 是微软操作系统的计算机上用来控制网络连接的一个命令行工具。它的主要用来显示当前网络连接的配置信息(/all 参数)。下面是一些运行结果
实作二
问题
你的计算机和旁边的计算机是否处于同一子网,为什么?
回答
是处于同一子网,因为ip地址在同一个网关内
ping
实作一
要测试到某计算机如 重庆交通大学 Web 服务器的连通性,可以使用 ping www.cqjtu.edu.cn 命令,也可直接使用 IP 地址。
可以ping通
TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量,TTL一般表示在到达目的地址时能经过的路由器的个数,当TTL=0时,路由器将丢弃该包 并返回一个ICMP报文给最初的发送者
实作二
使用 ping/? 命令了解该命令的各种选项并实际使用。
无限ping百度![](https://i-blog.csdnimg.cn/blog_migrate/e45a63b231cb64277c0cc768e72e5c0c.png)
trouble shooting
假设你不能 ping 通某计算机或IP,但你确定该计算机和你之间的网络是连通的,那么可能的原因是什么?该如何处理能保证 ping 通?
答:有些路由器端口不允许用户ping,或者相关计算机或IP可能设置了ICMP数据包过滤(比如防火墙),关闭ICMP数据包过滤就能ping通
ping 百度的 IP 即 ping 14.215.177.39 没问题,但 ping 百度的域名即 ping www.baidu.com 不行,那么可能的原因是什么?如何进行验证和解决?
答:这是域名解析失败的问题,域名解析主要是在DNS中进行,解决方法如下:
a.清空DNS缓存:命令窗口ipconfig/flushdns;
b.设置本机的DNS为谷歌的DNS 8.8.8.8 (或电信的 101.226.4.6、114.114.114.114);
c.再ping一次即可;
d.如果还是Ping不通 则可联系给域名服务的服务商;
联系到能上 QQ,但不能上网主要是因为QQ不需要DNS解析域名。
tracert
实作一
要了解到某计算机如 www.baidu.com 中间经过了哪些节点(路由器)及其它状态,可使用 tracert www.baidu.com 命令,查看反馈的信息,了解节点的个数。
实作二
ping.pe 这个网站可以探测从全球主要的 ISP 到某站点如 https://qige.io 的线路状态,当然也包括各线路到该主机的路由情况。请使用浏览器访问 http://ping.pe/qige.io 进行了解。
问题一
tracert 能告诉我们路径上的节点以及大致的延迟等信息,那么它背后的原理是什么?
答:通过向目标发送不同IP生存时间 (TTL) 值的“Internet控制消息协议 (ICMP)”回应数据包,Tracert诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP 已超时”的消息发回源系统。
Tracert 先发送 TTL 为 1 的回应数据包,并在随后的每次发送过程将TTL递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包,这在 Tracert 实用程序中看不到。
问题二
在以上两个实作中,如果你留意路径中的节点,你会发现无论是访问百度还是棋歌教学网,路径中的第一跳都是相同的,甚至你应该发现似乎前几个节点都是相同的,你的解释是什么?
答:这是因为路径中的第一跳都是相同的,也就说无论目的地址是哪里,数据传输从本机发送出去后,到达的都是同一个交换机。然后才通过不同的子网到达不同的目的地址
问题三
在追踪过程中,你可能会看到路径中某些节点显示为 * 号,这是发生了什么?
答:据说tracert的实现原理是多个ping的组合,如果对方开放火墙拦截ping,则无法获得该节点的时间等信息,然后就显示*,而且,很慢,就是这个原因(等待超时)
ARP
实作一
运行 arp -a 命令查看当前的 arp 缓存, 请留意缓存了些什么。然后 ping 一下你旁边的计算机 IP(注意,需保证该计算机的 IP 没有出现在 arp 缓存中,或者使用 arp -d * 先删除全部缓存),再次查看缓存,你会发现一些改变,请作出解释。
解释: 在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应的信息,则通过发送ARP request报文来获得它。由于删除了ARP缓存,所以设备发送了ARP报文获取了目的IP的MAC地址。学习到的IP地址和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 命令设置其为静态类型的。
DHCP
实作一
一般地,我们自动获取的网络配置信息包括:IP 地址、子网掩码、网关 IP 以及 DNS 服务器 IP 等。使用 ipconfig/release 命令释放自动获取的网络配置,并用 ipconfig/renew 命令重新获取,了解 DHCP 工作过程和原理。
问题
如果未能成功释放,请思考有哪些可能的原因并着手进行解决?
答:将 DHCP Service 重启,重新下载 TCP/IP或者重新安装驱动网卡。或者解决办法是在 “ win+R ” 然后输入 “ sc config DHCP start= AUTO ” 然后再重启
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,当然,由于你懂的原因,这不一定会得到正确的答案。
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、类型、字段等。
Ehernet帧结构
Destination是目的MAC地址,source是目的MAC地址,type是使用的ip协议
Ethernet 帧结构主要包括以下:
⑴ 前导码(Preamble):由0、1间隔代码组成,用来通知目标站作好接收准备。以太网帧则使用8个字节的0、1间隔代码作为起始符。IEEE 802.3帧的前导码占用前7个字节,第8个字节是两个连续的代码1,名称为帧首定界符(SOF),表示一帧实际开始。
⑵ 目标地址和源地址(Destination Address & Source Address):表示发送和接收帧的工作站的地址,各占据6个字节。其中,目标地址可以是单址,也可以是多点传送或广播地址。
⑶ 类型(Type)或长度(Length):这两个字节在Ethernet II帧中表示类型(Type),指定接收数据的高层协议类型。而在IEEE 802.3帧中表示长度(Length),说明后面数据段的长度。
⑷ 数据(Data):在经过物理层和逻辑链路层的处理之后,包含在帧中的数据将被传递给在类型段中指定的高层协议。该数据段的长度最小应当不低于46个字节,最大应不超过1500字节。如果数据段长度过小,那么将会在数据段后自动填充(Trailer)字符。相反,如果数据段长度过大,那么将会把数据段分段后传输。在IEEE 802.3帧中该部分还包含802.2的头部信息。
⑸ 帧校验序列(FSC):包含长度为4个字节的循环冗余校验值(CRC),由发送设备计算产生,在接收方被重新计算以确定帧在传送过程中是否被损坏。
问题
你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
答:因为尾部四个字节的校验字段都wireshark被过滤了
实作二 了解子网内/外通信时的 MAC 地址
ping
你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
发出帧的目的MAC地址:b2:ab:99:ed:e7:88
返回帧的源MAC地址:ac:d5:64:3c:21:73
目的MAC是主机的
然后 ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
发出帧的目的MAC地址:a4:1a:3a:5f:ff:dd
返回帧的源MAC地址:ac:d5:64:3c:21:73
这个目的MAC是网关的
再次 ping www.cqjtu.edu.cn
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
发出帧的目的MAC地址:a4:1a:3a:5f:ff:dd
返回帧的源MAC地址:ac:d5:64:3c:21:73
目的MAC是网关的
✎ 问题
通过以上的实验,你会发现:
- 访问本子网的计算机时,目的 MAC 就是该主机的
- 访问非本子网的计算机时,目的 MAC 是网关的
请问原因是什么?
答:网关是出入本机子网和其他子网需要到达的地方,不出入子网就不需要经过网关,所以访问本子网的计算机时目的MAC是主机的,而访问本子网外的主机目的MAC就是网关的
实作三 掌握 ARP 解析过程
为防止干扰,先使用 arp -d *
命令清空 arp 缓存
ping
你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么?
再次使用 arp -d *
命令清空 arp 缓存
然后 ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
✎ 问题
通过以上的实验,你应该会发现,
- ARP 请求都是使用广播方式发送的
- 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
请问为什么?
答:当本机访问该子网中的计算机时,数据包不需要离开通信子网,ARP解析也会在这个子网中进行,因此ARP解析是另一台主机的MAC物理地址;通过路由器访问非子网 IP 时,路由器将其发送出去,目的 IP 接收请求,然后通过路由器端口 IP 返回,这时 ARP 解析会得到网关的物理地址
网络层
实作一 熟悉 IP 包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
ping 192.168.2.102
由以上可知:
版本:IPV4 ;头部长度:20 bytes ; 总体长度:60 ; 存活时间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 包如何进行分段,如:分段标志、偏移量以及每个包的大小等
分段标志:Flags
MF、DF、未用。MF=1表示后面还有分段的数据包,MF=0表示没有更多分片(即最后一个分片)。DF=1表示路由器不能对该数据包分段,DF=0表示数据包可以被分段。
偏移量(Fragment Offset)
✎ 问题
分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?
答:丢掉然后通知发送端重新传送
实作三 考察 TTL 事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了 tracert
命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com
命令进行追踪,此时使用 Wireshark 抓包(用 icmp
过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
主机发送的数据生存周期呈递增变化
传输层
实作一 熟悉 TCP 和 UDP 段结构
用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
TCP报文段: 报文段包括了20~60字节的首部,其中20字节是没有选项的,后面40字节可选。
源地址端口:16位字段,发送该报文段的主机中应用程序的端口号
序号:32位字段。指派给本报文段第一个数据字节的编号,TCP传输保证连接性,发送的每个字节都要编上号。序号就是告诉终点,报文段中的第一个字节是序列中的哪个。建立连接时,发收双发使用各自的随机数产生器产生一个初始序号(ISN),通常,两个方向的ISN是不同的。
确认号:32位字段定义了接收方期望从对方接受的字节编号。如果报文段的接收方成功的接受了对方发过来的编号x的字节,那么返回x+1作为确认号,确认号可以和数据捎带一起发送。
HLEN:4位,指出TCP首部一共有多少个4字节,所以范围是5~15 保留: 控制:定义了6中不同的控制位或者标志位。
紧急指针:只有当紧急标志置位时URG,该16位的字段才有效。紧急指针定义了一个数值,把这个数值加到序号上就得到版文段数据部分中最后一个紧急字节的编号。
用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
UDP的分组: UDP的分组称用户数据报:它有8字节的固定首部
总长度:16位字段,定义了用户数据报的总长度为0~65535字节。但实际长度肯定比65535小,因为用户数据报要放在总长度为65535的IP数据报中,封装在IP数据报中。因此UDP长度=IP长度-IP首部长度。
检验和:增加一个伪首部,对于UDP协议来说协议字段的值为17。若在传输过程中这个值发生改变,接收端计算检验和就能检测出来。UDP使用检验和是可选的,如果不计算就将这16位全部填0.
✎ 问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
答:传输层实现的是端到端的通信,需要源端口号与目的端口号实现两边的确认。
实作二 分析 TCP 建立和释放连接
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream
),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
三次握手的标志位: 客户端发送数据, 序列号seq:标记数据段的顺序。
客户点请求建立连接,确认号ack:期待收到对方下一个报文段的第一个数据字节的序号。 服务端同意建立请求,回复确认。
确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。 连接建立完成。 同步SYN:连接建立时用于同步序号。
终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
第一次握手:syn=1,ack=0
第二次握手:syn=1,ack=1
第三次握手:syn=0,ack=1
请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
同理,四次挥手释放包的查找也可以用标志位进行查询,如下: FIN=1,其序列号为seq=u;
TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
服务器发送完数据后,再次向客户端发送连接释放的确认。FIN=1,ack=u+1,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1。 服务器只要收到了客户端发出的确认,释放连接。
建立状态:FIN=1,
seq=u 服务器确认:ACK=1,seq=u,ack=u+1
服务器询问释放连接:FIN=1, ACK=1,seq=w,ack=u+1
用户端回复:ACK=1,seq=u+1,ack=w+1
✎ 问题一
去掉 Follow TCP Stream
,即不跟踪一个 TCP 流,你可能会看到访问 qige.io
时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
答:原因:访问qige.io的时候,不止一个端口与qige.io建立连接,而是许多端口同时与它建立连接
作用:可以同时进行加载数据,提高运行速度
✎ 问题二
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
答:第二三次可以合并
应用层
应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。
实作一 了解 DNS 解析
先使用 ipconfig /flushdns
命令清除缓存,再使用 nslookup qige.io
命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。
你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
可了解一下 DNS 查询和应答的相关字段的含义
✎ 问题
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
答:虽然访问的网址只有一个域名,但是并不只有一台服务器主机,算机域名解析服务器可能有多个,所以会同时向几个域名解析服务器发出请求
实作二 了解 HTTP 的请求和应答
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream
),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST
。并仔细了解请求的头部有哪些字段及其意义。
请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404
等。并仔细了解应答的头部有哪些字段及其意义。
状态码:
1xx:接收到请求且正在处理
2xx:请求正常处理完毕:eg:200 OK
3xx:重定向状态,表示浏览器需要进行附加操作
4xx:服务器无法处理这个请求 eg :404 Page Not Found
5xx:服务器处理出错 eg:502 Bad Gateway
URL:是一个相对的URL。是相对下面的Host来说的。两者组合就是一个完整的URL;这里联合http组合之后就是:http://www.people.com.cn/
版本:HTTP/1.1; Host: 也就是是你要访问的主机的名字; Connection:keep-alive
值代表的意思是保持连接。这样子有利于在你访问的网页中有很多图片等其他资源的时候,可以使用同一个TCP连接接收,而不是针对每一个文件都建立一次TCP/IP的连接。这个也就是课本上面说的“持久连接”。
✍ 建议:
HTTP 请求和应答的头部字段值得大家认真的学习,因为基于 Web 的编程中我们将会大量使用。如:将用户认证的令牌信息放到头部,或者把 cookie 放到头部等。
✎ 问题
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304
代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304
应答而不是常见的 200
应答?
答:服务器对于浏览器的第一次应答对于浏览器来说已经有了缓存,因此浏览器第二次发送请求的时候,服务器会回复浏览器上次请求的资源现在在缓存里,服务器根据浏览器传来的时间发现和当前请求资源的修改时间一致,应答304,表示不再重新传送。