请求/响应报文
- 请求行 也叫 起始行 以空格进行分割 比如 GET / HTTP1.0 代表以get请求的形式请求服务器根目录下的文件 其中http的版本是 1.0
- 状态行 这里就是服务器响应的头部 比如 HTTP/1.1 200 OK 版本是1.0 状态吗是200 状态描述是OK
- 请求头/响应头 比如 Host 字段 只能出现在请求头里 代表要访问的主机地址 User-Agent 只能出现在请求头里 Date通常出现在响应头里 代表更新的时间 客户端好做缓存
- 加上一个空行 之后 就可以跟上http的body数据了
http有哪些特点
- 灵活可扩展的协议
- 可靠传输
- 应用层协议
- 请求应答模式
- 无状态 例如不记录客户端的状态 这次请求和下次请求都需要传校验信息
每个请求都是相互独立的
http的链接管理
- http 0.9 1.0 都是采用的短链接 就是一次交互建立一个链接 使用完立即关掉 这里TCP的链接也要每次都经历 三次握手 四次挥手
- 长链接 一次链接之后就可以共用这个链接
- 队头阻塞 一个链接的串行 如果有一个执行时间长 那么后边的就会阻塞
- 性能优化 解决 队头阻塞的问题 第一种办法 客户端创建多个http 链接。但也不能太多 会影响服务器的性能 第二种办法 域名分片 这个是扩大客户端链接数的办法 比如一个域名 浏览器限制了 6个链接 那么多个域名指向同一个服务器 就可以让浏览器有多个链接。
什么是安全
- 机密性
- 完整性
- 身份认证
- 不可否认
什么是https
- 把http的下层协议变成了SSL/TLS现在叫TLS的居多 传输层安全 然后才是TCP/IP
- 密码套件 浏览器和服务器在使用TLS建立连接时需要选择一组恰当的加密算法来实现安全通信,这些算法的组合成为密码套件 例如其中一个加密算法 ECDHE-RSA-AES256-GCM-SHA384 意思是说 使用ECDHE算法进行密钥交换 使用RSA进行签名和身份认证 握手后使用AES对称算法 密钥长度是256 分组模式是GCM 摘要算法是SHA384 用于消息认证和产生随机数
对称加密
- 加密和解密使用的是同一套密钥 常用的有AES 和 ChaCha20
- 分组模式 让算法用固定长度的密钥加密任意长度的明文 把明文转换成密文 例如AES128-CBC 采用AES对称加密 分组模式CBC 密钥长度是128位
非对称加密
- 加密和解密使用的不是同一个密钥 一个是公钥 一个是私钥 用公钥加密的只能用私钥解密 用私钥加密的只能用公钥解密 非对称算法如rsa
- RSA 比较著名 基于整数分解 使用两个超大素数的乘积 作为生成密钥的材料
- ECC 是后起之秀基于椭圆曲线离散对数 子算法 ECDHE用于密钥交换 ECDSA 用于数字签名 比RSA 安全性 和 性能上高
混合加密
使用非对称加密方式进行密钥交换 使用对称加密的方式加密铭文 ,用公钥加密对称加密的密钥 然后服务端用私钥解密出对称加密的密钥
摘要算法
实现完整性的手段主要是摘要算法 一种特殊的单向加密算法 加密后的数据无法解密 不能从摘要推出原文 例如 SHA-2 算法
完整性
- 摘要算法保证了数字摘要和原文是完全等价的 只要在原文后附加上摘要 就能保证数据的完整性
- 必须建立在机密性之上 使用混合加密中的会话密钥 加密消息和摘要
数字签名
用来做身份认证和不可否认的 通信双方已经呼唤 具体做法是 用私钥加密摘要信息 由于私钥只能由公钥解密 所以既实现了完整性和身份认证 证明我就是我
数字证书和CA
解决 公钥信任问题 CA(证书认证机构)是可信的 不是黑客
HTTPS 建立连接
在https协议里 需要另外一个握手过程 在TCP上建立安全链接之后再收发http报文
TLS(1.2) 链接过程 ECDHE
- ClientHello 随机数C TLS 版本号 密码套件 -> 服务器 -> ACK
- ServerHello 随机数S 确认TLS版本号 和使用的密码套件(ECDHE)
- 服务端为了证明身份把证书发给客户端 同时把 密钥交换算法(ECDHE)的公钥发给客户端 在加上自己的私钥签名认证-> 客户端
- 此时 明文共享了三个信息 Client Random、Server Random 和 Server Params
- 客户端验证证书 并且根据密码套件 生成自己的公钥 并且把公钥也发给服务器
- 客户端和服务器拿到了密钥交换算法的两个参数 Client Params、Server Params 经过ECDHE算法 算出Pre-Master 前主密钥(其实就是一个随机数) 这个前主密钥 黑客是无法破解的
- 此时客户端和服务器手里有了三个随机数 Client Random、Server Random 和 Pre-Master 此时根据这三个值生成会话密钥 由于前主密钥不会泄漏 所以会话密钥 安全
- 会话密钥一旦产生 以后的交流就使用这个密钥 对称加密数据
客户端认证
此时用户名 密码 可以验证 再高端一点的 比如银行系统会用到U盾
TLS(1.3)握手过程
精简了 加密算法 简化了握手的过程
- TCP 链接建立之后 浏览器先发一个Client Hello
- 服务端收到后 返回ServerHello 和 随机数 主要多了扩展字段 key_share”扩展带上曲线和对应的公钥参数
- 这是交换了两条消息 服务端和客户端就共享了4个信息 Client Random 和 Server Random、Client Params 和 Server Params 两边都用 ECHDE 算法 一顿算 生成Pre-Master 再用 HKDF 生成主密钥“Master Secret”
RSA 握手 和 EDDHE 握手的区别
- EDDHE 算法更快 性能更好
- 生成前主密钥 RSA 是自己生成一个 然后用服务端的 公钥加密前主密钥 给到服务端 然后两端分别根据 randomS randomC 和 前主密钥 算出主密钥 EDDHE 是各自算出前主密钥和主密钥
总结
http 超文本传输协议 超文本就是例如音频 视频 文件文本等这些信心 传输 就是可以实现点对点的数据传递 协议 就是规定了书就该怎么传 比如 状态行。请求首部 请求body
http 是应用层协议 是建立在TCP/IP之上的 所以他也是可靠的传输 TCP/IP协议分别对应 传输层和网络层
http是明文传输 不安全 所以出现了https 也就是加密的http 其实就是多了一层 TLS 传输层安全 多加了一层协议
什么是安全 必须要满足 机密 数据完整 身份认证 不可否认
用对称加密和非对称加密保证机密性 摘要加密算法 保证完整性 签名算法 保证 身份认证 和 不可否认