前言
第1章 QUIC產生背景1
1.1 網絡傳輸協(xié)議1
1.1.1 UDP1
1.1.2 TCP2
1.1.3 SCTP6
1.1.4 其他協(xié)議10
1.2 TLS版本演化10
1.2.1 SSL系列協(xié)議10
1.2.2 TLS 1.015
1.2.3 TLS 1.116
1.2.4 TLS 1.217
1.2.5 TLS 1.319
1.3 HTTP版本演化20
1.3.1 HTTP122
1.3.2 HTTP1.123
1.3.3 HTTP226
1.4 QUIC的誕生29
第2章 QUIC報文35
2.1 分層35
2.2 報文格式36
2.2.1 長報文37
2.2.2 短報文44
2.2.3 無狀態(tài)重置報文45
2.3 連接標識46
2.3.1 發(fā)布連接標識47
2.3.2 撤銷連接標識48
2.3.3 零長度的連接標識50
2.3.4 連接標識協(xié)商與驗證50
2.4 報文編號53
2.4.1 報文編號空間53
2.4.2 報文編號編碼54
2.4.3 報文編號解碼55
2.5 流58
2.5.1 流標識59
2.5.2 流的打開和關閉60
2.5.3 流狀態(tài)61
2.6 幀65
2.6.1 PADDING幀66
2.6.2 PING幀66
2.6.3 ACK幀67
2.6.4 RESET_STREAM幀69
2.6.5 STOP_SENDING幀70
2.6.6 CRYPTO幀70
2.6.7 NEW_TOKEN幀71
2.6.8 STREAM幀71
2.6.9 MAX_DATA幀72
2.6.10 MAX_STREAM_DATA幀72
2.6.11 MAX_STREAMS幀73
2.6.12 DATA_BLOCKED幀73
2.6.13 STREAM_DATA_BLOCKED幀74
2.6.14 STREAMS_BLOCKED幀74
2.6.15 NEW_CONNECTION_ID幀74
2.6.16 RETIRE_CONNECTION_ID幀75
2.6.17 PATH_CHALLENGE幀76
2.6.18 PATH_RESPONSE幀76
2.6.19 CONNECTION_CLOSE幀76
2.6.20 HANDSHAKE_DONE幀77
2.6.21 擴展其他幀78
2.7 錯誤碼78
2.7.1 連接錯誤碼78
2.7.2 應用錯誤碼80
2.8 傳輸參數81
2.9 變長整型編碼84
第3章 QUIC基礎85
3.1 報文確認85
3.1.1 生成確認85
3.1.2 處理確認和重傳87
3.1.3 RTT計算89
3.1.4 丟包檢測90
3.1.5 探測超時91
3.2 流控92
3.2.1 流級別的流控93
3.2.2 連接級別的流控94
3.3 擁塞控制95
3.3.1 擁塞控制概述95
3.3.2 QUIC擁塞控制的改進97
3.3.3 ECN99
3.3.4 QUIC擁塞控制算法NewReno101
3.3.5 QUIC擁塞控制算法BBR103
3.4 PMTU探測105
3.4.1 PMTUD106
3.4.2 DPLPMTUD107
3.5 地址驗證110
3.5.1 連接建立期間隱式地址驗證111
3.5.2 通過重試報文進行地址驗證112
3.5.3 通過NEW_TOKEN幀進行地址驗證113
3.5.4 通過PATH_CHALLENGE幀進行地址驗證115
3.6 連接遷移116
3.6.1 客戶端有意的連接遷移116
3.6.2 客戶端無意的連接遷移117
3.6.3 客戶端遷移安全考慮118
3.6.4 服務器移到首選地址121
3.7 中間件的RTT測量123
第4章 QUIC加密與保護127
4.1 TLS 1.3介紹127
4.1.1 TLS 1.3的密鑰127
4.1.2 TLS 1.3首次連接130
4.1.3 TLS 1.3恢復連接135
4.1.4 密鑰更新138
4.2 QUIC與TLS 1.3139
4.2.1 TCP與TLS139
4.2.2 QUIC與TLS的關系140
4.2.3 QUIC與TLS的接口142
4.2.4 QUIC對TLS的修改145
4.3 QUIC的報文保護146
4.3.1 QUIC的加密級別147
4.3.2 丟棄密鑰148
4.4 保護150
4.5 負載保護153
4.5.1 初始報文154
4.5.2 重試報文155
4.5.3 密鑰更新156
4.6 連接恢復與0-RTT158
4.6.1 0-RTT的發(fā)送與接收158
4.6.2 0-RTT密鑰160
第5章 QUIC連接的建立與關閉162
5.1 首次建立連接162
5.1.1 QUIC報文交互163
5.1.2 驗證客戶端證書166
5.1.3 建立連接時TLS參數不匹配166
5.1.4 建立連接過程中丟包167
5.1.5 版本協(xié)商170
5.2 連接恢復172
5.2.1 連接恢復過程 173
5.2.2 0-RTT傳輸參數174
5.2.3 0-RTT安全175
5.2.4 0-RTT例子177
5.3 連接關閉 179
5.3.1 空閑超時180
5.3.2 立即關閉182
5.3.3 無狀態(tài)重置184
第6章 QUIC中間件188
6.1 簡單的負載均衡188
6.1.1 服務器共享地址189
6.1.2 服務器不共享地址190
6.2 協(xié)作的負載均衡191
6.2.1 連接標識的格式192
6.2.2 配置代理193
6.2.3 服務器生成連接標識193
6.2.4 負載均衡器路由算法194
6.3 重試卸載195
6.3.1 不共享狀態(tài)的重試卸載197
6.3.2 共享狀態(tài)的重試卸載198
第7章 QUIC擴展協(xié)議201
7.1 多路QUIC201
7.1.1 多路QUIC傳輸參數202
7.1.2 報文編號空間202
7.1.3 增加的新幀202
7.1.4 多路的加解密205
7.1.5 新路徑建立和拆除過程205
7.1.6 數據的調度208
7.2 不可靠數據報209
第8章 HTTP3212
8.1 流的使用212
8.1.1 控制流214
8.1.2 推送流214
8.1.3 編碼器流和解碼器流215
8.2 HTTP3幀215
8.2.1 DATA幀216
8.2.2 HEADER幀217
8.2.3 CANCEL_PUSH幀217
8.2.4 SETTING幀217
8.2.5 PUSH_PROMISE幀218
8.2.6 GOAWAY幀219
8.2.7 MAX_PUSH_ID幀219
8.3 HTTP3交互220
8.3.1 建立連接220
8.3.2 請求和響應220
8.3.3 服務器推送222
8.3.4 連接關閉224
8.4 QPACK226
8.4.1 前綴整數編碼227
8.4.2 靜態(tài)字典228
8.4.3 動態(tài)字典228
8.4.4 字段行集合編碼232
8.4.5 QPACK例子235
第9章 基于QUIC的其他協(xié)議237
9.1 DNS237
9.1.1 DNS簡介237
9.1.2 DoQ239
9.2 使用QUIC的通用考慮240
9.2.1 0-RTT使用的考慮240
9.2.2 ?;畹目紤]240
9.2.3 傳輸協(xié)議回退的考慮241
9.2.4 流的使用242
9.2.5 連接關閉242
9.2.6 應用標識242
第10章 QUIC開源代碼與應用實例243
10.1 接口介紹 243
10.1.1 QUIC的配置244
10.1.2 TLS的配置245
10.1.3 服務器接口246
10.1.4 客戶端的接口246
10.1.5 連接的接口247
10.1.6 流的接口248
10.2 源碼使用248
10.2.1 使用QUIC248
10.2.2 HTTP3接口使用252
10.3 quic-go源碼分析254
10.3.1 QUIC源碼分析254
10.3.2 HTTP3源碼分析256
10.3.3 qtls源碼分析258
第11章 分析工具263
11.1 qlog263
11.2 qvis265
11.3 wireshark268
第12章 QUIC未來展望271
12.1 QUIC的局限性 271
12.2 QUIC未來發(fā)展273