HTTP协议
http协议是基于TCP/IP协议之上的应用层协议,HTTP1.0是无状态、无连接的协议。\
- 特点:
- 无状态是指HTTP协议 自身不保留通信状态,即不保留之前一切的请求或响应报文的信息;
- 无连接是指服务器处理完客户的请求,并收到客户的应答后,即断开连接,限制了每次连接只处理一个请求。
- 缺点:
- 明文传输:安全性低--->HTTPS
HTTP请求方法
- GET:向指定的资源发出“显示”请求;使用GET方法应该只用在读取数据
- POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件),数据被包含在请求文本中
- HEAD:获得报文首部
- PUT:传输文件
- DELETE:删除文件
- OPTIONS:询问支持的方法(例如:CORS非简单请求会用到)
- CONNECT:CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。 TRACE:追踪路径,客户端可以对请求消息的传输路径进行追踪
| 属性 | GET | POST |
|---|---|---|
| 缓存 | 请求会被浏览器主动缓存,产生的URL可以作为书签保存 | 不能缓存 |
| 编码 | 只能进行URL编码,只接受ASCII字符 | 支持多种编码方式 |
| 参数 | 参数放在URL中,直接暴露,不安全 | 数据放在请求体中,更适合传输敏感数据 |
| TCP角度 | get请求会把请求报文一次性发出 | post会分为两个TCP包,先发送head部分,服务器响应100,再发body部分 |
| 数据大小 | url的长度是受限制的(url的最大长度是2048个字符) | post无限制,form表单提交数据 |
提交数据 : Nodejs 数据传递GET/POST
HTTP1.1和HTTP1.0的区别
- HTTP1.1支持长连接
- HTTP1.1中默认开启
Connection: keep-alive,在一个TCP连接上可以传送多个HTTP请求和响应,弥补了1.0每次请求都要建立连接的特点
- HTTP1.1中默认开启
- 增加HOST字段
- 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
- 新增状态码
- 例如:100(Continue) Status(节约带宽)
- 缓存处理
- 在HTTP1.0中主要使用header里的
Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Etag,If-None-Match等更多可供选择的缓存头来控制缓存策略
- 在HTTP1.0中主要使用header里的
HTTP2.0和HTTP1.1的区别
- 多路复用:HTTP2.0使用多路复用技术,支持同一个连接并发处理多个请求
- 头部压缩: HTTP2.0支持头部压缩,数据体积变小,传输更快
- 服务器推送: HTTP2.0引入server push,它允许服务器推送资源给浏览器
- 新的二进制格式: HTTP1.x解析是基于文本,HTTP2.0解析采用二进制格式,更方便实用
HTTP 3.0
由图可以看出,HTTP3和HTTP2的传输层是完全不同的协议,HTTP3的传输层是UDP协议。
- HTTP2.0的问题:
- 底层使用TCP协议建立连接,TCP的慢启动;拥塞窗口尺寸设置不合理导致性能急剧下降的问题没有得到解决
- HTTP2.0多路复用只是减少了连接数,队头阻塞的问题并没有得到完全解决。如果TCP丢包率超过2%,性能会很低
- HTTP3.0特点
- 传输层是UDP协议:使用UDP作为传输层进行通信
- 安全:从协议本身保证了安全性,QUIC在建立连接的握手过程中就完成了TLS加密握手
- 建立连接快:正常只需要1RTT即可建立连接。如果有缓存之前的secret信息,则直接验证和建立连接,此过程0RTT。建立连接时,也可以带有少量业务数据
- 使用QPACK进行头部压缩:因为HPACK要求传输过程有序,这会导致队头阻塞。而QPACK不存在这个问题
HTTP3可以看这篇:HTTP协议-HTTP3
HTTPS和HTTP
HTTP + 加密 + 认证 + 完整性保护 = HTTPS;
HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。
- TLS/SSL工作原理
HTTPS协议的主要功能基本依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数Hash(数字签名过程), 对称加密(AES、DES,主要是位运算,速度快)和非对称加密(RSA、DSA、ECC,算法复杂,慢),其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
-
ssl的大致流程
- 客户端向服务器发送客户端支持的ssl版本 + 支持的加密方式 + 一个随机数
- 服务端接收消息并返回 确认ssl版本和加密方式 + 数字证书 + 一个随机数
- 客户端确认数字证书的可靠性,并发送一个用服务端公钥加密的随机数,同时用前三个随机数通过约定的算法生成对话密钥。
- 服务器用自己的私钥解密这个随机数,并用前三个随机数通过约定的算法生成对话密钥。
-
数字证书
- 签发证书的机构、公钥、证书到期的时间
- 加密算法、hash算法
-
证书预置和申请
- 1:客户端浏览器会预置根证书, 里面包含
CA公钥 - 2:服务器去CA(证书签证机关)申请一个证书
- 3: CA用自己的签名去签一个证书,指纹信息保存在证书的数字摘要里面, 然后发送给服务器
- 1:客户端浏览器会预置根证书, 里面包含
输入一个url到页面显示的过程
可以看这篇:从输入一个url到页面显示的过程
URL的组成
protocol: 协议,常用的协议是httphostname: 主机地址,可以是域名,也可以是IP地址port: 端口 http协议默认端口是:80端口,如果不写默认就是:80端口path: 路径 网络资源在服务器中的指定路径parameter: 参数 如果要向服务器传入参数,在这部分输入query: 查询字符串 如果需要从服务器那里查询内容,在这里编辑fragment: 片段 网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置
获取URL参数:
const getURLParameters = (url) => {
const urlParamArr = url.match(/([^?=&]+)(=([^&]*))/g) || [];
const urlParamObj = urlParamArr.reduce(
(preVal, curVal) => {
preVal[curVal.slice(0, curVal.indexOf('='))] = curVal.slice(curVal.indexOf('=') + 1);
return preVal;
},
{}
);
return urlParamObj;
}
HTTP请求头和响应头
HTTP 请求报文由以下部分组成:
-
请求行 (请求方法+请求URL+协议版本)
-
请求头 (User-agent、Accept、Host)
- Accpet:告诉服务端,客户端接收什么类型的响应(对应服务端返回的Content-Type)
- Accept-Encoding: 属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩形式(一般都是压缩形式),例如gzip、deflate压缩格式
- Content-Type:客户端发送出去实体内容的类型
- Cache-Control:指定请求和响应遵循的缓存机制,如no-Cache
- Referer:表示这是请求是从哪个URL进来的
- Host:指定要请求的资源所在的主机和端口
- Cookie: 有cookie并且同域访问时会自动带上
- Connection: 当浏览器与服务器通信时对于长连接如何进行处理,如keep-alive
- User-Agent:告诉服务器,客户端使用的操作系统、浏览器版本和名称
-
空行
-
请求体 (可以包括用户提交的查询信息)
HTTP 响应报文由以下部分组成:
-
状态行 (请求方法+请求URL+协议版本)
-
消息报头 用来说明客户端需要的一些附加信息
- Access-Control-Allow-Headers: 服务器端允许的请求Headers
- Access-Control-Allow-Methods: 服务器端允许的请求方法
- Access-Control-Allow-Origin: 服务器端允许的请求Origin头部(譬如为*)
- Date:数据从服务器发送的时间
- Expires:文档的过期时间
- Cache-Control: 响应输出到客户端后,服务端通过该属性告诉客户端该怎么控制响应内容的缓存
- Max-age:客户端的本地资源缓存的最大时间,开启Cache-Control后有效
- Last-Modified:请求资源的最后修改时间
- ETag:浏览器请求变量的实体标签的当前值
- Keep-Alive:如果客户端有keep-alive,服务端也会有响应(如timeout=38)
- Server:服务器的一些相关信息
- Location: 在重定向中或者创建新资源时使用
- Set-Cookie:服务端可以设置客户端的cookie
-
空行
-
响应正文 (页面右键F12查看源码的内容)
更多可以看这篇:HTTP请求头和响应头详解
浏览器缓存、HTTP缓存 以及 浏览器缓存和CDN的关系
详细可以看这篇:浏览器缓存、HTTP缓存(强缓存、协商缓存),浏览器缓存和CDN的关系
HTTP通信和Socket通信
客户端与服务器通信的主要方式有两种:
- HTTP通信
Http连接使用的是 “请求-响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务端才能向客户端返回数据
- Socket通信
Socket通信则是在双方建立连接后,可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端向服务器发送请求
socket又称套接字,是一种抽象层,在程序内部提供了与外界通信的端口,即端口通信。应用程序通过它来发送和接受数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。
- Socket分类:
-
流套接字:流套接字将
TCP作为其端对端协议,提供了一个可信赖的字节流服务,TCP使用的是流的方式发送 -
数据报嵌套字:数据报嵌套字使用
UDP协议,提供数据打包发送数据,UDP是以包的形式发送
-
可以看这篇:Socket通信原理
Websocket
HTTP 协议有一个缺陷:通信只能由客户端发起。WebSocket 协议在2008年诞生,HTTP2.0支持服务端推送,但2013年才诞生。WebSocket 最大的特点是:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是双向平等对话,属于服务器推送技术的一种。
WebSocket特点:
- 建立在TCP协议上
- 与HTTP协议有着良好的兼容性,默认端口也是80和443,握手阶段采用HTTP协议
- 数据格式比较轻量,性能开销小
- 可以发送文本,也可以发送二进制数据
- 没有同源限制,客户端可以与任意服务器通信
- 协议标识符是
ws(如果加密,则为wss),服务器网址就是 URL 更多详细知识可以看阮一峰老师的WebSocket 教程
前端页面间数据传递常用的几种方式
- url页面路径携带参数传递
- localStorage方式传递
- sessionStorage方式传递
- cookie的方式传递