前言:这是个比较简单的实验,个人认为最难的不是分析部分,而是能否抓到一个好的包。为了抓到一个好的包我试了很多个网站,终于抓京东时抓到了令我个人最满意的包,因为没有其他各种杂乱的报文,就是那几条必要的报文,因此如果抓的包不满意的话可以多尝试几个不同的网站。
一、实验目的
通过本实验,熟练掌握Wireshark的操作和使用,学习对HTTP协议进行分析。
二、实验内容
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有两类报文:从客户到服务器的请求报文和从服务器到客户的响应报文。
图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.实验环境与说明
(1)实验目的
在PC 机上访问Web 页面,截获报文,分析HTTP 协议的报文格式和HTTP协议的工作过程。
(2)实验设备和连接
本地实验室环境,无须设备连接;
注意:请通过访问可以连接的WWW 站点或使用IIS 建立本地WWW 服务器来进行实验。
(3)实验分组
每四名同学为一组,每人一台计算机独立完成实验。
三、实验过程
1.开始抓包
1)打开wireshark
在官网按照系统版本选择下载好wireshark后,打开wireshark主页面
2)打开WLAN接口开始抓包
点击捕获-选项,可以看到有很多接口(如本地连接 *10,本地连接 *9,WLAN等),这里我们打开WLAN接口,此时wireshark开始抓包
3)打开jd.com网站
使用任意浏览器打开网站,这里使用QQ浏览器。打开jd.com后等待页面加载完毕,然后关闭网站,回到wireshark软件,选择暂停抓包
wireshark抓包情况如下:
2.过滤
wireshark有一个强大的功能就是可以选择过滤出想要的抓包信息。由于我们一打开WLAN接口软件就开始抓包,所以抓的包中可能包含不是关于想要jd.com的相关报文。可以在过滤器上输入http来获得相关HTTP协议的报文,这里我们可以使用过滤器。由于我们想要获得HTTP协议的报文,因此我们在过滤栏输入http过滤出http协议的报文信息:
3.保存
停止截获报文,将截获的报文命名为http-学号保存。
4.分析
点开第一条HTTP报文信息,可以看到
四、回答问题
1)综合分析截获的报文,查看有几种HTTP 报文?
有两种,如下图所示,分别为请求报文和应答报文
- 请求报文:下图第三行为从客户端发往服务器的请求报文,其最左边箭头为向左表示请求报文。其中Source的10.63.200.105是客户端的ip,Destination的106.39.171.134是服务器的ip
- 响应报文:下图第二行为服务器发往客户端的应答报文 。其中Source的106.39.171.134是服务器的ip,Destination的10.63.200.105是客户端的ip
2)在截获的HTTP 报文中,任选一个HTTP 请求报文和对应的 HTTP 应答报文,仔细分析它们的格式,填写表1.1 和表1.2。
1.请求报文
下面分析一下序列号为7的HTTP请求报文的相关信息,如下图所示
2.应答报文
下面分析一下序列号为9的HTTP应答报文的相关信息,如下图所示
3)分析在截获的报文中,客户机与服务器建立了几个连接?服务器和客户机分别使用了哪几个端口号?
右键第一条请求报文-追踪流-TCP流,查看连接,结果如下:
可以看到只有一条连接,其中服务器端口为80,客户机的端口为65450
4)综合分析截获的报文,理解HTTP 协议的工作过程,将结果填入表1.3中。
HTTP的工作流程大致为:
- 建立连接。先解析DNS,把local host变成ip(127.0.0.1),然后根据127.0.0.1和端口号80(没有端口号则使用默认的端口)建立socket。也可以理解为通过“三次握手”建立TCP连接,确定通讯正常。
- 发送请求命令。socket建立好之后,客户端开始向web服务器发送请求命令(GET/POST等)。
- 发送请求头(和请求正文如果有)。客户端先发送与自身相关的信息,再发送空行表示请求头发送完毕,如果是post则继续发送请求正文。
- 回传状态行。应答第一步,发送协议版本和状态码(200、503、404等)
- 回传应答头。应答第二步,先发送自身相关信息、Content-Type(必须)及被请求的文档,在发送空行宝石应答头发送完毕。
- 回传应答正文。应答第三步,根据应答头的Content-Type指定的格式发送应答正文。
- 关闭连接。一次‘会话’完成,如果设置了Connection:keep-alive则TCP连接不关闭,否则关闭连接。
下面按照报文图进行分析
[1] 第一次握手:客户端发送SYN到服务器,并进入SYN_SENT状态。SYN :标志位,表示请求建立连接。Seq = 0 :初始建立连接值为0,数据包的相对序列号从0开始,表示当前还没有发送数据。Ack =0:初始建立连接值为0,已经收到包的数量,表示当前没有接收到数据。
[4] 第二次握手:服务器收到请求后,回送SYN+ACK信令到客户端,此时服务器进入SYN_RECV状态,Seq = 0 :初始建立值为0,表示当前还没有发送数据,Ack = 1 : 表示当前端成功接收的数据位数,虽然客户端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位。
[6] 第三次握手:主客户端收到SYN+ACK包,向服务器发送确认ACK包,客户端进入ESTABLISHED状态,服务器收到请求后也进入ESTABLISHED状态,完成三次握手,此时TCP连接成功,客户端与服务器开始传送数据。ACK :标志位,表示已经收到记录。Seq = 1 :表示当前已经发送1个数据。
为什么是三次握手
1)第一次握手成功:说明客户端的数据可以被服务端收到,说明客户端的发功能可用,说明服务端的收功能可用。但客户端自己不知道数据是否被接收。
2)第二次握手成功:说明服务端的数据可以被客户端收到,说明服务端的发功能可用,说明客户端的收功能可用。同时客户端知道自己的数据已经正确到达服务端,自己的发功能正常。但是服务端自己不知道数据是否被接收。
3)第三次握手成功:说明服务端知道自己的数据已经正确到达客户端端,自己的发功能正常。至此服务成功建立。
这里,主机A是客户端口51253,B为服务器端口80。完成三次握手,主机A与主机B开始传送数据。
[7] 为请求命令GET的发送。在TCP三次握手之后,连接已经建立,可以传输数据。
交互过程中,SEQ表示发送的数据,LEN表示发送的数据长度,下一次的SEQ就等于当前SEQ加上LEN。ACK表示接收的数据位。客户端和服务端分别计算自己的增长值。
[8] 服务端收到请求,发送ACK应答代表收到请求
[9] 服务器向本地发送HTTP 302错误,要求本地进行重定向请求。
[10] 本地65450端口通过TCP向服务器80端口请求信息,这次的请求已经重定向,返回302时一般会在响应头里加上一个location,包含这一个要跳转的url,使浏览器跳转到这个url。
[41] 第一次挥手:客户端 发送一个[FIN+ACK],表示自己没有数据要发送了,想断开连接
[42] 第二次挥手:服务端收到FIN后,知道不会再有数据从客户端传来,发送ACK进行确认
[43] 第三次挥手:服务端发送[FIN+ACK]给对方,表示自己没有数据要发送了,然后直接断开TCP会话的连接,释放相应的资源。
[44] 第四次挥手:客户端收到了服务端的FIN信令后,发送ACK确认消息。断开了到服务端的TCP连接,释放所有资源。当服务端收到客户端的ACK回应后,会进入CLOSE状态,并关闭本端的会话接口,释放相应资源。
填表结果如下:
五、实验总结
1.学习到的知识
通过这次实验学习到了很多的知识点。首先学会了使用wireshark来截取各种网络数据包,并可以对数据包详细信息进行一定分析。同时对HTTP协议有了更深一层次的理解,体会到了TCP建立的三次握手的取消的四次挥手的过程。尤其在实验的过程中学习到了HTTP与HTTPS协议的不同,在http://www.jd.com网站访问的报文中发现学习了一些网站从HTTP到HTTPS的过渡,通过在HTTP响应报文中添加首部行Location记录新的HTTPS网址可以实现跳转。本次实验受益匪浅,对课本的理论知识有了更深的理解和巩固。
2.遇到的问题
在实验中也遇到了很多问题,比如wireshark的使用方法,网上有许多教程,跟着一两个教程完整的抓一次包即可基本学会。还有有时候会抓不到想要的http协议,这可能与网站有关(换不同网站),也可能与网络有关,也可以重启wireshark多试验几遍来获得想要的报文信息。