数据链路层
准备
- 如图打开Wireshark进行抓包,点击WLAN或者其他即可开始捕获。
- 如图所示为开始/停止捕获按钮以及主要窗口区域
- 数据包的过滤
(1)协议过滤
直接输入协议名tcp/http/icmp(注:需要小写)
(2)IP过滤
ip.src==x.x.x.x 显示原地址为x.x.x.x的数据包列表
ip.dst==x.x.x.x 显示目标地址为x.x.x.x的数据包列表
ip.addr==x.x.x.x 显示原地址或者目标地址为x.x.x.x的数据包列表
(3)端口过滤
tcp.port==x 显示源主机或者目的主机端口为x的数据包列表
tcp.srcport==x 显示TCP协议的源主机端口为x的数据包列表
tcp.dstport==x 显示TCP协议的目的主机端口为x的数据包列表
(4)Http模式过滤
http.request.method==“GET” 显示HTTP GET方法。
(5)按照数据包内容过滤
找到数据包select contains“xxx"
实作一 熟悉 Ethernet 帧结构
目的 MAC、源 MAC、类型、字段如图所示。
? 问题
你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
答:因为校验字段不会进行校验,因此Wireshark将它丢弃了
实作二 了解子网内/外通信时的MAC地址
- 如图 ping 192.168.0.198,得到的Wireshark发出帧与返回帧如图。
发出帧:目的MAC为f8:a2:d6:84:67:d7
返回帧:源MAC为f8:a2:d6:84:67:d7 该MAC地址是处于同一子网的计算机的。
- ping qige.io,得到的Wireshark发出帧与返回帧如图。
发出帧的目的MAC地址为42:bb:64:20:57:fb 返回帧的源MAC地址为42:bb:64:20:57:fb
这个MAC地址是网关的。 3. ping www.cqjtu.edu.cn,得到的Wireshark发出帧与返回帧如图。 发出帧目的MAC地址为:42:bb:64:20:57:fb 返回帧的源MAC地址为:42:bb:64:20:57:fb
该MAC地址是网关的。
? 问题 通过以上的实验,你会发现:
- 访问本子网的计算机时,目的 MAC 就是该主机的
- 访问非本子网的计算机时,目的 MAC 是网关的
请问原因是什么?
答:因为访问本子网的计算机时不需要经过网关,而访问本子网以外的计算机,必须要通过网关,因为网关是子网的出入口。
实作三 掌握 ARP 解析过程
-
使用arp -d * 清空arp缓存 -
如图 ping 192.168.0.189. -
arp广播请求问谁有192.168.0.189(ping 的地址),该请求的目的MAC地址为ff:ff:ff:ff:ff:ff。 该请求的回应为192.168.0.189。 该回应的源MAC地址:20:79:18:8d:f1:9e。 目的MAC地址:34:4b:50:00:00:00(本机)。 -
再次使用 arp -d * 命令清空 arp 缓存 -
ping qige.io ,如图。 -
arp广播请求问谁有192.168.0.1(网关) 该请求的目的MAC地址为ff:ff:ff:ff:ff:ff。
该请求的回应为192.168.0.1(网关)。 该回应的源MAC地址:86:54:f2:2c:ff:27(网关)。 目的MAC地址:34:4b:50:00:00:00(本机)。
? 问题
通过以上的实验,你应该会发现,
- ARP 请求都是使用广播方式发送的
- 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
请问为什么?
答:ARP解析是先看arp表中是否有目的地址,如果有就不需要再次建立联系了,可以直接得到目的MAC。如果没有就需要发送ARP请求,但是因为不知道目的地址在哪,因此需要发送广播,通过“学习”来完善arp表。如果目的地址是属于同一个子网,则不需要通过网关就能够进行通信,而不在同一个子网中就需要通过网关才能够建立联系。
网络层
实作一 熟悉 IP 包结构
? 问题
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
答:IP的头部长度可以使得接收端计算出报头在何处结束及从何处开始读数据。总长度的字段是因为接收端需要去掉添加的0
实作二 IP 包的分段与重组
ping 192.168.0.198 -l 2000 使用 Wireshark 抓包(用 ip.addr == 192.168.0.198 进行过滤) 这里看到,这个2000字节的数据分为了两次进行传送。
? 问题
分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6中,如果路由器遇到了一个大数据包该怎么办?
答:转发到支持该数据传输的路由上或者丢弃该数据包。
实作三 考察 TTL 事件
使用tracert www.baidu.com 命令进行追踪,使用Wireshark抓包。 由tracert 追踪可看出每经过一跳,TTL数增加1
Tracert 先发送 TTL 为 1 的回应数据包,并随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由
? 问题
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?
答:我收到的包说明我是目的地址,值为50,取
2
n
2^{n}
2n跟50最接近的为64,则为64-50=14跳。
传输层
实作一 熟悉 TCP 和 UDP 段结构
TCP段结构如图: UDP段结构如图:
? 问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
答:源端口就是本机程序用来发送数据的端口,目的端口就是对方主机用哪个端口接收。实现端到端的进程通信。
实作二 分析 TCP 建立和释放连接
使用tcp加上Follow TCP Stream ,如图。 第一次握手时,客户端发送一个(同步位)SYN=1,(确认位)ACK=0标志的数据包给服务端,请求进行连接。 第二次握手时,服务端收到请求并且允许连接的话,就会发送一个(同步位)SYN=1,(确认位)ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手。 第三次握手时,服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,TCP连接建立,开始通讯。四次挥手释放连接 从图上可以看出,断开连接时首先由一方发出FIN报文,然后另一方接收并回ACK报文;并且它也会发送一个FIN报文表示断开连接,最开始发送的一方也接收并发ACK报文,TCP连接断开。
? 问题一
去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
答:有多个连接相当于多线程取数据,响应速度更快。
? 问题二
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
答:服务端发送的确认与请求释放连接一起发送了。
应用层
实作一 了解DNS解析
如图使用ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析 当前计算机使用UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求。 DNS 服务器的 53 号端口返回的结果。
? 问题
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
答:因为网站设有好几台计算机,每台计算机运行同样的服务器。这些计算机IP地址不一样,但是域名相同。
实作二 了解 HTTP 的请求和应答
访问qige.io 网站,使用http过滤加上Follow TCP Stream 请求使用的是GET。
请求使用的是POST。
这里应答代码是200.
Server:服务器通过这个头告诉浏览器服务器的类型。 Transfer-Encoding:告诉浏览器数据的传送格式。 Content- Type:表示后面的文档属于什么MIME类型。 Cache-Control:指定请求和响应遵循的缓存机制
|