目录
一、实验目的
通过本实验:
- 熟练掌握Wireshark的操作和使用,学习对HTTP协议进行分析;
- 练习traceroute 等工具的使用,学会跟踪数据包在网络中经过的路由路径,观察DNS、CDN以及负载均衡设备的存在,练习基本的网络管理和故障排除技能。
二、HTTP协议与数据包分析
2.1 HTTP 协议简介
HTTP 是超文本传输协议 (Hyper Text Transfer Protocol)的缩写,用于WWW 服务。
(1)HTTP 的工作原理
HTTP 是一个面向事务的客户服务器协议。尽管HTTP 使用TCP 作为底层传输协议,但
HTTP 协议是无状态的。也就是说,每个事务都是独立地进行处理。当一个事务开始时,就
在web客户和服务器之间建立一个TCP 连接,而当事务结束时就释放这个连接。此外,客 户可以使用多个端口和和服务器 (80 端口)之间建立多个连接。其工作过程包括以下几个阶段。
① 服务器监听TCP 端口 80,以便发现是否有浏览器 (客户进程)向它发出连接请求;
② 一旦监听到连接请求,立即建立连接。
③ 浏览器向服务器发出浏览某个页面的请求,服务器接着返回所请求的页面作为响应。
④ 释放TCP 连接。
在浏览器和服务器之间的请求和响应的交互,必须遵循HTTP 规定的格式和规则。
当用户在浏览器的地址栏输入要访问的HTTP 服务器地址时,浏览器和被访问HTTP 服
务器的工作过程如下:
① 浏览器分析待访问页面的URL 并向本地DNS 服务器请求IP 地解析;
② DNS 服务器解析出该HTTP 服务器的IP 地址并将IP 地址返回给浏览器;
③ 浏览器与HTTP 服务器建立TCP 连接,若连接成功,则进入下一步;
④ 浏览器向HTTP 服务器发出请求报文 (含GET 信息),请求访问服务器的指定页面;
⑤ 服务器作出响应,将浏览器要访问的页面发送给浏览器,在页面传输过程中,浏览
器会打开多个端口,与服务器建立多个连接;
⑥ 释放TCP 连接;
⑦ 浏览器收到页面并显示给用户。
(2)HTTP 报文格式
HTTP 有两类报文:从客户到服务器的请求报文和从服务器到客户的响应报文。图 5.46
显示了两种报文的结构。
图1.1 HTTP 的请求报文和响应报文结构
在图1.1 中,每个字段之间有空格分隔,每行的行尾有回车换行符。各字段的意义如下:
① 请求行由三个字段组成:
* 方法字段,最常用的方法为 “GET”,表示请求读取一个万维网的页面。常用的方法
还有 “HEAD(指读取页面的首部)”和“POST(请求接受所附加的信息);
* URL 字段为主机上的文件名,这时因为在建立TCP 连接时已经有了主机名;
* 版本字段说明所使用的HTTP 协议的版本,一般为 “HTTP/1.1”。
② 状态行也有三个字段:
* 第一个字段等同请求行的第三字段;
* 第二个字段一般为 “200”,表示一切正常,状态码共有41 种,常用的有:301 (网站已转移),400(服务器无法理解请求报文),404(服务器没有锁请求的对象)等;
* 第三个字段时解释状态码的短语。
③ 根据具体情况,首部行的行数是可变的。请求首部有Accept 字段,其值表示浏览器 可以接受何种类型的媒体;Accept-language,其值表示浏览器使用的语言;User-agent 表明可用的浏览器类型。响应首部中有Date、Server、Content-Type、Content-Length 等字段。在请求首部和响应首部中都有 Connection 字段,其值为Keep-Alive 或 Close,表示服务器在传送完所请求的对象后是保持连接或关闭连接。
④ 若请求报文中使用 “GET”方法,首部行后面没有实体主体,当使用 “POST”方法
是,附加的信息被填写在实体主体部分。在响应报文中,实体主体部分为服务器发送给客户
的对象。
图1.2 和图1.3显示了捕获的HTTP 请求和响应报文,结合上面的介绍,请自己分析和体会。
图1.2 HTTP 请求报文示例
图1.3 HTTP 响应报文示例
2.2实验环境与说明
(1)实验目的
在PC 机上访问Web 页面,截获报文,分析HTTP 协议的报文格式和HTTP
协议的工作过程。
(2)实验设备和连接
本地实验室环境,无须设备连接;
注意:请通过访问可以连接的WWW 站点或使用IIS 建立本地WWW 服务器来进行实验。
(3)实验分组
每人一台计算机独立完成实验。
2.3实验步骤
步骤1:在PC 机上运行Wireshark,开始截获报文;
步骤2:从浏览器上访问Web 界面,如http://csee.hnu.edu.cn打开网页,待浏览器的状态栏出现 “完毕”信息后关闭网页。
步骤3:停止截获报文,将截获的报文命名为http-学号保存。
分析截获的报文,回答以下几个问题:
1)综合分析截获的报文,查看有几种HTTP 报文?
有两种,如下图所示,分别为请求报文和响应报文
请求报文:下图第三行为从客户端发往服务器的请求报文,其最左边箭头为向左表示请求报文。其中Source的10.69.147.45是客户端的ip,Destination的23.214.95.200是服务器的ip
响应报文:下图第二行为服务器发往客户端的应答报文 。其中Source的23.214.95.200是服务器的ip,Destination的10.69.147.45是客户端的ip
2)在截获的HTTP 报文中,任选一个HTTP 请求报文和对应的 HTTP 应答报文,仔细分析它们的格式,填写表1.1 和表1.2。
表1.1 HTTP 请求报文格式
方 法 | GET | 版 本 | HTTP/1.1 |
URL | /system/resource/code/datainput.jsp?owner=1418316019&e=1&w=1707&h=1067&treeid=1001&refer=&pagename=L2luZGV4LmpzcA%3D%3D&newsid=-1 | ||
首部字段名 | 字段值 | 字段所表达的信息 | |
Host | csee.hnu.edu.cn | 接收请求的主机名 | |
Connection | Keep-alive | 连接状态 | |
User-Agent | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0 | 客户端代理信息 | |
Accept | image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 | 描述接收响应数据的数据类型,q表示相对质量因子,指示接收数据类型的优先级 | |
Referer | http://csee.hnu.edu.cn/ | 提供访问来源信息 | |
Accept-Encoding | gzip, deflate | 可处理的内容编码方式 | |
Accept-Language | zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 | 可接受的语言 |
表1.2 HTTP 应答报文格式
版 本 | HTTP/1.1 | 状态码 | 200 |
短 语 | OK | ||
首部字段名 | 字段值 | 字段所表达的信息 | |
Date | Wed, 23 Oct 2024 09:46:18 GMT | 响应时间 | |
Server | ********* | 服务器应用程序 | |
X-Frame-Options | SAMEORIGIN | 表示该页面可以在相同域名页面的frame中展示 | |
Cache-Control | no-store | 指定不响应缓存 | |
Pragma | no-cache | 在 HTTP/1.1 协议中,它的含义和 Cache-Control:no-cache 相同,表示无缓存 | |
Expires | ExpiresWed, 31 Dec 1969 16:00:00 PST | 过期时间 | |
Content-Type | image/gif;charset=UTF-8 | 实体类型 | |
Content-Length | 0 | 实体长度 | |
Set-Cookie | JSESSIONID=3B1005A6B677FECCDB0FF6648BB109F3; Path=/; HttpOnly | 客户端的Cookie信息 | |
Keep-Alive | timeout=5, max=100 | 持续连接的参数 | |
Connection | Keep-Alive | 连接状态 | |
Content-Language | zh-CN | 实体语言 |
3)分析在截获的报文中,客户机与服务器建立了几个连接?服务器和客户机分别使用了哪几个端口号?
客户端与服务器成功建立2个连接,服务器使用端口443,客户机使用到了端口60740、60752
4 )综合分析截获的报文,理解HTTP 协议的工作过程,将结果填入表1.3 中。
三次握手(TCP 三路握手)过程详解:
第1次握手:客户端发送一个带有SYN(synchronize)标志的数据包给服务端;
如图:第一行:TCP标志:[SYN] 序列号:Seq=0
客户端向服务器发送了一个SYN包,请求建立连接。这是三次握手的第一次握手
第二行:这是SYN包的重传,说明客户端可能没有收到服务器的应答或者网络中存在一定的延迟。仍然属于第一次握手
第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了;
TCP标志:[SYN, ACK] 序列号:Seq=1 确认号:Ack=1
服务器收到客户端的SYN请求后,发送一个带有SYN和ACK标志的包,确认收到客户端的SYN请求并请求建立连接。这是三次握手的第二次握手
第3次握手:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束。
其中:SYN标志位数置1,表示建立TCP连接;ACK标志表示验证字段。
四次挥手(TCP 四路挥手)过程详解:
第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态;
如图:客户端向服务器发送了 FIN 报文,表示客户端想要关闭连接
Seq=8430: 客户端发送的序列号是 8430
Ack=175: 客户端期望服务器下一次的序列号是 175,表示客户端已经接收完服务器之前的数据
第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号(ACK)为收到序号(Seq)+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态;
如图:服务器对客户端的 FIN 报文进行了确认,发送 ACK 报文
Seq=175: 服务器的序列号为 175
Ack=8431: 服务器确认客户端的 FIN 报文,期望客户端的下一个序列号为 8431
Win=16387: 窗口大小为 16387
第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;
如图:服务器向客户端发送了 FIN 报文,表示服务器也想要关闭连接
Seq=175: 服务器的序列号仍然为 175
Ack=8431: 服务器期望客户端的下一个序列号为 8431,确认之前的数据已全部接收
第4次挥手:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。
如图:客户端对服务器的 FIN 报文进行了确认,发送 ACK 报文
Seq=8431: 客户端的序列号为 8431
Ack=176: 客户端确认服务器的 FIN 报文,期望服务器的下一个序列号为 176
Win=16387: 窗口大小为 16387
其中:FIN标志位数置1,表示断开TCP连接
表1.3 HTTP 协议工作过程
HTTP 客户机端口号 | HTTP 服务器端口号 | 报文类型 | 功能说明 |
60740 | 443 | ACK | 确认数据包 |
60740 | 443 | Application Data | 传输应用层数据(加密的TLS数据) |
60740 | 443 | FIN | 请求关闭连接 |
60740 | 443 | FIN, ACK | 关闭 TCP 连接,请求关闭 |
60740 | 443 | RST | 重置连接 |
60740 | 443 | RST,ACK | 重置连接,确认重置请求 |
60828 | 443 | SYN | 发起连接请求,建立TCP连接 |
60828 | 443 | SYN, ACK | 确认收到SYN请求并回复,准备建立连接 |
60867 | 80 | PSH, ACK | 确认收到数据并立即将数据传递给应用层 |
三、数据包路径分析
traceroute (Windows下类似的命令为tracert)是一个网络诊断工具,用于跟踪数据包从源到目标的路径。它通过发送具有不同 TTL(生存时间,Time to Live)的ICMP(互联网控制消息协议)数据包,逐步递增TTL值,来记录数据包通过的每一个中间路由器的IP地址。
图1.4 traceroute的工作机制
默认情况下,traceroute 每一跳发送3个探测数据包,常用方法如下:
traceroute www.baidu.com
结果下图:
图1.5 traceroute单次结果
3.1 观察traceroute的工作过程
用Wireshark抓包,观察traceroute的发包过程:如何开始发包、如何停止发包。
由于windows默认icmp协议,通过过滤器选择icmpv6
第一跳:
第二跳:
第三跳:
......
traceroute实现原理
TTL(生存时间):
当网络中的路由器收到一个数据包时,会减少数据包的 TTL 值。如果 TTL 减到 0,路由器会丢弃该数据包并向源主机发送一个 ICMP “超时” 消息(ICMP Time Exceeded)。
traceroute 利用了这一点,通过逐步增加数据包的 TTL 值,从 1 开始,每次增加 TTL,使得数据包每次能传递到网络中的下一跳路由器,从而依次获取路径中每一跳的IP地址。
探测过程:
初始TTL = 1: traceroute 发送一个TTL值为 1 的数据包,数据包到达第一跳路由器时,TTL 减为 0,该路由器丢弃数据包并返回一个 ICMP 超时报文。
TTL = 2: traceroute 发送一个TTL为2的数据包,这次数据包可以通过第一跳路由器,到达第二跳路由器,第二跳路由器将TTL减为 0,并返回 ICMP 超时报文。
这个过程持续进行,直到数据包到达目标主机,目标主机会返回一个应答,表明已经到达终点。
为了能够区分不同的数据包和相应的返回结果,序列号(seq)会在每个数据包中递增
当 traceroute 显示每一跳的结果时,它会显示三个延迟时间,对应每个序列号的包。如果某个数据包没有得到响应(例如,网络拥塞或丢包),traceroute 可以通过缺失的序列号来显示该跳超时。这有助于更准确地分析网络的情况
3.2 数据包路径分析
尝试在不同的网络中运行比如校园网、运营商网络(可开手机热点接入),运行traceroute 到同一个网站。
观察每一跳的IP地址,分析你的寝室或校园网的网关、运营商的网关分别是哪个。
3.3 观察网站服务器IP地址的变化
多次运行 traceroute 命令,如图1.5,观察返回结果中域名后面的IP地址是否有变化,为什么会变化,差异大不大? 在不同的网络中,域名后面的IP地址的差异大不大,为什么?
图1.6 traceroute多次结果
当多次运行 traceroute 命令时,返回结果中显示的域名后面的IP地址有时会发生变化。这是因为:
- DNS负载均衡:网站可能使用了DNS负载均衡,这意味着每次查询时,DNS服务器会返回不同的IP地址,将请求分配到不同的服务器以均衡负载。
- CDN(内容分发网络):某些网站可能使用了CDN,内容会被分发到全球各地的多个服务器。当从不同的网络或区域访问时,DNS可能返回不同区域的CDN服务器IP。
- 变化的差异程度:IP地址的差异取决于网络的设计。如果网站使用负载均衡,差异可能在同一组服务器之间,变化不大。如果使用CDN,差异可能较大,因为可能连接到不同地理位置的服务器。
在不同的网络中,域名后面的IP地址差异可能会变大。例如,从不同国家访问同一网站时,可能会连接到不同地区的CDN服务器,以优化访问速度。
3.4 观察负载均衡器的存在
通过分析多次运行 traceroute 命令的响应时间,可以发现路径中负载均衡器的存在。例如,第3跳的响应时间在不同运行中有显著变化,这可能是负载均衡器根据流量情况调整了路径。想一想,负载均衡器会采用什么样的策略来调整路径?
- 轮询调度:按顺序将请求分配到不同的服务器上。
- 最少连接调度:优先将新请求发送给当前处理连接最少的服务器。
- 响应时间调度:根据服务器的响应时间来选择路径,响应时间越短的服务器优先分配流量。
- 动态流量调度:根据当前的网络流量和服务器负载,实时调整流量的分配和路径。
3.5 分析网络故障
假设某天,你的同学要在雅思官网上进行考试报名,突然发现在家(电信网络)无法登录雅思官网,后来发现通过VPN进入校园网后,可登录雅思官网。你猜测出现这样的情况的原因是什么,如何验证你的猜测?
运营商的网络屏蔽:电信运营商可能对特定的网站或服务器有屏蔽或访问限制,而校园网没有这类限制。- DNS解析问题:电信网络的DNS服务器可能无法正确解析雅思官网的域名,导致无法访问。
- IP地址屏蔽:雅思官网可能针对某些IP地址段进行屏蔽,而电信网络的IP在屏蔽范围内,校园网的IP不在屏蔽范围内。
验证猜测的方法:
- 切换DNS服务器:尝试在电信网络中切换到公共DNS(如Google DNS或Cloudflare DNS)以排除DNS解析问题。
- 使用traceroute命令分析路径:分别在电信网络和校园网运行 traceroute,对比路径差异,分析数据包是否在某一跳中被阻止或丢失。
- 检查IP封锁:通过检查电信网络和校园网分配的IP地址段,确认是否有IP屏蔽的情况。