通过本实验,熟练掌握Wireshark的操作和使用,学习对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 连接;
⑦ 浏览器收到页面并显示给用户。
HTTP有两类报文:从客户到服务器的请求报文和从服务器到客户的响应报文。
每个字段之间有空格分隔,每行的行尾有回车换行符。各字段的意义如下:
① 请求行由三个字段组成:
* 方法字段,最常用的方法为 “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:在PC 机上运行Wireshark,开始截获报文;
步骤2:从浏览器上访问Web 界面,如http://www.163.com。打开网页,待浏览器的状态栏出现 “完毕”信息后关闭网页。
步骤3:停止截获报文,将截获的报文命名为http-学号保存。
1、下载Wireshark,使电脑连接上无线网络,并选择抓包方式为WLAN。
2、在cmd中输入命令“ipconfig”,得到本机IPv4 地址10.63.17.14,并在捕获过滤器中输入“ip src host 10.63.17.14”。(校园网IPv4是自动获取)
3、开始捕获数据包,打开网页,待网页加载完毕,停止抓包。
4、在“应用显示过滤器”填上“http”,即可筛选出符合要求的http报文。
基于上述操作步骤,可以获得相关网络数据包如图:
答:有两种。上图中编号为120和335为客户机到服务器的请求报文,编号为124和339为服务器到客户机的应答报文。
表1.1 HTTP 请求报文格式
方 法 |
GET |
版 本 |
HTTP/1.1 |
URL |
http://www.baidu.com/ |
||
首部字段名 |
字段值 |
字段所表达的信息 |
|
Host |
www.baidu.com\r\n |
客户端指定自己想访问的http服务器的域名/IP 地址和端口号。 |
|
User-Agent |
Mozilla/5.0(Windows NT 10.0;Win64; x64) AppleWt/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\r\n |
用户代理,是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。 |
|
Accept |
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n |
告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。 |
|
Upgrade |
1\r\n |
请求服务端升级协议 |
|
Accept-Encoding |
gzip, deflate\r\n |
设置接受的编码格式 |
|
Connection |
Keep-Alive\r\n |
设置当前连接和hop-by-hop协议请求字段列表的控制选项 |
|
Accept-Language |
zh-CN\r\n |
设置接受的语言 |
对应数据包截图:
表1.2 HTTP 应答报文格式
版 本 |
HTTP/1.1 |
状态码 |
302 |
短 语 |
Moved Temporarily |
||
首部字段名 |
字段值 |
字段所表达的信息 |
|
Date |
Tue, 19 Mar 2019 05:21:13 GMT\r\n |
设置消息发送的日期和时间 |
|
Content-Type |
text/html\r\n |
服务器通过这个头告诉浏览器回送数据的类型,这里是返回HTML的格式 |
|
Location |
https://www.baidu.con/\r\n |
在重定向中或者创建新资源时使用 【实验中要求的是HTTP抓包,但是浏览器默认了HTTPS的URL,所以在这里使用了该字段,且状态码显示了302 FOUND跳转,大家如果按照实验指导书去做,很可能也会出现这种情况】 |
|
Server |
BWS/1.1\r\n |
服务器名称 |
|
X-UA-Compatible |
IE=Edge,chrome=1\r\n |
推荐首选的渲染引擎来展示内容,通常向后兼容,也用于激活IE中内嵌chrome框架插件 |
参考资料:https://www.cnblogs.com/chunlei36/p/6927365.html
对应数据包截图:
建立了一个连接,客户机为54066端口,而服务器为80端口(特殊端口,通常用于HTTP超文本传输协议)。
参考资料:
https://blog.csdn.net/qq_29166327/article/details/78573629(HTTP工作流程)
https://blog.csdn.net/qq_33616529/article/details/78288883(HTTP请求响应步骤)
http://www.xjishu.com/zhuanli/62/201610831336.html(302跳转方法)
HTTP的工作流程大致为:
1、建立连接。先解析DNS,把localhost变成ip(127.0.0.1),然后根据127.0.0.1和端口号8080(没有端口号则使用默认的端口)建立socket。也可以理解为通过“三次握手”建立TCP连接,确定通讯正常。
2、发送请求命令。socket建立好之后,客户端开始向web服务器发送请求命令(GET/POST等)。
3、发送请求头(和请求正文如果有)。客户端先发送与自身相关的信息,再发送空行表示请求头发送完毕,如果是post则继续发送请求正文。
4、回传状态行。应答第一步,发送协议版本和状态码(200、503、404等)
5、回传应答头。应答第二步,先发送自身相关信息、Content-Type(必须)及被请求的文档,在发送空行宝石应答头发送完毕。
6、回传应答正文。应答第三步,根据应答头的Content-Type指定的格式发送应答正文。
7、关闭连接。一次‘会话’完成,如果设置了Connection:keep-alive则TCP连接不关闭,否则关闭连接。
结合实验图来看具体的情况如下:
【117-119】为HTTP连接之前的TCP三次握手过程。
第一次握手【117】:主机A发送位码为syn=1,随机产生seq number数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手【118】:主机B收到请求后确认联机信息,向A发送ack number(Aseq+1),syn=1,ack=1。
第三次握手【119】:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
这里,主机A是客户端口54066,B为服务器端口80。完成三次握手,主机A与主机B开始传送数据。
【120】为请求命令GET的发送。在TCP三次握手之后,连接已经建立,可以传输数据。
【121-122】为客户端向服务器请求(头)信息的 过程,如user-agent,host等。
【123】为客户端请求的Host字段,即请求的ip地址或域名被服务器返回。
返回的这个Host是请求的、实验要求的HTTP类型,但是目前百度采用的是HTTPS,因此出现了重定向302。302状态码应用的典型场景是服务器页面路径的重新规划,比如一个portal页面,换了新的域名,但是老的域名地址还有很多用户在使用,这样可以对老域名配置302跳转到新域名地址,保证服务的延续。另外对于一些客户端预埋的Url链接,免不了老版本地址失效与更改,将老地址配置302跳转到新地址,这样就能够全面兼容所有客户端版本。
【124】服务器向本地发送HTTP 302错误,要求本地进行重定向请求。
【125】本地54066端口通过TCP向服务器80端口请求信息,这次的请求已经重定向。
【126-127】服务器向本地发送请求的数据。
【128-129】数据请求完毕,这是一个TCP四次挥手,和强制断开连接的过程。
TCP终止连接的四次挥手过程如下:
1. 首先进行关闭的一方(即发送第一个FIN)将执行主动关闭,而另一方(收到这个FIN)执行被动关闭。【在128的时候,已经发送了一个FIN】
2. 当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
3. 同时TCP服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN。
4. 客户必须发回一个确认,并将确认序号设置为收到序号加1。
但是这里只显示了2步,不是一个完整的四次挥手的过程。其原因在于,第【129】的时间上,出现了RST包,而它用于强制关闭TCP链接。
TCP连接关闭的正常方法是四次握手。但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记。
填表结果如下:
表1.3 HTTP 协议工作过程
HTTP 客户机端口号 |
HTTP 服务器端口号 |
步骤说明 |
54066 |
80 |
发送SYN包,开始一次握手,开始建立连接 |
54066 |
80 |
二次、三次握手,连接建立 |
54066 |
80 |
客户机发起HTTP GET请求 |
54066 |
80 |
客户机向服务器请求具体数据信息如服务器ip等 |
54066 |
80 |
服务器应答,发送状态码 |
54066 |
80 |
具体的请求数据发送 |
54066 |
80 |
客户机发送FIN包,开始四次挥手,准备断开连接 |
54066 |
80 |
进行四次挥手过程断开连接,或发送RST包强制断开 |