基本 HTTP GET/response 交互
实验步骤
我们开始探索 HTTP,方法是下载一个非常简单的 HTML 文件 非常短,并且不包含嵌入的对象。执行以下操作:
- 启动您的浏览器。
- 启动Wireshark数据包嗅探器,如Wireshark实验-入门所述(还没开始数据包捕获)。在display-filter-specification窗口中输入“http”(只是字母,不含引号标记),这样就在稍后的分组列表窗口中只捕获HTTP消息。(我们只对HTTP协议感兴趣,不想看到其他所有的混乱的数据包)。
- 稍等一会儿(我们将会明白为什么不久),然后开始Wireshark数据包捕获。
4. 在浏览器中输入以下内容 http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html 您的浏览器应显示非常简单的单行HTML文件。
5. 停止Wireshark数据包捕获。
在分组列表窗口中显示了两个被捕获的 HTTP 消息:GET 消息(从您的浏览器发送到 gaia.cs.umass.edu 的 web 服务器)和从服务器到浏览器的响应消息。分组内容窗口显示所选消息的详细信息(在这种情况下为 HTTP OK 消息)。回想一下,因为 HTTP 消息被装载在 TCP 报文段内,该报文段是在 IP 分组封装吗,进而在以太网帧,和帧中封装,所以界面中显示了帧,以太网,IP,TCP 分组信息以及 HTTP 报文信息。我们想最小化非 HTTP 数据的显示,所以确保帧,以太网,IP 和 TCP 行的信息被隐藏。
问题回答
通过查看HTTP GET和响应消息中的信息,回答以下问题。 在回答以下问题时,您应该指出您在消息中的哪个具体位置找到了回答以下问题的信息。 当您上交作业时,请注明输出,显示您在哪些地方表示了您的答案。
- 您的浏览器是否运行 HTTP 版本 1.0 或 1.1?服务器运行什么版本的 HTTP?
服务器:
浏览器(要提交 GET 请求):
由此可见,浏览器和主机都是使用了 HTTP 1.1 版本。
2. 您的浏览器会从接服务器接受哪种语言(如果有的话)?
经查阅资料,接收的语言为简体中文。
- 您的计算机的 IP 地址是什么? gaia.cs.umass.edu 服务器地址呢?
我的计算机:192.168.67.249
服务器:128.119.245.12
4. 服务器返回到浏览器的状态代码是什么?
一开始没注意,返回了 304,说明之前的缓存还能用,看来是因为我刷新了页面的原因。重新抓包返回 200 OK 表示请求成功,信息在返回的报文里。
- 服务器上HTML文件的最近一次修改是什么时候?
最后一次修改是 2020 年 4 月 21 日,星期二,5 时 59 分 02秒。
6. 服务器返回多少字节的内容到您的浏览器?
返回了 128 bytes 字节。
7. 通过检查数据包内容窗口中的原始数据,你是否看到有协议头在数据包列表窗口中未显示? 如果是,请举一个例子。
经查证资料,“favicon.ico” 这玩意是个图标,是收藏夹图标和浏览器标签。浏览器可能会自动请求网站根目录的这个图标,若目标网站没有这个图标就会返回 404。这个信息是个干扰,可以直接忽略掉。
HTTP 条件 Get/response 交互
实验步骤
大多数Web浏览器使用对象缓存,从而在检索 HTTP 对象时执行条件 GET。执行以下步骤之前,请确保浏览器的缓存为空,现在按下列步骤操作:
- 启动您的浏览器,并确保您的浏览器的缓存被清除,如上所述。
- 启动Wireshark数据包嗅探器。
3. 在浏览器中输入以下 URL http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file2.html 您的浏览器应显示一个非常简单的五行HTML文件。
4. 再次快速地将相同的URL输入到浏览器中(或者只需在浏览器中点击刷新按钮)。
5. 停止Wireshark数据包捕获,并在 display-filter-specification 窗口中输入 “http” ,以便只捕获 HTTP 消息,并在数据包列表窗口中显示。
我抓的包有一些其他干扰,直接忽略。
问题回答
- 检查第一个从您浏览器到服务器的 HTTP GET 请求的内容。您在 HTTP GET 中看到了 “IF-MODIFIED-SINCE” 行吗?
翻翻翻,并没有发现。
2. 检查服务器响应的内容。服务器是否显式返回文件的内容? 你是怎么知道的?
有,返回了一段 HTML 标记码,包括了网页的文本。
3. 现在,检查第二个 HTTP GET 请求的内容。您在 HTTP GET 中看到了 “IF-MODIFIED-SINCE:” 行吗?如果是,“IF-MODIFIED-SINCE:” 头后面包含哪些信息?
看到了,包含的是一段时间信息,这个时间与网页最后一次修改时间一致。
查证了资料,知道了这个标签的含义。
If-Modified-Since是标准的HTTP请求头标签,在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。
如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示到浏览器中。
如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
- 针对第二个 HTTP GET,从服务器响应的 HTTP 状态码和短语是什么?服务器是否明确地返回文件的内容?请解释。
这不就是我刚才遇到的问题吗?附上资料:
如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码。简单的表达就是:服务端已经执行了GET,但文件未变化。
也就是说,当前这个页面的缓存还保存着,并且服务器没有修改,因此这个缓存还能拿来用,就不需要服务器再发一遍了。
检索长文件
实验步骤
在我们到目前为止的例子中,检索的文档是简短的 HTML 文件。 接下来我们来看看当我们下载一个长的 HTML 文件时会发生什么。按以下步骤操作:
- 启动您的浏览器,并确保您的浏览器缓存被清除,如上所述。
- 启动Wireshark数据包嗅探器
3. 在您的浏览器中输入以下URL http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file3.html 您的浏览器应显示相当冗长的一个文件。
4. 停止Wireshark数据包捕获,并在display-filter-specification窗口中输入“http”,以便只显示捕获的HTTP消息。
在分组列表窗口中,您应该看到您的 HTTP GET 消息,然后是对您的 HTTP GET 请求的多个分组的 TCP 响应。这个多分组响应值得进行一点解释。HTTP响应消息由状态行组成,后跟标题行,后跟一个空行,后跟实体主体。在我们的 HTTP GET 这种情况下,响应中的实体主体是整个请求的 HTML 文件。在我们的例子中,HTML 文件相当长,4500 字节太大,一个 TCP 数据包不能容纳。因此,单个 HTTP 响应消息由 TCP 分成几个部分,每个部分包含在单独的 TCP 报文段中。
问题回答
- 您的浏览器发送多少 HTTP GET 请求消息?哪个数据包包含了文件的消息?
发送了一个请求信息。
这个包包含了文件的消息。
2. 哪个数据包包含响应HTTP GET请求的状态码和短语?
3. 响应中的状态码和短语是什么?
200 OK,表示请求成功,信息在返回的报文里。
4. 需要多少包含数据的 TCP 段来执行单个 HTTP 响应和文本?
目测需要 5 个包含数据的 TCP 段。
具有嵌入对象的 HTML 文档
现在我们已经看到Wireshark如何显示捕获的大型HTML文件的数据包流量,我们可以看看当浏览器使用嵌入的对象下载文件时,会发生什么。
实验步骤
- 启动您的浏览器。
- 启动Wireshark数据包嗅探器。
3. 在浏览器中输入以下 URL http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file4.html 您的浏览器应显示包含两个图像的短 HTML 文件。这两个图像在基本 HTML 文件中被引用。也就是说,图像本身不包含在 HTML 文件中;相反,图像的URL包含在已下载的HTML文件中。您的浏览器将不得不从指定的网站中检索这些图标。
停止 Wireshark 数据包捕获,并在 display-filter-specification 窗口中输入 “http”,以便只显示捕获的 HTTP 消息。
问题回答
- 您的浏览器发送了几个 HTTP GET 请求消息? 这些 GET 请求发送到哪个IP地址?
发送了 3 个 HTTP GET 请求消息,这些 GET 请求发送到 128.119.245.12。
2. 浏览器从两个网站串行还是并行下载了两张图片?请说明。
应该是串行下载,因为根据抓到的包,在第一张图片被下载完毕之后再开始下载第二张。不过这不符合我的认知,因为并行下载才是高效的方式,所以怀疑有干扰。
从排除干扰的包来看,应该是并行下载。
HTTP 认证
实验步骤
最后,我们尝试访问受密码保护的网站,并检查网站的 HTTP 消息交换的序列。URL http://gaia.cs.umass.edu/wireshark-labs/protected_pages/HTTP-wireshark-file5.html 是受密码保护的。执行以下操作:
- 请确保浏览器的缓存被清除,如上所述,然后关闭你的浏览器,再然后启动浏览器
- 启动Wireshark数据包嗅探器。
3. 在浏览器中输入以下 URL http://gaia.cs.umass.edu/wireshark-labs/protected_pages/HTTP-wiresharkfile5.html 在弹出框中键入所请求的用户名和密码。
4. 停止 Wireshark 数据包捕获,并在 display-filter-specification 窗口中输入 “http”,以便只显示捕获的 HTTP 消息。
由于我只能抓到 404,所以我就使用现成的包来看。
问题回答
- 对于您的浏览器的初始HTTP GET消息,服务器响应(状态码和短语)是什么响应?
401 Authorization Required,该状态码表示用户没有访问权限,需要进行身份认证。
2. 当您的浏览器第二次发送HTTP GET消息时,HTTP GET消息中包含哪些新字段?
多了 Authorization 和 Credentials 字段,这两个字段应该是在向网页提交用户名和密码。
参考资料
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社
favicon.ico请求处理
HTTP的请求头标签 If-Modified-Since
304状态码
401错误