HTTP (Hyper Text Transfer Protocol),译为超文本传输协议
1991年,HTTP/0.9
- 只支持GET请求方法获取文本数据(比如HTML文档),且不支持请求头、响应头等,无法向服务器传递太多信息
- 1996年,HTTP/1.0
- 支持POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型(不再局限于文本数据)
- 浏览器的每次请求都需要与服务器建立一个TCP连接,请求处理完成后立即断开TCP连接
- 1997年,HTTP/1.1(最经典、使用最广泛的版本)
- 支持PUT、DELETE等请求方法
- 采用持久连接(Connection:keep-alive),多个请求可以共用同一个TCP连接
- 2015年,HTTP/2.0
-
报文格式
请求方法
GET: 常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的)
- POST: 常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
- HEAD: 请求得到与GET请求相同的响应,但没有响应体
- 使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载,以此可以节约带宽资源
- OPTIONS: 用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
- OPTIONS * HTTP/1.1
- PUT: 用于对已存在的资源进行整体覆盖
- PATCH: 用于对资源进行部分修改(资源不存在,会创建新的资源)
- DELETE: 用于删除指定的资源
- TRACE: 请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
CONNECT:
头部字段可以分为4种类型
状态码指指示HTTP请求是否已成功完成
状态码可以分为5类
100 Continue
- 请求的初始部分已经被服务器收到,并且没有被服务器拒绝。客户端应该继续发送剩余的请求,如果请求已经完成,就忽略这个响应
- 允许客户端发送带请求体的请求前,判断服务器是否愿意接收请求(服务器通过请求头判断)
- 在某些情况下,如果服务器在不看请求体就拒绝请求时,客户端就发送请求体是不恰当的或低效的
- 200 OK : 请求成功
- 302 Found: 请求的资源被暂时的移动到了由Location头部指的URI上
- 304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容
- 400 Bad Request:由于语法无效,服务器无法理解该请求
- 401 Unauthorized:由于缺乏目标资源要求的身份验证凭证
- 403 Forbidden:服务器端有能力处理该请求,但是拒绝授权访问
- 404 Not Found:服务器端无法找到所请求的资源
- 405 Method Not Allowed:服务器禁止了使用当前HTTP方法的请求
- 406 Not Acceptable:服务器无法提供与Accept-Charse以及Accept-Language指定的值相匹配的响应
- 408 Request Timeout:服务器想要将没有在使用的连接关闭
- 一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下
- 500 Internal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
- 501 Not Implemented:请求的方法不被服务器支持,因此无法被处理
- 服务器必须支持的方法(即不会返回这个状态码的方法)只有GET和HEAD
- 502 Bad Gateway: 作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
503 Service Unavailable:服务器尚未处于可以接收请求的状态
action:请求的URI
- method:请求方法(GET、POST)
enctype:POST请求时,请求体的编码方式
特点
- 本身不产生内容
- 处于中间位置转发上下游的请求和响应
- 面向下游的客户端:它是服务器
- 面向上游的服务器:它是客户端
正向代理、反向代理
- 正向代理:代理的对象是客户端

- 反向代理:代理的对象是服务器
正向代理 - 作用
- 隐藏客户端身份
- 绕过防火墙(突破访问限制)
- Internet访问控制
- 数据过滤
- ….

一些免费的正向代理
隐藏服务器身份
- 安全防护
- 负载均衡
抓包工具的原理
- Fiddler、Charles等抓包工具的原理:在客户端启动了正向代理服务

需要注意的是
Via:追加经过的每一台代理服务器的主机名
- X-Forwarded-For:追加请求方的IP地址
- X-Real-IP:客户端的真实IP地址
CDN
- CDN
- 利用最靠近每位用户的服务器
- 更快更可靠地将音乐、图片、视频等资源文件(一般是静态资源)传递给用户
CDN - 使用CDN前后

- CDN运营商在全国、乃至全球的各个大枢纽城市都建立了机房
- 部署了大量拥有高存储高带宽的节点,构建了一个跨运营商、跨地域的专用网络
内容所有者向CDN运营商支付费用,CDN将其内容交付给最终用户
缓存

实际上,HTTP的缓存机制远远比上图的流程要复杂
- 通常会缓存的情况是:GET请求+静态资源
-
缓存 - 响应头
Pragma:作用类似于Cache-Control,Http/1.0的产物
- Expires:缓存的过期时间(GMT格式时间),HTTP/1.0的产物
- Cache-Control:设置缓存策略
- no-storage:不缓存数据到本地
- public:允许用户、代理服务器缓存数据到本地
- private:只允许用户缓存数据到本地
- max-age:缓存的有效时间(多长时间不过期),单位秒
- no-cache:每次需要发请求给服务器询问缓存是否有变化,再来决定如何使用缓存
- 优先级:Pragma > Cache-Control > Expires
- Last-Modified: 资源的最后一次修改时间
- ETag:资源的唯一标识(根据文件内容计算出来的摘要值)
-
缓存 - 请求头
If-None-Match
- 如果上一次的响应头中有ETag,就会将ETag的值作为请求头的值
- 如果服务器发现资源的最新摘要值跟if-None-Match不匹配,就会返回新的资源(200 OK)
- 否则,就不会返回资源的具体数据(304 Not Modified)
If-Modified-Since
Last-Modified的缺陷
- 只能精确到秒级别,如果资源在1秒内被修改了,客户端将无法获取最新的资源数据
- 如果某些资源被修改了(最后一次修改时间发生了变化),但是内容并没有任何变化
- 会导致相同数据重复传输,没有使用到缓存
- ETag可以办到








