超文本传输协议 HTTP
**超文本传输协议(HTTP)**定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP 是面向事务(Transaction-oriented)的应用层协议,它规定了在浏览器和服务器之间的请求和响应的格式与规则。
HTTP 是第 6 章出计算题最多的地方:页面请求时间的分析(2020、2024)、HTTP/1.1 的持久连接(2011、2022)、访问 Web 时用到的协议(2014、2021)、请求报文的方法(2015)都考过。本页没有错题,但它和 6.2.3 的 DNS 合起来就是”打开一个网页”的完整时间账。
机制
HTTP 的操作过程
从协议执行过程来说,浏览器要访问 WWW 服务器时,首先要完成对 WWW 服务器的域名解析(6.2.3)。一旦获得了服务器的 IP 地址,浏览器就通过 TCP 向服务器发送连接建立请求。每个万维网站点都有一个服务器进程,它不断地监听 TCP 的端口 80(默认),当监听到连接请求后便与浏览器建立 TCP 连接。然后,浏览器就向服务器发送请求获取某个 Web 页面的 HTTP 请求。服务器收到请求后,将构建所请求 Web 页的必需信息,并通过 HTTP 响应返回给浏览器。浏览器再将信息进行解释,然后将 Web 页显示给用户。最后,TCP 连接释放。
用户单击鼠标后所发生的事件顺序如下(以访问清华大学的网站为例;访问 Web 时可能用到的协议 2014、2021 年考过):
- 浏览器分析链接指向页面的 URL(http://www.tsinghua.edu.cn/chn/index.htm)。
- 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。
- 域名系统 DNS 解析出清华大学服务器的 IP 地址。
- 浏览器与该服务器建立 TCP 连接(默认端口号为 80)。
- 浏览器发出 HTTP 请求:GET /chn/index.htm。
- 服务器通过 HTTP 响应把文件 index.htm 发送给浏览器。
- 释放 TCP 连接。
- 浏览器解释文件 index.htm,并将 Web 页显示给用户。
上述过程只是一个简化过程,实际过程涉及 TCP/IP 体系结构中应用层的 DHCP、DNS 和 HTTP,传输层的 UDP 和 TCP,网际层的 IP 和 ARP,数据链路层的 CSMA/CD 或 PPP(若涉及 ISP 接入或广域网传输)。这份清单正是 2014、2021 两道真题的答案来源。
HTTP 的特点
- HTTP 使用 TCP 作为传输层协议,保证了数据的可靠传输。HTTP 不必考虑数据在传输过程中被丢弃后又怎样被重传。
- 但是,HTTP 本身是无连接的(务必注意)。 也就是说,虽然 HTTP 使用了 TCP 连接,但通信的双方在交换 HTTP 报文之前不需要先建立 HTTP 连接。
- HTTP 是无状态的。 同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同,因为服务器并不记得曾经服务过的这个客户。
HTTP 的无状态特性简化了服务器的设计,使之更易支持大量并发的请求。在实际应用中,通常使用 Cookie 加数据库的方式来跟踪用户的活动。Cookie 的工作原理:当用户初次浏览某个使用 Cookie 的网站时,该网站服务器就为用户产生一个唯一的 Cookie 识别码(如 “12345”),并以此为索引在后端数据库中创建一个项目;接着在给用户的响应报文中添加一个 Set-cookie 的首部行;用户收到响应后,就在它管理的特定 Cookie 文件中添加该服务器的主机名和 Cookie 识别码;当用户再次浏览这个网站时,会取出这个网站的识别码,并在请求报文中添加一个 Cookie 首部行。服务器根据 Cookie 识别码就能从数据库中查询到该用户的活动记录,进而执行一些个性化的工作。
持久连接与非持久连接
HTTP 既可使用非持久连接(HTTP/1.0),又可使用持久连接(HTTP/1.1 支持)(HTTP 页面请求时间的分析 2020、2024 年考过)。
非持久连接:每个网页元素对象(如 JPEG 图形、Flash 等)的传输都需要单独建立一个 TCP 连接(第三次握手的报文段中捎带了客户对万维网文档的请求)。请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间 RTT(一个 RTT 用于 TCP 连接,另一个 RTT 用于请求和接收文档)。每请求一个对象都导致
持久连接:是指万维网服务器在发送响应后仍然保持这条连接,使同一个客户和该服务器可以继续在这条 TCP 连接上传送后续的 HTTP 请求报文和响应报文。HTTP/1.1 默认使用持久连接,持久连接又分为非流水线和流水线两种工作方式(HTTP/1.1 页面请求时间的分析 2011、2022 年考过):
| 方式 | 做法 | 时间 |
|---|---|---|
| 非流水线 | 客户在收到前一个响应后才能发出下一个请求,服务器在发送完一个对象后,其 TCP 连接就处于空闲状态,浪费了服务器资源 | 每个对象 1 个 RTT |
| 流水线 | 客户可以连续发出对各个对象的请求,服务器就可连续响应这些请求 | 若所有的请求和响应都是连续发送的,则引用所有对象共计经历 1 个 RTT 延迟 |
流水线方式减少了 TCP 连接中的空闲时间,提高了效率。此外,因为 HTTP 是基于 TCP 的,所以每 RTT 内传送的数据量还要受到 TCP 发送窗口的限制(5.3.5)。
HTTP 的报文结构
HTTP 是面向文本的(Text-Oriented),因此报文中的每个字段都是一些 ASCII 码串,并且每个字段的长度都是不确定的。有两类 HTTP 报文:请求报文(从客户向服务器发送)和响应报文(从服务器到客户的回答)。两种报文都由三个部分组成,两者格式的区别就是开始行不同:
| 部分 | 请求报文 | 响应报文 |
|---|---|---|
| 开始行 | 请求行:方法 + 请求资源的 URL + HTTP 版本,字段之间以空格分隔,最后是 CRLF | 状态行:HTTP 版本 + 状态码 + 解释状态码的短语 |
| 首部行 | 用来说明浏览器、服务器或报文主体的一些信息;每行”首部字段名: 值”,行末 CRLF;首部行结束后有一个空行将它与实体主体分开 | 同左 |
| 实体主体 | 一般不用这个字段 | 有些响应报文也可能没有这个字段 |
请求报文中常用的几个方法(HTTP 请求报文中各种方法的意义 2015 年考过):
| 方法 | 意义 |
|---|---|
| GET | 请求读取由 URL 所标志的信息 |
| HEAD | 请求读取由 URL 所标志的信息的首部 |
| POST | 给服务器添加信息(如注释) |
| PUT | 在指明的 URL 下存储一个文档 |
| DELETE | 删除指明的 URL 所标志的资源 |
| CONNECT | 用于代理服务器 |
一个典型的 HTTP 请求报文:
GET /bbs/index.htm HTTP/1.1 {方法、相对 URL、HTTP 版本}
Host: www.cskaoyan.com {指明服务器的域名}
Connection: Keep-Alive {要求服务器发送完文档后保持这条连接}
User-Agent: Mozilla/5.0 {用户代理是浏览器 Mozilla/5.0}
Accept-Language: cn {希望优先得到中文版本的文档}请求行使用了相对 URL,因为下面的首部行给出了服务器的域名。若要求使用非持久连接,则对应的首部行应为 Connection: close。
HTTP 响应报文的第 1 行是状态行,常见的三种:
| 状态行 | 含义 |
|---|---|
| HTTP/1.1 202 Accepted | 接受请求 |
| HTTP/1.1 400 Bad Request | 错误的请求 |
| HTTP/1.1 404 Not Found | 找不到页面 |
计算模板
请求一个页面所需的时间
设页面含 1 个 HTML 文件和
| 连接方式 | 总时间 |
|---|---|
| 非持久连接、串行 | |
| 非持久连接、 | |
| 持久连接、非流水线 | |
| 持久连接、流水线 |
上表的
边界
HTTP 使用 TCP,但 HTTP 本身是无连接的。 这是教材特意强调的一点:双方在交换 HTTP 报文之前不需要建立”HTTP 连接”,连接是 TCP 的事。
HTTP 是无状态的,状态靠 Cookie 维持。 服务器不记得客户,Cookie 只是让服务器能在自己的数据库里查到这个客户的记录。
非持久连接下每个对象 2 个 RTT,持久连接下第一个对象 2 个 RTT、后续每个 1 个 RTT。 流水线方式下后续所有对象合起来 1 个 RTT。
HTTP/1.1 默认持久连接,Connection: close 才是非持久。
HEAD 只要首部,GET 要整个信息。 2015 年真题考的就是这几个方法的区别。
HTTP 的控制信息与数据在同一条 TCP 连接上传送(带内),FTP 是带外。 见 6.3.2。
口径差异:HTTP 的版本与端口
教材口径:HTTP/1.0 非持久、HTTP/1.1 持久;默认端口 80;面向文本。
工程口径:HTTP/2 把报文改成二进制分帧,在一条 TCP 连接上多路复用多个请求,解决了 HTTP/1.1 流水线的队头阻塞;HTTP/3 更进一步,改用基于 UDP 的 QUIC 协议,把可靠传输和加密都放在用户态实现。今天的站点几乎都用 HTTPS(TCP 443,TLS 加密),浏览器对明文 80 端口的站点会给出警告。
考试按教材口径作答:HTTP 使用 TCP、端口 80。
对照速查
| 说法 | 对错 |
|---|---|
| HTTP 使用 TCP,默认端口 80 | ✅ |
| HTTP 是有连接的协议 | ❌(本身无连接,借助 TCP) |
| HTTP 是无状态的 | ✅ |
| Cookie 使 HTTP 变成了有状态协议 | ❌(服务器靠 Cookie 查数据库,协议本身仍无状态) |
| 非持久连接请求一个对象需要 2 个 RTT | ✅ |
| HTTP/1.1 默认使用非持久连接 | ❌(默认持久) |
| 持久连接的流水线方式下,所有对象共计 1 个 RTT | ✅ |
| 请求报文的开始行是状态行 | ❌(请求行;状态行在响应报文中) |
| HEAD 方法请求读取 URL 标志的信息的首部 | ✅(2015) |
| 404 表示找不到页面 | ✅ |
| HTTP 的控制信息是带外传送的 | ❌(带内;FTP 才是带外) |
考点
- 访问一个网页的 8 个步骤;涉及 DHCP、DNS、HTTP、UDP、TCP、IP、ARP、CSMA/CD 或 PPP(2014、2021)
- HTTP:TCP 80、本身无连接、无状态;Cookie 的工作原理
- 非持久(2RTT/对象)与持久(非流水线 1RTT/对象、流水线共 1RTT)(2011、2020、2022、2024)
- 报文结构:开始行(请求行/状态行)、首部行、实体主体
- 方法 GET、HEAD、POST、PUT、DELETE、CONNECT(2015);状态码 202、400、404
链接
- 🏠 返回总览:计算机网络第 6 章:应用层总览
- ⬅️ 上一节:6.5.1 WWW 的概念与组成结构
- 🔗 6.2.3 域名解析过程(打开网页的前半段)
- 🔗 5.3.3 TCP 连接管理(每条连接的 1.5RTT)
- 🔗 6.3 FTP(带内与带外的对比)
- 📖 名词库:第 6 章名词库