超文本传输协议(HyperText Transfer Protocol,简称 HTTP)是万维网中应用最广泛的应用层协议,它定义了客户端与服务器之间传输超文本资源的规则与报文格式。在软考网络工程师与系统架构设计师的考纲中,HTTP 属于应用层协议的必考内容,其标准定义来自 RFC 7230 至 RFC 7235 系列文档,这些文档取代了早期的 RFC 2616,成为当前 HTTP/1.1 的权威规范。HTTP 运行于传输层的 TCP 协议之上,默认使用 80 号端口,采用典型的客户端服务器模型:客户端(通常是浏览器)主动发起请求,服务器被动接收请求并返回响应。
从通信模式上看,HTTP 是一种请求响应式协议,这意味着每一次数据交互都必须由客户端率先发起,服务器不能主动向客户端推送信息。这一特性直接决定了 HTTP 的交互节奏,也衍生出后来 WebSocket、长轮询等技术的出现动机。HTTP 最核心的一个概念是"资源",万维网上的一切内容,无论是网页、图片、视频还是接口返回的数据,都被抽象为资源,而资源通过统一资源标识符 URI 进行定位,其中我们最常接触的是统一资源定位符 URL。URL 的完整结构包含协议、主机、端口、路径与查询参数五个部分,理解 URL 的构成是理解 HTTP 报文的基础。
HTTP 还有一个广为人知的特性,即无状态。所谓无状态,指的是协议本身不会在两次独立的请求之间保留任何关于客户端的信息。服务器处理完一次请求之后,便"忘记"了这次请求的一切,下一次请求到来时,服务器不会知道它和上一次请求是否来自同一个客户端,也不会知道客户端之前做过什么。这一设计初衷是为了降低服务器的负担,让服务器能够以无记忆的方式高效处理海量并发请求,但无状态也给需要维持会话的 Web 应用带来了麻烦,这正是 Cookie 与 Session 机制诞生的根本原因。理解 HTTP 的无状态特性,是软考命题人反复考查的核心要点之一。
HTTP 的每一次交互都由一对报文构成,即一个请求报文与一个响应报文。请求报文由客户端发出,包含客户端希望服务器执行的操作类型、目标资源地址、协议版本以及若干描述性的首部字段,必要时还携带请求体。响应报文则由服务器返回,包含协议版本、状态码、状态短语、首部字段与响应体。请求与响应在结构上具有高度的对称性,这种对称结构是软考选择题常考的点,考生需要能够准确识别报文各组成部分的名称与作用。
这里必须澄清一个极易混淆的概念:HTTP 是无状态协议,但它在 HTTP/1.1 版本中并不是无连接协议。无状态描述的是协议是否保留两次请求之间的语义关联,而无连接描述的是底层 TCP 连接在完成一次交互后是否立即关闭。在 HTTP/1.0 时代,每次请求都会建立一条新的 TCP 连接,响应结束后连接随即关闭,此时的 HTTP 既是无状态又是短连接。到了 HTTP/1.1,通过持久连接机制,一条 TCP 连接可以承载多次请求与响应,HTTP 变成了"有连接但无状态"的协议。这一细微差别,是命题人在"无状态"与"短连接"之间设置陷阱的常见手法。
要彻底理解 HTTP,必须深入报文结构的底层。HTTP 报文以纯文本形式组织,按照一定的顺序由若干行构成,这种基于文本的协议设计使得 HTTP 报文可以直接被人工阅读与调试,也是它区别于许多二进制协议的重要特征。报文分为请求报文与响应报文两大类,两者虽然在具体字段上有所差异,但都遵循相同的总体框架。
请求报文由四部分构成,依次为请求行、请求头部、空行与请求数据。请求行位于报文的第一行,包含三个要素:请求方法、请求目标与协议版本,三者之间以空格分隔。请求方法是一个动词,表明客户端希望服务器执行的操作,最常见的是 GET 与 POST;请求目标通常是资源的路径;协议版本则声明客户端所遵循的 HTTP 版本。请求头部位于请求行之后,由若干键值对构成,每个首部字段占一行,用于向服务器传递关于客户端自身或请求本身的附加信息,例如客户端可接受的内容类型、浏览器标识、连接管理指令等。请求头部之后是一个空行,空行是报文头部与报文主体的分界线,其作用是让服务器能够准确识别头部字段已经结束。请求数据即请求体,并非所有请求都包含请求体,例如 GET 请求通常没有请求体,而 POST 请求的数据便存放在请求体中。
响应报文同样由四部分构成:状态行、响应头部、空行与响应体。状态行是响应报文的第一行,包含协议版本、状态码与状态短语三个要素。状态码是一个三位数字,用于概括性地表达请求处理的结果,状态短语则是状态码的简短文字说明,例如 200 对应 OK、404 对应 Not Found。响应头部与请求头部结构相同,用于向客户端传递服务器信息与响应本身的元数据。空行之后是响应体,即服务器返回的实际资源内容,例如网页的 HTML 源码、图片的二进制数据或接口返回的 JSON 文本。
HTTP 定义了多种请求方法,软考重点考查的是 GET、POST、HEAD 三者的区别,以及方法的安全性与幂等性属性。GET 方法用于请求服务器返回指定资源,它是只读操作,不应对服务器资源产生副作用,因此被定义为安全方法与幂等方法。所谓幂等,指的是同一请求重复执行多次,产生的结果与执行一次完全相同。POST 方法用于向服务器提交数据,通常会引起服务器端状态的改变,例如新增一条记录,它既不是安全方法,也不是幂等方法,因为重复提交可能会创建多条重复记录。HEAD 方法与 GET 几乎完全相同,唯一的区别在于服务器只返回响应头部而不返回响应体,它常用于探测资源是否存在或获取资源的元信息,而不必传输大量数据。PUT 与 DELETE 分别对应资源的更新与删除,二者均为幂等方法,在 REST 架构中与 GET、POST 共同构成对资源的增删改查操作。此外还有 OPTIONS、TRACE、CONNECT 等方法,其中 OPTIONS 用于查询服务器支持的请求方法,是跨域预检请求的底层机制,软考对这几个冷门方法偶有涉及。
报文头部字段是 HTTP 报文的重要组成部分,按照作用可以大致分为通用首部、请求首部、响应首部与实体首部四类。通用首部既可用于请求也可用于响应,例如 Cache-Control 用于控制缓存策略,Connection 用于管理连接,Date 用于标记报文生成时间。请求首部仅出现在请求报文中,典型的如 Host 字段,它指明请求的目标主机,是 HTTP/1.1 中唯一一个必须携带的请求首部,正是 Host 字段的存在使得一台服务器能够通过虚拟主机技术承载多个域名。响应首部仅出现在响应报文中,例如 Server 字段标明服务器软件信息。实体首部用于描述报文主体的信息,例如 Content-Type 说明实体的媒体类型,Content-Length 说明实体的字节长度。理解首部字段的分类,有助于考生在真题中准确判断某个字段的归属与功能。
HTTP 的连接管理经历了从短连接到持久连接的演进。HTTP/1.0 默认采用短连接,即客户端每发起一次请求,都要先与服务器完成 TCP 三次握手建立连接,服务器响应完成后,连接便通过四次挥手关闭。这种方式的问题在于,如果页面中包含大量图片、脚本等子资源,就需要反复建立与关闭连接,开销巨大。HTTP/1.1 引入了持久连接,默认开启,通过请求头中的 Connection 字段进行协商,当客户端发送 Connection: keep-alive 时表示希望保持连接,服务器响应后并不立即关闭连接,而是等待客户端的下一个请求。持久连接显著降低了连接建立的开销,减少了 TCP 握手与慢启动带来的延迟,是 HTTP/1.1 相比 1.0 最重要的性能改进之一。管线化则是在持久连接基础上的进一步优化,允许客户端在收到上一个响应之前连续发送多个请求,但由于服务器必须按顺序返回响应,队头阻塞问题未能解决,管线化在实践中并未被广泛采用。
HTTP 状态码是服务器向客户端反馈请求处理结果的重要机制,也是软考网络工程师与信息安全工程师的高频考点。状态码由三位数字构成,第一位数字将状态码划分为五个类别,考生应当首先记住这个分类框架,再掌握各类别中的典型代表。
状态码的第一位数字决定了它的类别,1 开头的状态码属于信息响应类,表示请求已被接收,服务器正在继续处理,典型如 100 Continue,它在客户端发送大请求体之前用于探询服务器是否愿意接收。2 开头的状态码属于成功类,表示请求已被服务器成功接收、理解并接受,其中 200 OK 是最常见的一种,表示请求成功且响应体包含请求的资源。3 开头的状态码属于重定向类,表示客户端需要采取进一步行动才能完成请求,典型如 301 Moved Permanently 表示资源已被永久移动到新地址,客户端以后应直接使用新地址,302 Found 表示临时重定向,307 与 308 则分别对应临时与永久重定向的严格版本,要求客户端保持原有的请求方法不变。4 开头的状态码属于客户端错误类,表示请求本身存在问题,典型如 400 Bad Request 表示请求报文存在语法错误,401 Unauthorized 表示请求需要身份认证,403 Forbidden 表示服务器理解请求但拒绝执行,404 Not Found 表示服务器找不到请求的资源。5 开头的状态码属于服务器错误类,表示服务器在处理请求时发生了错误,典型如 500 Internal Server Error 表示服务器内部错误,502 Bad Gateway 表示作为网关的服务器从上游服务器收到了无效响应,503 Service Unavailable 表示服务器暂时无法处理请求,通常与过载或维护有关。软考常考的状态码集中在 200、301、302、304、400、401、403、404、500 这几个,其中 304
本篇完!