参考:CyC2018
HTTP协议概述
- 超文本传输协议(HyperText Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
- HTTP是一个客户端和服务端请求与应答的标准。客户端发起一个HTTP请求到服务器上指定端口(HTTP协议默认端口为80)。我们称这个客户端为用户代理(user-agent)。应答的服务器上储存着一些资源,我们称这个服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,如代理服务器、网关或隧道。
- HTTP假定其下层协议(传输层)提供可靠的传输。因此,任何提供这种保证的协议都能被使用。因此常常是TCP作为其传输层。
- HTTP协议定义Web客户端如何从web服务器请求Web页面,以及服务器如何把web页面传送给客户端。
HTTP工作原理
HTTP采用请求/响应模型。客户端向服务器发送一个请求报文,请求报文包括:请求方法、URL、协议版本、请求头部和请求数据。服务器发送响应报文,响应报文包括:协议的版本、状态码、服务器信息、响应头部和响应数据。
以下是HTTP工作步骤:
- 客户端连接到web服务器
HTTP客户端(通常是浏览器)与web服务器的HTTP端口(默认为80),建立一个TCP套接字连接。 - 发送HTTP请求
通过TCP套接字,客户端向web服务器发送HTTP请求报文。 - 服务器接收请求并返回HTTP响应
web服务器解析请求,定位请求资源。服务端将资源副本当成响应数据,向客户端返回HTTP响应:包括状态行、响应头部、空行和响应数据。 - 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。 - 客户端浏览器解析相应内容
浏览器首先解析状态行,查看表明请求是否成功的状态码;
解析每一个响应头,根据HTML语法对齐进行格式化,并在浏览器窗口显示。
HTTP请求报文
请求报文内容如下:


请求方法
位于请求报文的第一行。
- GET
获取资源
- POST
传输实体主体,POST主要用于传输数据,而GET主要用于获取资源。
- PUT :
上传文件,不带验证机制,不安全
- DELETE
与PUT功能相反,也不带验证机制
- CONNECT
要求在与服务器通信时建立隧道
使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

- 其他
HEAD:获取报文首部,和GET类似,但不返回报文实体主体部分,主要用于确认URL的有效性以及资源的更新时间。
PATCH:对资源进行部分修改
OPTIONS:查询支持的请求方法,返回:GET、POST之类的。
请求首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
GET与POST的区别
HTTP响应报文
响应报文内容如下:

HTTP状态码
状态码 | 类别 | 含义 |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要附加操作以完成请求 |
4XX | 客户端错误码 | 服务器无法处理请求 |
5XX | 服务器错误码 | 服务器处理请求时出错 |
几个关键的状态码
100:Continue,表明目前一切正常
200:OK,请求成功
204:No Content:请求已经成功处理,但是返回的响应报文不包含实体的主体部分
301:永久性重定向
302:临时性重定向
303:与302功能相同,但3003要求浏览器采取GET方法
304:若请求报文中包含一些条件,例如:if-match等,如果 不满足条件,就会返回304.
400:请求报文语法错误
401:表明发送的请求需要有认证信息,若之前已发过一次,则表示认证失败
404:No found
500:服务器正在执行请求时出错
503:服务器超载或正在停机维护
响应首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
HTTP首部
有四种类型的首部字段:通用首部字段,请求首部字段、响应首部字段和实体首部字段。
通用首部字段
首部字段名 | 说明 |
---|---|
cache-Control | 控制缓存的行为 |
Connection | 控制不再转发给代理的首部字段、管理持久连接 |
Date | 响应报文生成的时间 |
Transfer-Encoding | 报文主体的编码方式 |
实体首部字段
首部字段名 | 说明 |
---|---|