网络协议:应用层之HTTP与HTTPS
目录
一,HTTP基础
二,HTTP进阶
三,HTTPS
四,HTTP/2
五,HTTP/3
六,抓包
一,HTTP基础
1,基本介绍
- HTTP是
HyperText Transfer Protocol
的缩写,表示超文本传输协议 - 设计HTTP最初的目的是为了提供一种发布和接收
HTML
页面的方法 -
HTML
是Hyper Text Markup Language
的缩写,表示超文本标记语言 - 通过HTTP请求的资源由
URI
来标识,URI
是Uniform Resource Identifiers
的缩写,表示统一资源标识符 - HTTP的标准制定由万维网协会(
W3C
)和互联网工程任务组(IETF
)进行协调,最终发布了一系列的RFC
-
RFC
是Request For Comments
的缩写,表示请求意见稿
2,版本
- HTTP/0.9
1>只支持
GET
请求方法
2>只支持文本数据
3>不支持请求头、响应头
- HTTP/1.0
1>支持
POST
、HEAD
请求方法
2>支持更多数据类型
3>支持请求头、响应头
4>一个请求对应一个TCP
连接
- HTTP/1.1
1>支持
PUT
、DELETE
请求方法
2>采用持久连接(Connection: keep-alive
):多个请求共用一个TCP
连接
3>是目前使用最广泛的版本
3,报文格式
- 简单描述
- ABNF
1>
ABNF
是Augmented Backus-Naur Form
的缩写,表示巴科斯-瑙尔范式的增强版
2>ABNF
用作Internet
中通信协议的定义语言,是最严谨的HTTP报文格式描述形式
4,请求方法
GET
1>用于读取操作
2>请求参数直接拼接在URL
的后面
3>浏览器对URL
的长度是有限制的,所以请求参数不能太多
POST
1>用于添加、修改、删除操作
2>请求参数存放在请求体中,个数没有限制
HEAD
1>与
GET
请求相同,但没有响应体
2>使用场景:先获取文件大小,再决定是否下载,这样可以节省带宽资源
-
OPTIONS
:用于获取目标资源所支持的通信选项,比如服务器支持哪些请求方法 -
PUT
:用于对已存在的资源进行整体覆盖 -
PATCH
:用于对已存在的资源进行部分修改 -
DELETE
:用于删除指定的资源 -
TRACE
:让服务器回显其收到的请求信息,用于HTTP请求的测试或诊断 -
CONNECT
:让代理服务器和目标服务器建立一个TCP
连接
5,状态码
- 分类
1>信息响应:
100 ~ 199
2>成功响应:200 ~ 299
3>重定向:300 ~ 399
4>客户端错误:400 ~ 499
5>服务器错误 :500 ~ 599
⚠️注意⚠️:并不是每一个状态码都有用到
- 常见状态码
100 Continue
1>当客户端不确定服务器是否愿意接收请求时,可以先发送不带请求体的请求进行试探
2>如果服务器愿意接收请求,就会返回该状态码,表示该请求不完整,请继续发送剩余的请求
3>当客户端收到该状态码时,再发送一个带请求体的请求
200 OK
:请求成功
302 Found
:告知浏览器重新请求Location
字段中的链接
304 Not Modified
:请求的数据没有修改,可以直接使用缓存的数据
400 Bad Request
:请求报文格式错误
401 Unauthorized
:缺少目标资源要求的身份凭证
403 Forbidden
:服务器拒绝访问目标资源
404 Not Found
:服务器没有找到目标资源
405 Method Not Allowed
:请求方法错误
406 Not Acceptable
:请求头中某个Accept
字段所要求的值,服务器无法提供
408 Request Timeout
:服务器想要关闭没有在使用的TCP
连接(主动发送)
500 Internal Server Error
:服务器在执行请求时遇到意外情况
501 Not Implemented
:服务器不支持该请求方法(GET
和HEAD
必须支持)
502 Bad Gateway
:代理服务器找不到目标服务器
503 Service Unavailable
:服务器停机维护或者已超载
6,请求头字段
7,响应头字段
8,请求体的类型
Content-Type: application/json
1>请求体格式:
{"name":"zhangsan","age":"20"}
2>常应用于APP
中的接口
Content-Type: application/x-www-form-urlencoded
1>请求体格式:
name=zhangsan&age=20
2>常应用于网页表单提交(例如登录、注册等)
Content-Type: multipart/form-data; boundary=xxx
1>请求体格式:
--boundary
参数1
--boundary
参数2
--boundary
文件1
--boundary
文件2
--boundary--
2>常应用于文件上传
3>boundary
是一个随机生成的字符串
9,响应体的类型
-
text/plain
:纯文本格式 -
text/html
:HTML
格式 -
application/javascript
:JS
格式 -
text/xml
:XML
格式 -
application/json
:JSON
格式 -
image/*
:图片格式
二,HTTP进阶
1,断点续传
- 首次请求
GET /123.png HTTP/1.1
- 首次响应
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 1024
// 数据总长度在下载500个字节时网络异常,待网络恢复后继续下载
- 再次请求
GET /123.png HTTP/1.1
Range: bytes=500-
// 表示从第500个字节开始到最后一个字节
- 再次响应
HTTP/1.1 206 Partial Content
Content-Length: 524
Content-Range: bytes 500-1023/1024
2,跨域
- 前后端分离
浏览器先从页面服务器获取网页,再从接口服务器获取数据
- 同源策略
1>浏览器自带同源策略
2>它规定在默认情况下,异步请求只能发送给同源的URL
3>同源表示协议、域名、端口都相同
4>同源:http://www.network.com:80/page.html
、http://www.network.com:80/data
5>不同源:http://www.network.com:80/page.html
、https://www.network.com:80/data
- CORS
1>
CORS
是Cross-Origin Resource Sharing
的缩写,表示跨域资源共享
2>跨域资源共享表示向不同的源发送异步请求
3>假设网页的URL
为http://www.network.com:80/page.html
,数据的URL
为https://www.network.com:80/data
4>由于数据在不同的源,浏览器在请求时,会将Origin
字段设置为http://www.network.com:80
5>如果服务器允许跨域访问,需将Access-Control-Allow-Origin
设置为http://www.network.com:80
,这样浏览器才会接收该数据
3,Cookie
- 当登录成功时,服务器会创建一个
Session
对象来保存用户信息,并且将用户标识通过Set-Cookie
字段返回给浏览器 - 浏览器会将用户标识存储到
Cookie
中,在后面获取用户数据时通过Cookie
字段发送给服务器 - 服务器拿到用户标识先查找是否有对应的
Session
对象,有则表明该用户已登录,然后才能返回用户数据 -
Cookie
存储于浏览器的本地磁盘中,Session
存储于服务器的内存中 - 默认情况下,浏览器关闭时
Cookie
就会失效,Session
的有效期为30分钟
4,重定向
- 在禁止访问
http
时访问http
,会被重定向到https
- 在已登录状态时访问登录页,会被重定向到主页
- 在未登录状态时访问主页,会被重定向到登录页
5,缓存
- 基本介绍
1>需要缓存的情况:
GET
请求 + 静态资源(例如HTML
、JS
、图片等)
2>缓存分为:内存缓存(Memory Cache
)、磁盘缓存(Disk Cache
)
- 响应头
1>
Pragma
:作用类似于Cache-Control
,HTTP/1.0的产物
2>Expires
:缓存的过期时间(GMT
格式),HTTP/1.0的产物
3>Cache-Control
:缓存策略
no-storage
:不允许缓存
private
:只允许浏览器缓存
public
:允许浏览器和代理服务器缓存
no-cache
:每次请求都需要询问服务器资源是否有变化,再决定是否使用缓存
max-age
:缓存的有效时长(单位为秒)
4>Last-Modified
:资源的最后修改时间
5>ETag
:资源的唯一标识(根据内容计算出来的散列值)优先级:
Pragma > Cache-Control
,max-age > Expires
,ETag > Last-Modified
- 请求头
If-None-Match
1>如果上一次的响应头中有ETag
,就会将ETag
的值作为该字段的值
2>如果服务器发现资源的唯一标识与该字段的值不匹配,表明资源有变化,就会返回最新的资源(200 OK
)
3>否则就不会返回资源(304 Not Modified
)
If-Modified-Since
1>如果上一次的响应头中没有ETag
,有Last-Modified
,就会将Last-Modified
的值作为该字段的值
2>如果服务器发现资源的最后修改时间晚于该字段的值,表明资源有变化,就会返回最新的资源(200 OK
)
3>否则就不会返回资源(304 Not Modified
)
- Last-Modified和ETag
Last-Modified
的缺点
1>只能精确到秒级,如果资源在1秒内被修改了,浏览器就无法获取最新的资源
2>如果资源被修改了,最后修改时间发生了变化,但内容并没有改变,服务器也会返回资源
ETag
的优点
1>只要资源的内容没有变化,服务器就不会返回资源
2>只要资源的内容发生了变化,服务器就会返回资源
- 整体流程
三,HTTPS
1,基本介绍
- HTTPS是
HyperText Transfer Protocol Secure
的缩写,表示超文本传输安全协议 - HTTP是明文传输,HTTPS是密文传输
- HTTP的默认端口为
80
,HTTPS的默认端口为443
- HTTPS由于需要连接和加解密,导致传输速度较慢
2,SSL/TLS
-
SSL
是TLS
的前身 -
SSL
是Secure Sockets Layer
的缩写,表示安全套接层 -
TLS
是Transport Layer Security
的缩写,表示传输层安全性协议 -
SSL/TLS
的作用是对请求和响应报文进行加密 -
SSL/TLS
工作在应用层与传输层之间
3,HTTPS的通信过程
4,TLS的连接过程
- 十大步骤
① Client Hello
包含以下信息:
1>TLS
的版本号
2>客户端随机数(Client Random
)
3>支持的加密组件列表(加密组件包含加密算法、密钥长度等信息)
② Server Hello
包含以下信息:
1>TLS
的版本号
2>服务器随机数(Server Random
)
3>选择的加密组件
③ Certificate
包含以下信息:
1>服务器的公钥证书(CA
已签名)
④ Server Key Exchange
包含以下信息:
1>ECDHE
算法所需要的第一个参数(Server Params
)说明:
1>ECDHE
是一种密钥交换算法
2>服务器会对该参数进行签名
⑤ Server Hello Done
包含以下信息:
1>告知客户端,服务器数据已发送完毕说明:
1>客户端会用CA
的公钥对证书进行验证(CA
的公钥已内置在客户端中)
2>客户端会用服务器的公钥对参数进行验证
⑥ Client Key Exchange
包含以下信息:
1>ECDHE
算法所需要的第二个参数(Client Params
)说明:
1>到目前为止,数据都已交换完毕,客户端和服务器开始各自生成会话密钥
2>客户端和服务器都会生成两个会话密钥,一个用来加密,一个用来解密
⑦ Change Cipher Spec
包含以下信息:
1>告知服务器,之后客户端的消息都会用会话密钥进行加密
⑧ Finished
包含以下信息:
1>之前所有交换的数据的散列值(已加密)说明:
1>用来检验服务器是否能解密成功
⑨ Change Cipher Spec
包含以下信息:
1>告知客户端,之后服务器的消息都会用会话密钥进行加密
⑩ Finished
包含以下信息:
1>之前所有交换的数据的散列值(已加密)说明:
1>用来检验客户端是否能解密成功
四,HTTP/2
1,HTTP/1.1的不足
- 一个连接同时只能处理一个请求,并发需要建立多个连接
- 一个请求只能对应一个响应,服务器无法主动发起响应
- 同一个会话的多个请求中,头信息会被重复传输,造成不必要的开销
2,基本介绍
- HTTP/2在HTTP/1.1基础上增加了
SPDY
-
SPDY
(speedy
的缩写)是由Google
开发的应用层协议,它修改了HTTP/1.1的传输方式 - HTTP/1.1传输的是文本格式,HTTP/2传输的是二进制格式
- HTTP/2会将二进制数据流拆分成多个帧进行传输
- 特性:多路复用、优先级、头部压缩、服务器推送
- 问题:队头阻塞、握手延迟
3,多路复用
- 一个连接可以同时处理多个请求
- 每个请求的数据帧交替发送
- 每个帧都有帧头,帧头中包含标识信息,在接收端根据标识信息对帧进行重新组装
4,优先级
- HTTP/2允许给数据流设置依赖关系和权重值
- 客户端可以将其构建成优先级树并发送给服务器
- 服务器根据优先级树来决定如何给数据流分配资源
- 下图中
D
先于C
获得完整资源,C
先于A
和B
获得完整资源,A
获得的资源是B
的3倍
5,头部压缩
- HTTP/2使用
HPACK
算法压缩请求头和响应头,可以极大减少头部开销 - 客户端和服务器会维护两个表,静态表用来存储常用的头信息,动态表用来存储新出现的头信息
- 客户端在请求之前先去表中查询,头信息在表中存在就直接传其索引,不存在就将头信息存入表中
- 服务器拿到请求头之后,如果是索引就去表中获取头信息,如果是头信息就直接存入表中
6,服务器推送
- 服务器可以对一个客户端请求发送多个响应
7,队头阻塞
-
TCP
为了保证可靠传输,一旦有数据包丢失,必须等待该包重传完成,才会处理后面的数据包
8,握手延迟
-
TCP
三次握手和TLS
连接需要耗费一些时间
五,HTTP/3
1,基本介绍
- HTTP/3在HTTP/2基础上增加了
QUIC
-
QUIC
(Quick UDP Internet Connections
的缩写)表示快速UDP
网络连接,是由Google
开发的应用层协议 -
UDP
比TCP
速度快,但不能保证可靠传输,这个缺陷由QUIC
来弥补 - 特性:解决队头阻塞、解决握手延迟、连接迁移
- 问题:之前没有使用
UDP
进行高速的信息传输,没有得到像TCP
那样的优化,从而导致CPU
消耗大 - HTTP/2已经成为标准,HTTP/3还在试验阶段
- HTTP/2和HTTP/3都是在应用层进行改进,这样升级起来会比较简单,只需更新客户端和服务器配置即可
2,解决队头阻塞
-
UDP
不保证可靠传输,即使有数据包丢失,也不影响其他数据包的处理
3,解决握手延迟
-
QUIC
将握手和连接合并成了一个
4,连接迁移
- HTTP/2
1>HTTP/2是基于
TCP
的
2>TCP
连接四要素:源IP地址、源端口号、目标IP地址、目标端口号
3>当网络发生变化时,四要素也会发生变化,导致旧的连接失效,必须重新建立连接
- HTTP/3
1>
QUIC
使用Connection ID
来标识一个连接
2>即使四要素发生变化,只要Connection ID
不变,连接就依然有效