0. Intro
- 不断更新有关HTTP的学习
1. HTTP 基本概念
- HTTP:HyperText Transfer Protocol / 超文本传输协议
- 双向协议,因为可以传输,允许中间中转和传输
- 状态码
- 1xx:提示信息,协议处理中间状态,还需要后续处理
- 2xx:成功,报文已经被正确处理
- 206: Partial Content: 分块下载和断点续传,表示响应返回的body不是全部资源
- 3xx:重定向,需要客户端重新请求
- 301: Moved Permanently,永久重定向,资源不存在
- 302: Found,临时重定向
- 304: Not Modified,缓存重定向
- 4xx:客户端错误,报文有误,服务器无法处理
- 403: Forbidden: 服务器禁止访问资源
- 404: Not Found
- 5xx: 客户端请求报文正确,服务端处理错误
- 501: Not Implemented,客户端请求的功能不支持
- 502: Bad Gateway,常常是网关或代理出错
- 常见字段
- Host: 服务器域名
- Content-Length: 本次回应数据长度
- Connection: 常要求客户端要求TCP持久连接
- Content-Type: 服务端响应的时候告诉客户端,数据格式
Content-Type: text/html; charset=utf-8
- Accept: 客户端声明自己接受的数据格式
Accept: / 表示接受任何格式
- Content-Encoding: 说明数据压缩方式,服务端返回的数据使用什么压缩格式
- Accept-Encoding: 客户端能接受的压缩方式
2. GET & POST
- 安全和幂等
- 安全是指,请求方法不会破坏服务器上的安全
- 幂等是指,多次执行相同的操作,结果都是相同的
- Get是安全且幂等的
- Post是不安全且不幂等的,会修改服务器上的资源,多次提交会创建多个资源
3. HTTP/1.1特性
- 优点: 简单,灵活,易扩展,应用广泛,跨平台
- 简单: header + body / header 中也是key-value的形式
- 灵活&易扩展: 可自定义和扩充协议里犯法,URl/URI,状态码,头字段
- 应用广泛&跨平台
缺点: 无状态,明文传输,不安全
- 无状态: 解决方案较简单的是cookie,写入cookie来控制客户端的状态
- 明文传输: 信息裸奔
- 不安全: 明文,内容可能被窃听 / 不验证通信方身份,可能被伪装 / 无法验证报文完整性,可能被篡改
HTTP协议基于TCP/IP,使用请求-应答通信模式
- 长连接: HTTP/1.1提出长连接的通信方式,减少TCP重复创建的开销
- 长连接使的pipeline成为可能,减少整体的响应时间,但是服务器还是按照顺序执行,可能会造成队头阻塞
- 队头阻塞
4. HTTP & HTTPS
- 区别
- HTTPS在TCP&HTTP网络层之间加入了SSL/TLS安全协议,报文能够加密传输
- HTTPS在三次握手之后,还需要进行SSL/TLS握手的过程
- HTTP端口是80,HTTPS端口是443
- HTTPS需要申请数字证书,保证服务器的身份可信
如何解决问题?
- 混合加密: 实现信息的机密性
- 摘要算法: 实现完整性
- 数字证书: 解决了冒充的风险
混合加密
- 采用对称加密和非对称加密结合的混合加密
- 建立前通过非对称加密生成会话密钥
在通信过程中全部使用对称加密,加密明文数据
对称加密,使用一个密钥,运算速度快
- 非对称加密,使用公钥和私钥
摘要算法
- 数字证书
SSL/TLS协议基本流程
- 客户端向服务端索要公钥
- 双方协商生产会话密钥
- 采用会话密钥进行加密通信
握手阶段涉及4次通信
- clientHello
- 客户端向服务端发起加密通信请求
- ServerHello
- 服务器回应client
- 返回服务器的数字证书
- 客户端回应
- 确认服务器证书的真实性
- 从数字证书取出服务器中的公钥
服务器回应
- clientHello
5. Http/1.1 HTTP/2 HTTP/3演变
- HTTP/1.1 & HTTP/1 提高了什么?
- TCP长连接
- 支持pipeline
- 性能瓶颈
- header未压缩,头部信息越多延迟越大
- 冗长的首部
- 队头阻塞
- 无请求优先级控制
- 请求只能从客户端发起,服务器被动响应
HTTP/2 提高了什么?
- 协议基于HTTPS,安全性是得到保障的
- 相对于HTTP/1.1的改进
- 头部压缩: HPACK算法,客户端和服务器同事维护一张表,所有字段都会存入这个表,生成索引号,以后就不发送同样的字段,只发送索引号,hash表
- 二进制格式: 报文从纯文本格式修改为二进制格式,头信息和数据体都是二进制的,统称为帧,头信息帧和数据帧
- 数据流: 数据包不是按照顺序发送,每个数据流都有独一无二的编号,客户端数据流是奇数,服务器发出的数据流是偶数,客户端可以指定数据流的优先级
- 多路复用: 移除串行请求
- 服务器推送: 服务器也可以主动向客户端发送消息,Cache Push
HTTP/2有什么缺陷? HTTP/23 提高了什么?
缺陷:
- TCP协议不知道有多少HTTP请求
- 一旦丢包,会触发TCP的重传机制,所有的HTTP请求都必须等待丢了包的回传,形成阻塞
HTTP/3改善
- 由于丢包问题,是出于TCP传输层的问题,所以HTTP/3把HTTP下层的TCP协议改成了UDP
- UDP不可靠传输,基于UDP的QUIC协议可以实现类似TCP的可靠性传输
- QUIC当某个流发生丢包时,只会阻塞这个流,其它流不会受到影响
- TLS升级为1.3
- 头部压缩算法为QPack
- HTTPS要建立一个连接需要六次交互,TCP建立连接3次握手,然后是TLS/1.3的三次握手,QUIC直接把以往的TCP和TLS/1.3的6次交互合并成了3次,减少了交互次数
- QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用的协议
7.零碎知识点
7.1 URL&URI
URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串
URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor
URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。
URI,URL&URN的超集
一个资源可以有多个URI
组成
schema, user information, host, port, path, query, fragment