# http 协议
HyperText Transfer Protocal
超文本传输协议,应用层协议
# 特点
- 灵活可扩展:语法上只定义了基本格式,空格分隔单词,换行分隔字段等。另外一个就是传输形式上不仅可以传输文本,还可以传输图片,视频等任意数据
- 客户端/服务器模式:通常而言,就是一方发送消息,另外一方要接受消息,或者是做出响应等
- 可靠传输:基于
TCP/IP
- 无状态:无法保存之前的状态需要重传
- 明文传输:容易被攻击
# URI
http
协议使用 URI
定位互联网上的资源:
URI
统一资源标识符URL
统一资源定位符URN
统一资源名称
# 版本
1.1
- 引入持久连接:连接默认不关闭,可以被多个请求复用,通过请求头的
keep-alive
设置- 容易产生性能问题
- 引入管道机制:在同一个连接,客户端可以同时发送多个请求
- 需要按序处理,队头任务太慢 ,可能会导致队头阻塞
- 增加缓存控制
- 支持断点续传:通过设置请求头的
Range
- 使用了虚拟网络:在一台物理服务器上可以存在多个虚拟主机并共享 ip 地址
- 新增方法:
PUT PATCH OPTIONS DELETE
- 引入持久连接:连接默认不关闭,可以被多个请求复用,通过请求头的
2.0
- 二进制分帧:头信息和数据都是二进制帧
- 头部压缩:使用
HPACK
对头部字段进行压缩 - 多路复用:一个连接,客户端和浏览器都可以同时发送多个请求和响应,不需要按序进行,解决了队头阻塞的问题
- 服务器推送:允许服务器未经请求,主动向客户端发送资源
- 请求优先级:可以设置数据帧的优先级,让服务器优先处理重要资源,提高用户体验
# 请求方法
GET
:向特定资源发出请求,不应该用于产生副作用的操作- 会主动缓存
HEAD
:类似GET
,只是返回的响应没有响应体,用于获取报头中的信息POST
:向指定资源提交数据进行处理请求,数据在请求体中,可能会导致创建和修改资源PUT
:向指定资源上传最新内容替代DELETE
:请求服务器刪除指定内容OPTIONS
:返回服务器对指定资源所支持的HTTP
请求方法,也可以用来测试服务器功能TRACE
:回显服务器收到的请求,主要用于测试或诊断CONNECT
:HTTP/1.1
协议中预留给能够将连接改为管道方式的代理服务器
# 跨域请求
在浏览器发送跨域请求的时候会分为
- 简单请求
- 请求方法为
HEAD GET POST
- 无自定义请求头
Content-Type
只能是text/plain multipart/form-data application/x-www-form-urlencoded
- 请求方法为
- 复杂请求
如果是复杂请求就会先发送一个 OPTIONS
预检请求
# 状态码
- 1xx 请求已被接收,需要继续处理
- 2xx 成功状态
- 200
OK
表示从客户端发来的请求在服务器端被正确请求 - 204
No content
表示请求成功,但没有资源可返回 - 206
Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET
请求 响应报文中包含由「Content-Range」
指定范围的实体内容。
- 200
- 3xx 重定向
- 301
moved permanently
永久性重定向,表示资源已被分配了新的URL
- 302
found
临时性重定向,表示资源临时被分配了新的URL
- 303
see other
表示资源存在着另一个URL
,应使用GET
方法获取资源(对于 301/302/303 响应,几乎所有浏览器都会删除报文主体并自动用GET
重新请求) - 304
not modified
表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关) - 307
temporary redirect
临时重定向,和 302 含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
- 301
- 4xx 客户端错误
- 400
bad request
请求报文存在语法错误 - 401
unauthorized
表示发送的请求需要有通过HTTP
认证的认证信息 - 403
forbidden
表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述 - 404
not found
表示在服务器上没有找到请求的资源
- 400
- 5xx 服务器错误
- 500
internal sever error
表示服务器端在执行请求时发生了错误 - 501
Not Implemented
表示服务器不支持当前请求所需要的某个功能 - 503
service unavailable
表明服务器暂时处于超负载或正在停机维护,无法处理请求
- 500
# 缓存策略
浏览器缓存:
Service Worker
脱离浏览器窗口,无法访问DOM
- 离线缓存
- 消息推送
- 网络代理
Memory Cache
内存缓存 速度最快 存活时间最短Disk Cache
磁盘缓存 比内存慢 存储时间长容量大Push Cache
推送缓存

下面的标签都是响应头中由服务器配置的
# 强缓存
缓存有数据且未过期就直接返回数据,否则向服务器获取数据更新缓存
Expires
过期时间,通过服务器返回的响应头获取,过期之前可以直接从缓存中获取数据- 1.0 版本 由于服务器时间和客户端时间可能存在误差,现在大多数用
Cache-Control
- 1.0 版本 由于服务器时间和客户端时间可能存在误差,现在大多数用
Cache-Control
private
客户端可以缓存public
客户端和服务器都可以缓存max-age
缓存失效时间no-cache
需要协商缓存来验证no-store
所有都不缓存
两个字段都存在优先考虑 Cache-Control
# 协商缓存
从缓存获取缓存数据标识,带着标识向服务器请求是否失效,没有失效服务器返回 304,客户端就直接从缓存中获取请求数据,如果标识失效,服务器返回更新后端数据
Last-Modified
资源修改时间- 如果编辑了文件,内容没改也会导致缓存失效
- 单位是秒,如果一秒内改变,无法感知修改
ETag
文件标识 和服务器上的进行对比
# 缓存优点
- 减少了冗余的数据传递,节省宽带流量
- 减少了服务器的负担,大大提高了网站性能
- 加快了客户端加载网页的速度 这也正是
HTTP
缓存属于客户端缓存的原因。
# 浏览器不同刷新
- 浏览器地址栏中写入
URL
,回车浏览器发现缓存中有这个文件了,不用继续请求了,直接去缓存拿。(最快) F5
就是告诉浏览器,别偷懒,好歹去服务器看看这个文件是否有过期了。于是浏览器就胆胆襟襟的发送一个请求带上If-Modify-since
Ctrl+F5
告诉浏览器,你先把你缓存中的这个文件给我删了,然后再去服务器请求个完整的资源文件下来。于是客户端就完成了强行更新的操作
# HTTPS
HTTPS = HTTP + SSL/TLS
- 加密传输
- SEO 更好
- 端口 443
- 需要证书
TLS
是 SSL
的后续版本,用于身份校验和加密的一种协议
优点:
- 更安全
- 用来避免运营商劫持
缺点:
- 使得页面加载时间延长
- 成本更高
- 依赖证书安全
- 无法防御 黑客攻击
DDOS
和服务器劫持
名词:
- 对称加密:加密 解密使用相同的密钥,常用:
DES -> AES
- 非对称加密:公钥加密 私钥解密,常用
RSA
# 流程
- 发起
https
请求 - 服务器收到请求,返回数字证书
- 客户端收到证书,验证证书公钥是否有效,有效则生成一个随机数(密钥),用证书公钥对其进行(非对称)加密返回给服务器
- 服务器用证书私钥对加密进行解密,得到密钥后,把需要返回的内容用该密钥进行(对称)加密返回
- 客户端用本地密钥进行解密