# 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 规范,确认一下请求报文的格式