【概述】
通过超文本传输协议(Hypertext Transfer Protocol,HTTP),定义了万维网客户进程(浏览器)如何向万维网服务器请求万维网文档,以及服务器如何将文档传送给浏览器
从层次的角度来看,HTTP 是面向事务的应用层协议,其基于 TCP 协议,保障数据的可靠传输,但其本身是无连接的,即 HTTP 虽然使用了 TCP 连接,但通信双方在交换 HTTP 报文时,不需要建立 HTTP 连接
在同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时相同,因为服务器不记得曾经访问过的这个客户,也不记得为该客户曾服务过多少次,因此,HTTP 协议是无状态的,这简化了服务器的设计,使服务器更容易支持大量并发的 HTTP 请求
在实际应用中,通常使用 Cookie 加数据库的方式来追踪用户活动,Cookie 是存储在用户主机的文本文件,其中包含一串识别码,用于令 Web 服务器来识别服务,Web 服务器根据 Cookie 就能从其数据库中查询到该用户的活动记录,进而执行一些个性化的工作
【HTTP 操作过程】
从 HTTP 协议的执行过程来说,当浏览器要访问 WWW 服务时,大致工作流如下:
- 通过 DNS 来完成对 WWW 服务器的域名解析,一旦获取服务器的 IP 地址,浏览器会通过 TCP 来向服务器发送建立连接请求
- 每个万维网站点都有一个服务器进程,其不断地监听 TCP 的 $80$ 端口,当监听到连接请求后,就与浏览器建立连接
- TCP 连接建立后,浏览器就向服务器发送请求来获取某一 Web 页面的 HTTP 请求
- 在服务器收到 HTTP 请求后,将构建所请求的 Web 页面的信息,并通过 HTTP 响应返回给浏览器
- 浏览器将返回的信息进行解释,之后将 Web 页面显示给用户
- 通信完成,TCP 连接释放
以用户单击 HTML 页面的 www.baidu.com/images/index.html
的超链接为例,在单击后,发生的事件顺序如下:
- 浏览器分析链接指向页面的 URL:
www.baidu.com/images/index.html
- 浏览器向 DNS 请求解析
www.baidu.com
- DNS 解析出
www.baidu.com
的 IP 地址 - 浏览器与该 IP 地址对应服务器建立 TCP 连接(默认端口号 $80$)
- 浏览器发出 HTTP 请求:
GET /images/index.html
- 服务器通过 HTTP 响应将文件
index.html
发送给浏览器 - TCP 连接释放
- 浏览器将文件
index.html
进行解释,并展现给用户
【连接方式】
由于 HTTP 是无连接的,也就是说,在收发 HTTP 报文时,是基于 TCP 连接的
根据 TCP 连接是否在发送完响应后断开,HTTP 可分为持久连接与非持久连接
1.持久连接
持久连接,就是万维网服务器在发送响应后,仍然保持这条 TCP 连接,使同一个客户和服务器可以继续在这条连接上传送后续的 HTTP 请求和响应报文
持久连接又分为流水线和非流水线两种方式:
- 非流水线方式:客户在收到前一个响应后,才能发出下一个请求
- 流水线方式:客户采用流水线的方式,接收响应与发送请求
2.非持久连接
非持久连接,就是在每一个 HTTP 请求发送后,都建立一条 TCP 连接,在服务器响应后,断开该 TCP 连接
也就是说,请求一个万维网文档所需的时间,是该文档的传输时间加上两倍的 RTT,其中,一个 RTT 用于 TCP 连接,另一个 RTT 用于请求和接收文档
【HTTP 报文结构】
类型
HTTP 是面向文本的,因此,在报文中的每个字段都是一些 ASCII 码,且每个字段的长度都是不确定的
在浏览器与服务器间请求和响应的交互,必须按照规定的格式和一定的规则,这些格式和规则就是 HTTP,因此,HTTP 有两类报文:
- HTTP 请求报文:从 Web 客户端向 Web 服务器发送服务请求
- HTTP 响应报文:从 Web 服务器向 Web 客户端发送服务响应
请求报文
HTTP 请求报文由开始行、首部行、实体主体组成,具体格式如下图
其中,开始行也称请求行,其各字段含义如下:
- 方法:请求报文采用的各种方法,如
GET
、POST
、PUT
- URL:即所请求的资源的 URL
- 版本:HTTP 的版本
常见的方法及作用如下表:
响应报文
HTTP 响应报文由开始行、首部行、实体主体组成,具体格式如下图
其中,开始行也称状态行,其各字段含义如下:
- 版本:HTTP 的版本
- 状态码:反映请求状态的代码
- 短语:解释状态码的简单短语
状态码都是三位数字,其基本含义如下:
1xx
:表示通知信息,如请求收到了或正在进行处理2xx
:表示成功,如接受或知道了3xx
:表示重定向,表示要完成请求还必须采取进一步的行动4xx
:表示客户的差错,如请求中有错误的语法或不能完成5xx
:表示服务器的差错,如服务器失效无法完成请求