一、数据链路层
1.熟悉 Ethernet 帧结构
ping www.baidu.com
由图可见,目的Mac为00:74:9c:9f:40:13, 源Mac地址为40:5b:d8:32:98:07,类型为IPV4
问题解答:
Wireshark 抓包前,在物理层网卡已经去掉了一些之前几层加的东西,比如前导同步码,FCS等等,之后利用校验码CRC校验,正确时才会进行下一步操作,因此,抓包软件抓到的是去掉前导同步码、FCS之外的数据,没有校验字段
2.了解子网内/外通信时的 MAC 地址
(1)我的IP地址为10.160.173.49,ping 10.160.173.50
可以看到,目的Mac仍然为00:74:9c:9f:40:13,源Mac地址仍然为40:5b:d8:32:98:07;
因为无法访问目标主机,所以请求的包到达了网关,那么目的Mac地址本该为被访问主机的MAC地址,现在变成了网关的Mac地址,源MAC地址应该是本机的物理地址,
(2)ping www.baidu.com
目的Mac仍然为00:74:9c:9f:40:13(网关的),源Mac地址仍然为40:5b:d8:32:98:07(本机的)(3)ping qige.io
目的Mac仍然为00:74:9c:9f:40:13(网关的),源Mac地址仍然为40:5b:d8:32:98:07(本机的)
(4)问题解答:
因为本子网内的信息可以直接到达,而本机接收到的本子网以外的信息必定经由网关发送给我,同理本机发送到本子往外信息的下个地址必定是网关的mac地址。
3.掌握 ARP 解析过程
本机IP地址为192.168.43.68,ping 192.168.43.210
用 Wireshark 抓这些包(可 arp 过滤)
查看ARP请求格式
请求的内容为目标IP的MAC地址
该请求的目的 MAC 地址是00:00:00_00:00:00
查看请求回应
回应的源Mac地址为HuaweiTe_8e:33:68(24:31:54:8e:33:68)
目的Mac地址为40:5b:d8:32:98:07,恰好为请求方的MAC地址
(2)ping qige.io
查看ARP请求
可以看到,该请求是网关在回应
(3)问题解答:
对于没有配置缺省网关的计算机要和其他网络中的计算机实现通信,网关收到源计算机的ARP请求会使用自己的MAC地址与目标计算机的IP地址对源计算机进行应答,访问非子网IP时需要经过网关出入,通过路由器把包发出去,目标IP收到请求后,再通过路由器端口IP返回去,那么ARP解析将会得到网关的MAC。
二、网络层
1.熟悉 IP 包结构
版本为4,头部长度为20字节,总长度为60字节,存活时间64,协议类型为ICMP
问题解答:
头部长度是来表明该包头部的长度,可以使得接收端计算出报头在何处结束及从何处开始读数据。总长度是为了接收方的网络层了解到传输的数据包含哪些,如果没有该部分,当数据链路层在传输时,对数据进行了填充,对应的网络层不会把填充的部分给去掉。
2.IP 包的分段与重组
ping 202.202.240.16 -l 2000
用 ip.addr == 202.202.240.16 进行过滤
打开Flags查看信息
问题解答:
因为在 IPv6中分段只能在源与目的地上执行,不能在路由器上进行。因此当数据包过大时,路由器就会直接丢弃该数据包包,并向发送端发回一个"分组太大"的ICMP差错报文,之后发送端就会使用较小长度的IP数据报重发数据,所以路由器会直接丢弃再通知发送端进行重传。
3.考察 TTL 事件
使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤)
TTL为1
TTL为2
TTL为3
TTL是每经过一次路由器就减一,所以每个发送包的TTL的TTL依次递增。由此我们可以知道该追踪原理就是:TTL从1开始发送,每到一个路由器就减一,TTL到0之后就返回时间超过的差错报文。
问题解答:
TTL的值为50,与之相近的最近的为64,所以可以推断这个包从源点到你之间有64-50-1=13跳
三、传输层
1.熟悉 TCP 和 UDP 段结构
(1)Wireshark 任意抓包(可用 tcp 过滤)
由图可见,源端口为64178、目的端口为443、序列号为1、确认号为1。
各种标志位:Urgent紧急位为0正常,Acknowledgment确认位为1,Push推位为0,Reset恢复位为0正常(当为1时表示拒绝访问),SYN同步位为0(当用于三次握手的前两次时置为1),Fin结束位为0(用于结束后释放连接)(2)用 Wireshark 任意抓包(可用 udp 过滤)
源端口为8200,目的端口为64962,长度为66
问题解答:
源端口来表示发送终端的某个应用程序进程,目的端口来表示接收终端的某个应用程序进程。端口号就是来标识终端的应用程序进程,从而实现应用程序进程之间的通信。
2.分析 TCP 建立和释放连接
访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream)
在捕获的包中找到三次握手建立连接的包
64422第一次请求(包含Seq序列号0,长度0,SYN同步位)到达443,443回复(SYN同步位,ACK确认号1,)给64422,
然后64422第二次请求(ACK确认号为1),三次握手建立连接成功在捕获的包中找到四次挥手释放连接的包
从图中可看到443到64422的过程中,有FIN结束位,说明此次过程用于释放连接。
主机发出 FIN 信号请求断开,服务器端回应一个 ACK 确认信号,然后服务器端又发出一个 FIN 信号(这里将 ACK 和 FIN 合并成立一个包),最后主机回应一个 ACK 确认信号,即可断开连接。
问题解答:
1.建立多个连接的目的是为了加快网页加载速度,保证通信的流畅与稳定。
2.只抓到三次挥手是因为第四次挥手是用于释放连接,一般是合并到第三次握手过程中去了。
四、应用层
1.了解 DNS 解析
使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析
Wireshark DNS过滤
可以看到,当前计算机使用 UDP用户数据报协议,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了对应的结果。通过对比,发现nslookup qige.io得到的Address为本机的DNS服务器IP地址,
Queries #问题部分
baidu.com: type A, class IN
Name: baidu.com #查询名字段, 这里请求域名baidu.com
[Name Length: 9]
[Label Count: 2]
Type: A (Host Address) (1) #查询类型字段, 这里为A类型
Class: IN (0x0001) #查询类字段, 这里为互联网地址
对比上述资料分析,了解查询相关字段含义
应答相关字段
Answers #“回答问题区域”字段
baidu.com: type A, class IN, addr 220.181.57.216 #资源记录部分
Name: baidu.com #域名字段, 这里请求的域名为baidu.com
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001) #类字段
Time to live: 5 #生存时间
Data length: 4 #数据长度
Address: 220.181.57.216 #资源数据, 这里为IP地址
baidu.com: type A, class IN, addr 123.125.115.110 #资源记录部分
Name: baidu.com
Type: A (Host Address) (1)
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 123.125.115.110
对比上述资料分析,了解应答相关字段含义
问题解答:
为了使服务器负载得到平衡(因为每天访问站点的次数非常多)网站就设有好几个计算机,每一个计算机都运行同样的服务器软件。这些计算机的IP地址不一样,但它们的域名却是相同的。这样,第一个访问该网址的就得到第一个计算机的IP地址,而第二个访问者就得到第二个计算机的IP地址等等。这样可使每一个计算机的负荷不会太大。
2.了解 HTTP 的请求和应答
访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream)
在捕获的包中找到 HTTP 请求包
可以看到使用的是Get命令
HTTP请求头部字段意义:
host 客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号
User-Agent 浏览器表明自己的身份(是哪种浏览器)。
Accept 告诉WEB服务器自己接受什么介质类型,
Accept-Language 浏览器申明自己接收的语言语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等
Accept-Encoding 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法 (gzip,deflate)
Content-Encoding WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
Cookie 这个头信息把之前发送到浏览器的 cookies 返回到服务器。
Referer 浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL
Proxy-Authenticate 代理服务器响应浏览器,要求其提供代理身份验证信息
Range 浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。
If-Unmodified-Since 如果请求的对象在该头部指定的时间之后没修改过,才执行
Content-Type WEB 服务器告诉浏览器自己响应的对象的类型。
在捕获的包中尝试找 HTTP 应答包
没找到,通过查找资料了解到如果找到应该类似于下面这样:
Date:通用字段,但通常出现在响应头里,表示 HTTP 报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略
Server:响应字段,它告诉客户端当前正在提供 Web 服务的软件名称和版本号,例如“Server: openresty/1.15.8.1”。但是出于安全考虑,一般不会给出具体的,比如“GitHub.com”。
Content-Type:文本类型字段,这里是HTML文本,采用“utf-8”格式
Status:状况字段,显示OK代表已经完成
问题解答:
如果资源没有变,服务器就回应一个“304 Not Modified”,表示缓存依然有效,浏览器就可以更新一下有效期,然后放心大胆地使用缓存了。
如果资源变了,服务器返回状态码200,并发送新页面的全部内容。使用“304”可以减小流量和带宽开销。