第 一部分 网络协议基础知识
第 1章 TCP/IP基础知识 2
1.1 网络协议简介 2
1.2 TCP/IP简介 2
1.2.1 应用层 3
1.2.2 传输层 4
1.2.3 网络层 5
1.2.4 网络接口层 6
1.3 网站是如何加载的 7
1.3.1 DNS解析 8
1.3.2 TCP连接建立 10
1.3.3 TLS连接建立 12
1.3.4 HTTP请求及应答 20
1.4 小结 21
第 2章 HTTP基础知识 22
2.1 HTTP主要版本 22
2.1.1 HTTP/1.1 22
2.1.2 HTTP/2 25
2.1.3 HTTP/3 30
2.2 HTTP特性之缓存 32
2.2.1 什么是缓存 32
2.2.2 缓存分类 32
2.2.3 缓存机制的实现 35
2.3 HTTP特性之重定向 36
2.3.1 什么是重定向 37
2.3.2 HTTP重定向过程 37
2.3.3 Nginx中重定向的配置 38
2.4 HTTP特性之cookie 39
2.4.1 cookie的作用 39
2.4.2 服务器如何创建cookie 40
2.5 HTTP优化的常用手段 40
2.6 小结 42
第二部分 QUIC协议
第3章 QUIC协议概述 44
3.1 HTTPS有什么缺点 44
3.2 QUIC协议如何解决HTTPS的缺点 48
3.3 QUIC协议与HTTP/3的关系 50
3.4 小结 51
第4章 QUIC协议的流 52
4.1 流类型与流ID 52
4.2 流状态 54
4.2.1 流发送状态机 54
4.2.2 流接收状态机 56
4.3 流优先级 57
4.3.1 流优先级的设置 57
4.3.2 HTTP/2的流依赖 58
4.3.3 HTTP/2的流权重 58
4.3.4 流的多路复用 59
4.4 流量控制 59
4.4.1 TCP的流量控制算法 60
4.4.2 QUIC协议的流量控制算法 61
4.4.3 流量控制优化策略 64
4.5 小结 66
第5章 QUIC连接建立 67
5.1 连接ID 67
5.1.1 连接ID的作用 67
5.1.2 连接ID的生成和使用 68
5.1.3 数据包如何与连接匹配 69
5.2 1-RTT连接建立 69
5.2.1 什么是1-RTT连接建立 70
5.2.2 Client Hello报文介绍 72
5.2.3 Server Hello报文介绍 76
5.2.4 New Session Ticket报文介绍 77
5.3 0-RTT连接建立 78
5.3.1 什么是0-RTT连接建立 78
5.3.2 Client Hello报文介绍 79
5.3.3 0-RTT包介绍 81
5.3.4 0-RTT传输参数 82
5.3.5 Server Hello报文介绍 83
5.4 建立连接的安全性 83
5.4.1 0-RTT连接建立的公钥泄漏造成的安全性问题 84
5.4.2 0-RTT连接建立造成重放攻击问题 84
5.4.3 建立连接存在放大攻击风险 85
5.5 连接关闭 89
5.5.1 如何关闭QUIC连接 89
5.5.2 连接错误 90
5.5.3 流错误 91
5.6 实践建立QUIC连接遇到的性能问题 91
5.6.1 重试机制导致建立连接需要多个RTT 91
5.6.2 地址验证机制导致建立连接需要多个RTT 92
5.6.3 乱序带来的建立连接失败问题 93
5.6.4 如何提升0-RTT成功率 94
5.7 小结 94
第6章 QUIC连接迁移 95
6.1 什么是连接迁移 95
6.2 连接迁移过程 96
6.2.1 探测新路径 97
6.2.2 客户端发起连接迁移 97
6.2.3 服务端响应连接迁移 97
6.3 连接迁移期间的地址验证 99
6.4 实现连接迁移的难题 100
6.5 连接迁移的优化 102
6.5.1 四层负载均衡器的资源
消耗优化 102
6.5.2 连接迁移偶然失败问题优化 103
6.5.3 连接迁移成功率优化 104
6.6 小结 104
第7章 QUIC协议的传输机制 105
7.1 QUIC协议的传输机制与TCP的传输机制 105
7.2 RTT的计算方式 110
7.3 PTO的计算与探测包的实现 113
7.3.1 PTO的计算 113
7.3.2 探测包的实现 114
7.4 拥塞控制算法 115
7.4.1 QUIC协议的拥塞控制算法 116
7.4.2 Cubic算法 118
7.4.3 BBR算法 120
7.5 小结 123
第8章 QUIC协议的帧类型与格式 124
8.1 QUIC协议的帧概述 124
8.2 PADDING帧 125
8.3 PING帧 126
8.4 ACK帧 127
8.5 STOP_SENDING帧 129
8.6 CRYPTO帧 129
8.7 NEW_TOKEN帧 130
8.8 流相关的帧 130
8.8.1 STREAM帧 130
8.8.2 MAX_STREAMS帧 131
8.8.3 STREAMS_
BLOCKED帧 131
8.8.4 REST_STREAM帧 132
8.9 数据相关的帧 132
8.9.1 MAX_DATA帧 132
8.9.2 MAX_STREAM_DATA帧 133
8.9.3 DATA_BLOCKED帧和STREAM_DATA_BLOCKED帧 133
8.10 连接ID相关的帧 134
8.10.1 NEW_CONNECTION_ID帧 134
8.10.2 RETIRE_CONNECTION_ID帧 135
8.11 PATH_CHALLENGE帧和PATH_RESPONSE帧 135
8.12 CONNECTION_CLOSE帧 136
8.13 HANDSHAKE_DONE帧 137
8.14 使用Wireshark查看QUIC帧 137
8.15 小结 138
第9章 QUIC协议与HTTP/3的错误处理 139
9.1 QUIC协议的错误码 139
9.2 HTTP/3的错误码 143
9.3 小结 144
第三部分 HTTP/3
第 10章 HTTP/3的特性 146
10.1 连接管理 146
10.1.1 服务发现 146
10.1.2 连接复用 147
10.2 消息 150
10.2.1 请求与响应 150
10.2.2 消息分帧 150
10.2.3 首部字段 151
10.2.4 请求的取消与拒绝 154
10.3 帧类型 155
10.3.1 DATA帧 155
10.3.2 HEADERS帧 156
10.3.3 CANCEL_PUSH帧、PUSH_PROMISE帧、MAX_PUSH_ID帧 156
10.3.4 SETTINGS帧 157
10.3.5 GOAWAY帧 157
10.4 QPACK压缩 157
10.4.1 HTTP/2的HPACK算法 158
10.4.2 HTTP/3的QPACK 160
10.5 服务器推送 160
10.6 状态码 161
10.7 小结 164
第 11章 HTTP/3的应用 165
11.1 协议竞速 165
11.2 如何开启浏览器的HTTP/3 167
11.3 如何使用Nginx的HTTP/3 168
11.4 HTTP/3支持源地址透传 169
11.4.1 Proxy Protocol介绍 170
11.4.2 QUIC协议支持Proxy Protocol 171
11.5 小结 172
第 12章 HTTP/3的实践和发展 173
12.1 HTTP/3的实践效果 173
12.1.1 实验环境测试 173
12.1.2 业务提升效果 174
12.2 HTTP/3的发展 174
12.2.1 HTTP/3适合的应用场景 175
12.2.2 HTTP/3的未来 175
12.3 小结 176
第 13章 HTTP/3优化 177
13.1 升级至HTTP/3对业务的影响 177
13.2 HTTP/3的应用存在哪些问题 178
13.3 如何优化HTTP/3的性能 179
13.3.1 提升0-RTT连接建立的成功率 179
13.3.2 提升QUIC连接复用率 180
13.3.3 避免版本协商 181
13.3.4 支持MPQUIC协议 181
13.4 小结 184
第四部分 QUIC协议的实现
第 14章 QUIC客户端的代码实现 186
14.1 QUIC客户端连接建立的代码实现 186
14.1.1 重试机制 187
14.1.2 握手过程 190
14.2 QUIC客户端连接迁移的代码实现 196
14.3 QUIC客户端流量控制算法的代码实现 202
14.4 QUIC客户端PING帧的代码实现 208
14.5 小结 210
第 15章 QUIC服务端的代码实现 211
15.1 QUIC服务端连接建立的代码实现 211
15.1.1 解析收到的QUIC包(Initial包) 214
15.1.2 验证令牌 224
15.1.3 建立QUIC连接 224
15.2 QUIC服务端连接迁移的代码实现 231
15.2.1 eBPF介绍 232
15.2.2 使用BPF实现多核处理器下的连接迁移 233
15.2.3 连接迁移处理过程 238
15.3 QUIC服务端拥塞控制算法的代码实现 244
15.4 小结 254