实验4-HTTP协议的运行过程
一、实验目的
掌握HTTP协议的运行过程
学习多重请求方式
二、实验内容
任务一、HTTP GET请求
任务二、HTTP响应
任务三、对每个URL的多重GET请求
三、实验要求
采用以学生自主实验为主的开放模式组织教学
四、实验准备
在进行跟踪之前,我们首先清空Web浏览器的高速缓存来确保Web网页是从网络中获取的,而不是从高速缓存中取得的。(大多数浏览器都提供此类功能。在Mozilla中,我们在Edit菜单中选择Preferences,然后在Advanced Category下选择Cache选项,选择Clear Cache按钮来清空所有高速缓存中的网页。)之后,我们还要在客户端清空DNS高速缓存,来确保Web服务器域名到IP地址的映射必须从网络中请求。在Windows XP机器上,可在命令提示行输入ipconfig/flushdns完成此操作。(如果失败可以尝试开始DHCP Client服务和DNS Client服务)。
五、实验原理、方法和手段
1、所有主机使用【快照】将虚拟机恢复到初始状态。
2、本实验1人1组,独立进行试验。使用wireshark抓取数据包进行分析。
六、实验条件
网络协议分析器Wireshark
图4-1 实验配置
七、实验步骤
在浏览器中输入两个网址,网页内容尽量简单,使用Wireshark捕获分组。具体步骤可以参考以下相关实例。
在PC机上运行Wireshark准备捕获分组。在Web浏览器上,输入mail.tju.edu.cn。这些URL都指向比较简单的网页。然后使用wireshark捕获分组。捕获结果如下图所示:
在URL http://mail.tju.edu.cn中,mail.tju.edu.cn是一个具体的Web服务器的域名。首先看一下分组8和分组9。分组8是一个将域名mail.tju.edu.cn转换成对应的IP地址的请求,分组9包含了转换的结果220.181.97.122。这两个分组使用的应用层协议是DNS( Domain Name System,域名系统)。
注:若是因为屏幕显示问题看不到分组9最后的Info字段中的IP地址,可选中分组9,然后在ICMP中的Answers中查看。在Wireshark中输入过滤条件“dns”可以定位到DNS报文。
这个转换是必要的,因为网络层协议——IP协议,是通过类似220.181.97.122这样的点分十进制地址来表示因特网主机的,而不是通过mail.tju.edu.cn这样的域名。当输入URL mail.tju.edu.cn时,将要求Web浏览器从主机mail.tju.edu.cn上请求数据,但首先Web浏览器必须确定这个主机的IP地址。
随着转换的完成,我们的Web浏览器就与Web服务器建立一个TCP连接。这个连接的建立在分组10到12中有显示。
注:在Wireshark中定位到dns请求分组的分组号后,紧接着的分组就是建立TCP连接的分组。在Wireshark中发现有时候双方会建立多个TCP连接,具体哪些连接有效,还需要进一步判断。我们可以分别选中不同的连接,“右键->追踪TCP流”,显示的数据是空的表示无效的TCP连接,不为空的是有效的TCP连接。
最后, Web浏览器使用已建立好的TCP连接来发送请求“GET/HTTP/1.1”,如分组13所示。这个分组描述了要求的行为(“GET”)及文件(只写“/”是因为我们没有指定额外的文件名),还有所用到的协议的版本(“HTTP/1.1”)。
1. HTTP GET请求
图4-2 HTTP GET请求
这个基本请求行后跟随着一系列额外的请求首部。如果你在协议框中选择了分组13的HTTP层,你会看到这些首部。在首部后的“\r\n”表示一个回车和换行,以此将该首部与下一个首部隔开。
“Host”首部在HTTP 1.1版本中是必需的,它描述了URL中机器的域名,本例中是mail.tjcu.edu.cn。这就允许了一个Web服务器在同一时间支持许多不同的域名(例如, www.foo.com, www.bar.com)。有了这个首部, Web服务器就可以区别客户试图连接哪一个Web服务器,并对每个客户响应不同的内容。这就是HTTP 1.0到1.1版本的主要变化。
User-Agent首部描述了提出请求的Web浏览器及客户机器。
接下来是一系列的Accept首部,包括Accept(接受)、 Accept-Language(接受语言)、AcceptEncoding(接受编码)及Accept-Charset(接受字符集)。它们告诉Web服务器客户Web浏览器准备处理的数据类型。Web服务器可以将数据转变为不同的语言和格式。这些首部表明了客户的能力及偏好。
Keep-Alive及Connection首部描述了有关TCP连接的信息,通过此连接发送HTTP请求和响应。它表明在发送请求之后连接是否保持活动状态及保持多久。大多数HTTP 1.1连接是持久的(persistent),意思是在每次请求后不关闭TCP连接,而是保持该连接以接受从同一台服务器发来的多个请求。这是另一个不同于HTTP 1.0版本的较大改变;当你从同一台服务器上获取多个对象时,它能够大大地提高性能。
2. HTTP 响应
我们已经查看了由Web浏览器发送的请求,现在,我们将在分组18中观察Web服务器的回答。
响应首先发送“HTTP/1.1 200 OK”,指明由它开始使用HTTP 1.1版本来发送网页。同样,在响应分组中,它后面也跟随着一些首部。最后,被请求的实际数据被发送。服务器还在Date首部中列出了数据发送的日期和时间。
有的响应中会包含Cache-control首部,用于描述是否将数据的副本存储或高速缓存起来,以便将来引用。(本例中没有)一般个人的Web浏览器会高速缓存一些本机最近访问过的网页,随后对同一页面再次进行访问时,如果该页面仍存储于高速缓存中,则不再向服务器请求数据。类似地,在同一个网络中的计算机可以共享一些存在高速缓存中的页面,防止多个用户通过到其它网络的低速网络连接从网上获取相同的数据。这样的高速缓存被称为代理高速缓存(proxy cache)。
如果Cache-control首部的值是“private”的。这表明服务器已经对这个用户产生了一个个性化的响应,而且可以被存储在本地的高速缓存中,但不是共享的高速缓存代理中。
在HTTP请求中, Web服务器列出内容类型及可接受的内容编码。此例中Web服务器选择发送内容的类型是text/html且内容编码为gzip。这表明数据部分是压缩了的HTML。
你可以自己查看Wireshark中的数据,但由于它是被压缩过的,所以不会显示出含义。 Web浏览器收到这些数据后,会对其解压缩,显示HTML页面。在浏览器中,从View菜单中选择Source或Page Source就可以查看未压缩的HTML源代码。
注:由于现在网页的变化,例如,网页使用HTTPS协议而不是HTTP协议,因此,有时候在Wireshark中抓取的HTTP响应分组可能会不完整,例如,HTTP/1.1 302而不是HTTP /1.1 200 OK。
3. 对每个URL的多重GET请求
下一步我们在浏览器中输入www.gnu.org。虽然我们只输入了一个URL,但是我们会发现客户端提出了多个GET请求。
从一连串的分组中选择一个,从Analyze菜单中选择“Follow TCP Stream”,整个数据流便显示在一个独立窗口中。所有由Web浏览器发送的数据显示为一种颜色,而所有由Web服务器发送的数据显示为另一种颜色。你也可以在左下方菜单(初始标签为Entire conversation)选择适当的条目,来隔离不同的会话双方所发送的数据。 HTTP数据流跟踪见下图。
图4-5 HTTP数据流跟踪
八、思考题
根据你实际做的实验结果回答下列问题:
- DNS服务器的IP地址是多少?
答:123.150.150.150(第一个DNS报文的目的IP)
- 你所连接的第一个网址的IP地址是多少?
答:连接的第一个网站mail.tju.edu.cn的IP地址是220.181.97.122
根据文件httpWebBrowsing.cap回答下列问题。
3. 跟踪我们的Web浏览器和www.google.com Web服务器之间的TCP数据流,分离出浏览器发出的请求,并将文本复制下来。
答:
4. 发送到www.gnu.org 的HTTP请求有几次,每次请求的是哪些对象,每个对象有多大?你是怎么知道的?
答:发送到www.gnu.org的HTTP请求有四次,其中,两次来自于端口号3841,两次来自于端口号3842。如下图所示。请求的对象分别是“/”(表示www.gnu.org的跟目录)、gnu-head-mini.png、gnu.css和gnu-head-sm.jpg。
也可以使用过滤条件“http and (ip.dst==199.232.41.10)”查看请求的对象。
通过响应查看每个对象的大小,可以使用过滤条件“http and (ip.src==199.232.41.10)”,然后选中每个响应,在Content-Length或者File-Data中查看文件大小,例如,下图中的文件大小是12671字节。
5. 这些请求中哪些是来自于端口3841的连接,有几个是来自于端口3842的连接?
答:分组26和分组50的请求来自于端口3481,分组43和分组49的请求来自于端口3482。
6. 哪个分组包含翻译www.gnu.org的DNS请求和应答? www.gnu.org的IP地址是多少?
答:分组21和分组22包含翻译www.gnu.org的DNS请求和应答。www.gnu.org的IP地址是199.232.41.10。