# HTTP
HTTP标准由IETF组织制定:
- HTTP/1.0:https://tools.ietf.org/html/rfc1945
- HTTP/1.1:https://tools.ietf.org/html/rfc2616
- HTTP/1.1 Caching:https://tools.ietf.org/html/rfc7234
- HTTPS:https://tools.ietf.org/html/rfc2818
- HTTP/2:https://tools.ietf.org/html/rfc7540
# 发展路线
# 性能发展路线
HTTP/1.0 | HTTP/1.1 | HTTP/2.0 | HTTP/3.0 | |
---|---|---|---|---|
缓存技术 | 头增加cache字段 | |||
压缩技术 | 头增加encoding字段 | 头部压缩 | ||
TCP三次握手问题 | 引入长连接[1] | |||
TCP慢启动问题 | 多路复用[2] | |||
TCP连接相互竞争带宽 | 多路复用+设置优先级 | |||
HTTP请求队头阻塞 | 多路复用 | |||
TCP包级别队头阻塞 |
备注[1]:在一个HTTP长连接上串行发送请求,引入了HTTP请求级别的队头阻塞问题,即前面请求的资源被阻塞了,后面请求的资源要一直等着。
备注[1]:在HTTP/1.1下,浏览器会为同一域名维护6个长连接,实现并行加载资源的目的。若网站引入了N个CDN域名,那么就有6*N个并行的长连接。但这6*N个长连接之间相互独立无法协商,无法优先加载JS、CSS这种关键资源的连接。
备注[2]:以往是用多个连接实现资源并行加载,多路复用是在同一个连接上并行加载,实现起来挺复杂的。在HTTP/2.0下,浏览器为同一域名只维护1个长连接。
# 功能发展路线
HTTP/1.0 | HTTP/1.1 | HTTP/2.0 | HTTP/3.0 | |
---|---|---|---|---|
多文件格式 | 头增加accept字段 | |||
状态码 | 响应头Status-Code字段 | |||
同主机绑多域名 | 请求头增加Host字段 | |||
支持动态生成的内容 | 引入Chunk transfer机制 | |||
Cookie | 引入Cookie | |||
服务端推送 | 服务端推送 |
# HTTPS
HTTPS 使用非对称加密,有公钥、私钥的概念。公钥可以随意传播,为了确保公钥是真的,我们引入了证书 (Certificate)。为了确保证书是真的,我们要去CA (Certificate Authority) 机构校验。各大CA机构的公钥是默认安装在操作系统里的,所以不要安装来路不明的操作系统,否则相当于裸奔。
HTTPS 握手分为五个阶段,这个实验用 tcpdump 命令抓包,然后导入到 Wireshark 进行分析学习。
# 学习 HTTP 协议
因为是纯文本协议,所以可以使用 telnet 工具来手工发起一个 HTTP 请求,如果不会玩,可以:
- 谷歌搜 HTTP 请求报文的格式
- 谷歌搜「send HTTP request using Telnet」
- 看下 RFC 规范,确认一下请求报文的格式