(1991)
telnet www.example.com 80
GET /index.html
<html>...
<EOF>
当时唯一的 HTTP 方法
HTML 文档的逻辑位置
/r/n
请求结尾
服务器返回请求的文档
断开连接
表示文档返回完毕
(1996)
telnet www.example.com 80
GET / HTTP/1.0
User-Agent: HappyBrowser
Accept: */*
HTTP/1.0 200 OK
Content-Type: text/html
Server: HappyServer
<html>....
<EOF>
请求行增加了版本号
方便与未来版本区分
请求和响应
增加了 HTTP 头
传递扩展信息
响应增加了状态码
表示响应的类型
响应完成后连接会被断开
1 个 RTT
Client
Server
1-RTT
TCP Handshake
至少 1 个 RTT
Client
Server
1-RTT
1-RTT
TLS handshake
TCP 吞吐量受拥塞窗口限制
窗口根据网络状况逐步放大
(1999)
telnet www.example.com 80
GET / HTTP/1.0
User-Agent: HappyBrowser
Accept: */*
HTTP/1.0 200 OK
Content-Type: text/html
Server: HappyServer
Connection: Keep-Alive
<html>....
HTTP 1.1 默认保持连接
telnet www.example.com 80
GET / HTTP/1.0
User-Agent: HappyBrowser
Accept: */*
Connection: Close
HTTP/1.0 200 OK
Content-Type: text/html
Server: HappyServer
Connection: Close
<html>....
<EOF>
文档里的 HTTP
工作中的 HTTP
Client
Server
HTTP
GET /something
200 OK
😐
network.http.max-persistent-connections-per-server
通过切分域名获得更大的并行下载数
只是(可能)还小于排队的代价
http://bitsup.blogspot.com/2015/02/http2-is-live-in-firefox.html
network.http.pipelining
Client
Server
HTTP
GET /a
200 OK
GET /b
200 OK
Client
Server
HTTP
GET /a
?
GET /b
waiting
http://news.163.com/10/0820/07/6EH0HMVL00014AED.html
http://news.qq.com/a/20131211/010097.htm
(2015)
speedy
在同一个 HTTP 连接上同时支持多组请求
解决应用层顺序问题
Client
Server
HTTP/2
GET /a (s1)
200 OK (s2)
GET /b (s2)
200 OK (s1)
TCP 握手,TLS 握手
TCP Fast Open
在客户端第一个 SYN 包中预传输数据
0-RTT Handshake
在 Client Hello 和 Server Hello 中传输应用数据
HTTP/2 解决了应用层排队问题,但 TCP 本身要求顺序
Client
Server
HTTP/2 over TCP
GET /a (s1)
s2
丢包,等待重传
GET /b (s2)
s1
已经到达,但需要等待
Quick UDP Internet Connection
Client
Server
HTTP/2 over QUIC
GET /a (s1)
s2
丢包,等待重传
GET /b (s2)
s1
已经到达,返回应用层
TCP
TLS
HTTP/2
HTTP/2 over TCP
UDP
QUIC
HTTP/2
HTTP/2 over QUIC
流管理
安全加密
拥塞控制,顺序
为什么使用 UDP
XHR/Fetch
浏览器
HTTP
Socket
TCP
操作系统
QUIC
libquic
UDP
UDP 是 IP 上的一层薄层
chrome://flags/#enable-quic