Wireshark实验——HTTP 协议

URL

在 WWW(world wide web)上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL,它是WWW的统一资源定位标志,就是指网络地址。格式为:

protocol :// hostname[:port] / path / [;parameters][?query]#fragment
参数 说明
protocol(协议) 指定使用的传输协议
hostname(主机名) 存放资源的服务器的域名系统(DNS) 主机名或 IP 地址
port(端口号) 可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号
path(路径) 由零或多个“/”符号隔开的字符串,用来表示主机上的一个目录或文件地址。
parameters(参数) 用于指定特殊参数的可选项
query(查询) 可选,用于给动态网页传递参数
fragment(信息片断) 用于指定网络资源中的片断

HTTP 协议

Web 的应用层协议是超文本传输协议,这是一个简单的请求-响应协议,是 Web 的核心。对于 HTTP,这是由 2 个程序实现——客户端程序和服务器程序,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,通过 HTTP 报文进行回话。对于 Web 来说,Web 浏览器是 HTTP 的客户端,Web 服务器是 HTTP 服务端,Web 页面是由对象组成的,多数这样的页面需要内含 HTML 基本文件和几个引用对象。
TCP 协议是 HTTP 的支撑运输协议,这就说明 HTTP 客户端需要向服务器发起 TCP 连接。通过 TCP 协议,无论是客户向服务器发送 HTTP 请求还是服务器响应客户的 HTTP 响应,都可以完整的到达目的地。
HTTP 是个无状态协议,也就是说 HTTP 服务器不保存关于客户的任何信息,因此要是客户在很短的时间内重复请求某个对象,服务器仍然会做出响应,重新发送响应报文。为什么?这是因为有状态协议更为复杂,主要体现在 2 大方面:

  1. 有状态协议要维护历史状态;
  2. 若用户或服务器失效,将导致状态出现不一致。


HTTP 协议对资源有如下操作:

方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储的一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源

一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

基本 HTTP GET/response 交互

实验步骤

我们开始探索 HTTP,方法是下载一个非常简单的 HTML 文件 非常短,并且不包含嵌入的对象。执行以下操作:

  1. 启动您的浏览器。
  2. 启动 Wireshark 数据包嗅探器,在 display-filter-specification 窗口中输入 “http”(只是字母,不含引号标记),这样就在稍后的分组列表窗口中只捕获 HTTP 消息。(我们只对 HTTP 协议感兴趣,不想看到其他所有的混乱的数据包)。
  3. 稍等一会儿(我们将会明白为什么不久),然后开始Wireshark数据包捕获。


4. 在浏览器中输入提供的 URL,您的浏览器应显示非常简单的单行 HTML 文件。


5. 停止 Wireshark 数据包捕获。


在分组列表窗口中显示了两个被捕获的 HTTP 消息:GET 消息(从您的浏览器发送到 gaia.cs.umass.edu 的 web 服务器)和从服务器到浏览器的响应消息。分组内容窗口显示所选消息的详细信息(在这种情况下为 HTTP OK 消息)。回想一下,因为 HTTP 消息被装载在 TCP 报文段内,该报文段是在 IP 分组封装吗,进而在以太网帧,和帧中封装,所以界面中显示了帧,以太网,IP,TCP 分组信息以及 HTTP 报文信息。我们想最小化非 HTTP 数据的显示,所以确保帧,以太网,IP 和 TCP 行的信息被隐藏。

问题回答

通过查看HTTP GET和响应消息中的信息,回答以下问题。 在回答以下问题时,您应该指出您在消息中的哪个具体位置找到了回答以下问题的信息。 当您上交作业时,请注明输出,显示您在哪些地方表示了您的答案。

  1. 您的浏览器是否运行 HTTP 版本 1.0 或 1.1?服务器运行什么版本的 HTTP?

服务器:

浏览器(要提交 GET 请求):

由此可见,浏览器和主机都是使用了 HTTP 1.1 版本。
2. 您的浏览器会从接服务器接受哪种语言(如果有的话)?


经查阅资料,接收的语言为简体中文。

  1. 您的计算机的 IP 地址是什么? gaia.cs.umass.edu 服务器地址呢?


我的计算机:192.168.67.249
服务器:128.119.245.12
4. 服务器返回到浏览器的状态代码是什么?


一开始没注意,返回了 304,说明之前的缓存还能用,看来是因为我刷新了页面的原因。重新抓包返回 200 OK 表示请求成功,信息在返回的报文里。

  1. 服务器上HTML文件的最近一次修改是什么时候?


最后一次修改是 2020 年 4 月 21 日,星期二,5 时 59 分 02秒。
6. 服务器返回多少字节的内容到您的浏览器?


返回了 128 bytes 字节。
7. 通过检查数据包内容窗口中的原始数据,你是否看到有协议头在数据包列表窗口中未显示? 如果是,请举一个例子。



经查证资料,“favicon.ico” 这玩意是个图标,是收藏夹图标和浏览器标签。浏览器可能会自动请求网站根目录的这个图标,若目标网站没有这个图标就会返回 404。这个信息是个干扰,可以直接忽略掉。

HTTP 条件 Get/response 交互

实验步骤

大多数Web浏览器使用对象缓存,从而在检索 HTTP 对象时执行条件 GET。执行以下步骤之前,请确保浏览器的缓存为空,现在按下列步骤操作:

  1. 启动您的浏览器,并确保您的浏览器的缓存被清除,如上所述。
  2. 启动Wireshark数据包嗅探器。


3. 在浏览器中输入提供的 URL,您的浏览器应显示一个非常简单的五行HTML文件。


4. 再次快速地将相同的 URL 输入到浏览器中(或者只需在浏览器中点击刷新按钮)。
5. 停止 Wireshark 数据包捕获,并在 display-filter-specification 窗口中输入 “http” ,以便只捕获 HTTP 消息,并在数据包列表窗口中显示。


我抓的包有一些其他干扰,直接忽略。

问题回答

  1. 检查第一个从您浏览器到服务器的 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和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。

  1. 针对第二个 HTTP GET,从服务器响应的 HTTP 状态码和短语是什么?服务器是否明确地返回文件的内容?请解释。


这不就是我刚才遇到的问题吗?附上资料:

如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码。简单的表达就是:服务端已经执行了GET,但文件未变化。

也就是说,当前这个页面的缓存还保存着,并且服务器没有修改,因此这个缓存还能拿来用,就不需要服务器再发一遍了。

检索长文件

实验步骤

在我们到目前为止的例子中,检索的文档是简短的 HTML 文件。 接下来我们来看看当我们下载一个长的 HTML 文件时会发生什么。按以下步骤操作:

  1. 启动您的浏览器,并确保您的浏览器缓存被清除,如上所述。
  2. 启动Wireshark数据包嗅探器


3. 在您的浏览器中输入提供的 URL,您的浏览器应显示相当冗长的一个文件。


4. 停止Wireshark数据包捕获,并在display-filter-specification窗口中输入“http”,以便只显示捕获的HTTP消息。


在分组列表窗口中,您应该看到您的 HTTP GET 消息,然后是对您的 HTTP GET 请求的多个分组的 TCP 响应。这个多分组响应值得进行一点解释。HTTP响应消息由状态行组成,后跟标题行,后跟一个空行,后跟实体主体。在我们的 HTTP GET 这种情况下,响应中的实体主体是整个请求的 HTML 文件。在我们的例子中,HTML 文件相当长,4500 字节太大,一个 TCP 数据包不能容纳。因此,单个 HTTP 响应消息由 TCP 分成几个部分,每个部分包含在单独的 TCP 报文段中。

问题回答

  1. 您的浏览器发送多少 HTTP GET 请求消息?哪个数据包包含了文件的消息?


发送了一个请求信息。

这个包包含了文件的消息。
2. 哪个数据包包含响应HTTP GET请求的状态码和短语?


3. 响应中的状态码和短语是什么?

200 OK,表示请求成功,信息在返回的报文里。
4. 需要多少包含数据的 TCP 段来执行单个 HTTP 响应和文本?

目测需要 5 个包含数据的 TCP 段。

具有嵌入对象的 HTML 文档

现在我们已经看到Wireshark如何显示捕获的大型HTML文件的数据包流量,我们可以看看当浏览器使用嵌入的对象下载文件时,会发生什么。

实验步骤

  1. 启动您的浏览器。
  2. 启动Wireshark数据包嗅探器。


3. 在浏览器中输入提供的 URL,您的浏览器应显示包含两个图像的短 HTML 文件。这两个图像在基本 HTML 文件中被引用。也就是说,图像本身不包含在 HTML 文件中;相反,图像的URL包含在已下载的HTML文件中。您的浏览器将不得不从指定的网站中检索这些图标。


停止 Wireshark 数据包捕获,并在 display-filter-specification 窗口中输入 “http”,以便只显示捕获的 HTTP 消息。

问题回答

  1. 您的浏览器发送了几个 HTTP GET 请求消息? 这些 GET 请求发送到哪个IP地址?




发送了 3 个 HTTP GET 请求消息,这些 GET 请求发送到 128.119.245.12。
2. 浏览器从两个网站串行还是并行下载了两张图片?请说明。


应该是串行下载,因为根据抓到的包,在第一张图片被下载完毕之后再开始下载第二张。不过这不符合我的认知,因为并行下载才是高效的方式,所以怀疑有干扰。

从排除干扰的包来看,应该是并行下载。

HTTP 认证

实验步骤

最后,我们尝试访问受密码保护的网站,并检查网站的 HTTP 消息交换的序列。提供的 URL 是受密码保护的。执行以下操作:

  1. 请确保浏览器的缓存被清除,如上所述,然后关闭你的浏览器,再然后启动浏览器
  2. 启动Wireshark数据包嗅探器。


3. 在浏览器中输入提供的 URL,在弹出框中键入所请求的用户名和密码。


4. 停止 Wireshark 数据包捕获,并在 display-filter-specification 窗口中输入 “http”,以便只显示捕获的 HTTP 消息。

由于我只能抓到 404,所以我就使用现成的包来看。

问题回答

  1. 对于您的浏览器的初始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错误

posted @ 2020-04-22 08:50  乌漆WhiteMoon  阅读(17978)  评论(0编辑  收藏  举报