二.Wireshark 实验

1.数据链路层

1.1熟悉 Ethernet 帧结构

使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。




wireshark监控指定端口和ip wireshark 指定目的端口_Powered by 金山文档


问题:你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。

wireshark它抓到的包是校验后的包,所以默认关闭了WireShark自己的校验。

1.2了解子网内/外通信时的 MAC 地址

1.2.1ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_02


这里面有多个包,但是只有两个ip地址,其中192.168.10.2是同子网另外一台计算机,192.168.10.3是本机,我向它发送包时,我的物理地址作为源MAC,对方的作为目的MAC;反之,我的作为目的MAC,对方作为源MAC。

1.2.2然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?


wireshark监控指定端口和ip wireshark 指定目的端口_子网_03


可见qige.io 的IP为104.21.39.46;这里发出帧的目的MAC和返回帧的源MAC都是相同的,为88:52:eb:e2:04:56,为网关MAC。

1.2.3再次 ping www.cqjtu.edu.cn (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?


wireshark监控指定端口和ip wireshark 指定目的端口_Powered by 金山文档_04


可见www.cqjtu.edu.cn 的IP为218.70.34.236;这里发出帧的目的MAC和返回帧的源MAC都是相同的,为c8:5a:9f:e6:b1:65,为网关MAC。

问题:通过以上的实验,你会发现:访问本子网的计算机时,目的 MAC 就是该主机的;访问非本子网的计算机时,目的 MAC 是网关的;请问原因是什么?

因为子网内的计算机是可以通过交换机直接访问的,所以目的MAC可得知就是目的主机的,如果是非本子网的计算机,因为不知道其MAC地址,但访问需要通过网关转发和接收,所以就填网关的MAC地址。

1.3掌握 ARP 解析过程

为防止干扰,先使用 arp -d * 命令清空 arp 缓存

ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。

当我在ping 192.168.10.2的时候会发出一个arp广播,询问谁有192.168.10.2(目的ip),请告诉192.168.10.3(本机ip)


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_05


这里两问两答,分别告诉了192.168.10.2谁是192.168.10.3和它的Mac地址,也告诉了192.168.10.3谁是192.168.10.2和它的Mac地址。

再次使用 arp -d * 命令清空 arp 缓存

然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。


wireshark监控指定端口和ip wireshark 指定目的端口_wireshark监控指定端口和ip_06


wireshark监控指定端口和ip wireshark 指定目的端口_Wireshark_07


ping子网外的主机回复的是本子网的网关MAC地址。

问题:通过以上的实验,你应该会发现,ARP 请求都是使用广播方式发送的;如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。请问为什么?

当本机访问的是本子网的计算机,数据包无需离开本通信子网, ARP 解析将也是在本子网里进行,所以ARP解析得到是对方主机的MAC物理地址;当本机访问的是非本子网的计算机,也就是说此时有两个不同通信子网的主机之间需要通信,数据包就需要离开本通信子网,这里就涉及到数据包在两个通信子网的传输,传输数据要离开本通信子网,ARP 解析就势必要经过网关,因此,该ARP 解析得到的目的MAC物理地址就是本网关的物理地址。

2.网络层

2.1熟悉 IP 包结构

这里随便找了一个包


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_08


问题:为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?

头部长度可以使得接收端计算出报头在何处结束及从何处开始读数据。总长度的字段是因为接收端需要读数据,接收数据,作用不同。

2.2 IP 包的分段与重组

根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_09


wireshark监控指定端口和ip wireshark 指定目的端口_Powered by 金山文档_10


问题:分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?

如果已经无法在进行分段,那么路由器会把该数据包丢掉或者转发到支持该数据包传输的路由上,因为这已经超出它能力范围了。

2.3考察 TTL 事件

请使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。


wireshark监控指定端口和ip wireshark 指定目的端口_子网_11


wireshark监控指定端口和ip wireshark 指定目的端口_Powered by 金山文档_12


观察后面显示的TTL信息可知,每次到下一跳,ttl加1。

问题:在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?

应该是14跳,可能会更多,因为TTL初始计时一般是2的n次方且一般是离你最近且大于你的那个数,所以现在TTL为50,最近的为2的6次方64,64-50=14跳。

3.传输层

3.1 熟悉 TCP 和 UDP 段结构

用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。


wireshark监控指定端口和ip wireshark 指定目的端口_Wireshark_13


用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_14


问题:

由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?

端口号与进程一一对应,是用来寻找进程的,源端口用来识别发送方进程,目的端口用来识别接收方进程。

3.2分析 TCP 建立和释放连接

打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。

请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。


wireshark监控指定端口和ip wireshark 指定目的端口_Wireshark_15


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_16


wireshark监控指定端口和ip wireshark 指定目的端口_子网_17


第一次握手:syn=1,ack=0;第二次握手:syn=1,ack=1;第三次握手:syn=0,ack=1

请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。


wireshark监控指定端口和ip wireshark 指定目的端口_wireshark监控指定端口和ip_18


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_19


wireshark监控指定端口和ip wireshark 指定目的端口_Wireshark_20


wireshark监控指定端口和ip wireshark 指定目的端口_wireshark监控指定端口和ip_21


前三次FIN和ACK都是1,最后一次ACK为1,FIN为0

问题:去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?

因为建立多个连接这样以后可以加快传输的速度,同时实现多个用户访问。

问题:我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?

说是第二次和第三次挥手被合并了(查阅得来)。

在《Linux的TCP实现之:四次挥手》有描述原因:因为开启了延时ack机制 ,导致收到第一个fin之后,发送ack的条件不能满足立即发送ack的条件,导致ack的发送被延时了,在延时的过程中,应用如果确认没数据要发,并且也要关闭此连接的情况下,会触发发送fin,这个fin就会和之前的ack合并被发出

4.应用层

4.1了解 DNS 解析

先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。


wireshark监控指定端口和ip wireshark 指定目的端口_子网_22


wireshark监控指定端口和ip wireshark 指定目的端口_子网_23


你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。


wireshark监控指定端口和ip wireshark 指定目的端口_子网_24


wireshark监控指定端口和ip wireshark 指定目的端口_Powered by 金山文档_25


可了解一下 DNS 查询和应答的相关字段的含义

问题:你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?

因为我们访问的网址只有一个域名,但是并不只有一台服务器主机,因此每一台服务器的IP地址不同,但他们的域名都是相同的。因此发出的解析请求是分散给不同服务器,这样也可以起到减轻设备负荷的作用。

4.2了解 HTTP 的请求和应答

打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。


wireshark监控指定端口和ip wireshark 指定目的端口_网络协议_26


请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。


wireshark监控指定端口和ip wireshark 指定目的端口_Powered by 金山文档_27


wireshark监控指定端口和ip wireshark 指定目的端口_Wireshark_28


请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。


wireshark监控指定端口和ip wireshark 指定目的端口_子网_29


问题:刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?

因为服务器对于浏览器的第一次应答对于浏览器来说已经有了缓存,因此浏览器第二次发送请求的时候,服务器会回复浏览器上次请求的资源现在在缓存里,因此服务器根据浏览器传来的时间发现和当前请求资源的修改时间一致,应答304,表示不再重新传送。