图解HTTP之——简单的HTTP协议(一)

本章将针对 HTTP 协议结构进行讲解,主要使用HTTP/1.1版本。学完 这章,想必大家就能理解 HTTP 协议的基础了。

1.1 HTTP 协议用于客户端和服务器端之间 的通信 

HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和 服务器之间的通信。 请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一 端称为服务器端。

          图:应用 HTTP 协议时,必定是一端担任客户端角色,另一端担 任服务器端角色 

在两台计算机之间使用 HTTP 协议通信时,在一条通信线路上必定有 一端是客户端,另一端则是服务器端。

有时候,按实际情况,两台计算机作为客户端和服务器端的角色有可 能会互换。但就仅从一条通信路线来说,服务器端和客户端的角色是 确定的,而用 HTTP 协议能够明确区分哪端是客户端,哪端是服务器 端。 

1.2 通过请求和响应的交换达成通信

                      图:请求必定由客户端发出,而服务器端回复响应

HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返 回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应。

下面,我们来看一个具体的示例。

 下面则是从客户端发送给某个 HTTP 服务器端的请求报文中的内容。

起始行开头的GET表示请求访问服务器的类型,称为方法 (method)。随后的字符串 /index.htm 指明了请求访问的资源对象, 也叫做请求 URI(request-URI)。最后的 HTTP/1.1,即 HTTP 的版本 号,用来提示客户端使用的 HTTP 协议功能。

综合来看,这段请求内容的意思是:请求访问某台 HTTP 服务器上的 /index.htm 页面资源。

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段 和内容实体构成的。

                                  图:请求报文的构成

请求首部字段及内容实体稍后会作详细说明。接下来,我们继续讲 解。接收到请求的服务器,会将请求内容的处理结果以响应的形式返 回。

在起始行开头的 HTTP/1.1 表示服务器对应的 HTTP 版本。

紧挨着的 200 OK 表示请求的处理结果的状态码(status code)和原因 短语(reason-phrase)。下一行显示了创建响应的日期时间,是首部 字段(header field)内的一个属性。

接着以一空行分隔,之后的内容称为资源实体的主体(entity body)。

响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代 码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主 体构成。稍后我们会对这些内容进行详细说明。

                                   图:响应报文的构成

1.3 HTTP 是不保存状态的协议 

HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP 协议自 身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个 级别,协议对于发送过的请求或响应都不做持久化处理。

                  图:HTTP 协议自身不具备保存之前发送过的请求或响应的功能

使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了 更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设 计成如此简单的。 

可是,随着 Web 的不断发展,因无状态而导致业务处理变得棘手的 情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的 33 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了 能够掌握是谁送出的请求,需要保存用户的状态。

HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于 是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管 理状态了。有关 Cookie 的详细内容稍后讲解。

1.4 请求 URI 定位资源

HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功 能,在互联网上任意位置的资源都能访问到。

                  图:HTTP 协议使用 URI 让客户端定位到资源

当客户端请求访问资源而发送请求时,URI 需要将作为请求报文中的 请求 URI 包含在内。指定请求 URI 的方式有很多。

 

                  图:以 http://hackr.jp/index.htm 作为请求的例子

 除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以 用一个 * 来代替请求 URI。下面这个例子是查询 HTTP 服务器端支持 的 HTTP 方法种类。

猜你喜欢

转载自blog.csdn.net/qq_41084324/article/details/83541511