深入理解Linux網(wǎng)絡(luò): 修煉底層內(nèi)功,掌握高性能原理
定 價(jià):118 元
- 作者:張彥飛(@開發(fā)內(nèi)功修煉)
- 出版時(shí)間:2022/5/1
- ISBN:9787121434105
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP316.85
- 頁碼:336
- 紙張:
- 版次:01
- 開本:16開
本書通過拋出了一些開發(fā)、運(yùn)維等技術(shù)人員工作中的常見問題,激發(fā)讀者的思考。從這些疑問出發(fā),深入地對(duì)網(wǎng)絡(luò)底層實(shí)現(xiàn)原理進(jìn)行了拆解,帶領(lǐng)讀者看清楚問題的核心,提高大家的技術(shù)功力。例如網(wǎng)絡(luò)包是如何被接收和發(fā)送的?阻塞到底在內(nèi)部是如何發(fā)生的?epoll 的底層工作原理又是啥?TCP 連接在底層上是如何支持和實(shí)現(xiàn)的?書中對(duì)這些內(nèi)容都有深度的闡述。本書旨在通過帶領(lǐng)讀者修煉底層內(nèi)功,進(jìn)而幫助大家深度掌握網(wǎng)絡(luò)高性能原理。
張彥飛,2010年碩士畢業(yè)于西北大學(xué)計(jì)算機(jī)學(xué)院,有十多年的大型互聯(lián)網(wǎng)公司項(xiàng)目經(jīng)驗(yàn),目前就職于騰訊。他喜歡對(duì)技術(shù)進(jìn)行深度思考,善于挖掘技術(shù)點(diǎn)背后的原理。他的技術(shù)公眾號(hào)“開發(fā)內(nèi)功修煉”一年便收到五萬多讀者的關(guān)注。
第1章 緒論 / 1
1.1 我在工作中的困惑 / 2
1.1.1 過多的TIME_WAIT / 2
1.1.2 長(zhǎng)連接開銷 / 2
1.1.3 CPU被消耗光了 / 3
1.1.4 為什么不同的語言網(wǎng)絡(luò)性能差別巨大 / 4
1.1.5 訪問127.0.0.1過網(wǎng)卡嗎 / 4
1.1.6 軟中斷和硬中斷 / 5
1.1.7 零拷貝到底是怎么回事 / 5
1.1.8 DPDK / 5
1.2 本書內(nèi)容結(jié)構(gòu) / 6
1.3 一些約定 / 7
1.4 一些術(shù)語 / 8
第2章 內(nèi)核是如何接收網(wǎng)絡(luò)包的 / 9
2.1 相關(guān)實(shí)際問題 / 10
2.2 數(shù)據(jù)是如何從網(wǎng)卡到協(xié)議棧的 / 11
2.2.1 Linux網(wǎng)絡(luò)收包總覽 / 12
2.2.2 Linux啟動(dòng) / 13
2.2.3 迎接數(shù)據(jù)的到來 / 23
2.2.4 收包小結(jié) / 33
2.3 本章總結(jié) / 34
第3章 內(nèi)核是如何與用戶進(jìn)程協(xié)作的 / 41
3.1 相關(guān)實(shí)際問題 / 42
3.2 socket的直接創(chuàng)建 / 43
3.3 內(nèi)核和用戶進(jìn)程協(xié)作之阻塞方式 / 46
3.3.1 等待接收消息 / 47
3.3.2 軟中斷模塊 / 52
3.3.3 同步阻塞總結(jié) / 57
3.4 內(nèi)核和用戶進(jìn)程協(xié)作之epoll / 59
3.4.1 epoll內(nèi)核對(duì)象的創(chuàng)建 / 60
3.4.2 為epoll添加socket / 62
3.4.3 epoll_wait之等待接收 / 68
3.4.4 數(shù)據(jù)來了 / 71
3.4.5 小結(jié) / 79
3.5 本章總結(jié) / 80
第4章 內(nèi)核是如何發(fā)送網(wǎng)絡(luò)包的 / 84
4.1 相關(guān)實(shí)際問題 / 85
4.2 網(wǎng)絡(luò)包發(fā)送過程總覽 / 86
4.3 網(wǎng)卡啟動(dòng)準(zhǔn)備 / 90
4.4 數(shù)據(jù)從用戶進(jìn)程到網(wǎng)卡的詳細(xì)過程 / 92
4.4.1 send系統(tǒng)調(diào)用實(shí)現(xiàn) / 92
4.4.2 傳輸層處理 / 94
4.4.3 網(wǎng)絡(luò)層發(fā)送處理 / 99
4.4.4 鄰居子系統(tǒng) / 103
4.4.5 網(wǎng)絡(luò)設(shè)備子系統(tǒng) / 105
4.4.6 軟中斷調(diào)度 / 109
4.4.7 igb網(wǎng)卡驅(qū)動(dòng)發(fā)送 / 111
4.5 RingBuffer內(nèi)存回收 / 114
4.6 本章總結(jié) / 115
第5章 深度理解本機(jī)網(wǎng)絡(luò)IO / 119
5.1 相關(guān)實(shí)際問題 / 120
5.2 跨機(jī)網(wǎng)絡(luò)通信過程 / 120
5.2.1 跨機(jī)數(shù)據(jù)發(fā)送 / 120
5.2.2 跨機(jī)數(shù)據(jù)接收 / 125
5.2.3 跨機(jī)網(wǎng)絡(luò)通信匯總 / 127
5.3 本機(jī)發(fā)送過程 / 127
5.3.1 網(wǎng)絡(luò)層路由 / 127
5.3.2 本機(jī)IP路由 / 130
5.3.3 網(wǎng)絡(luò)設(shè)備子系統(tǒng) / 131
5.3.4 “驅(qū)動(dòng)”程序 / 133
5.4 本機(jī)接收過程 / 135
5.5 本章總結(jié) / 137
第6章 深度理解TCP連接建立過程 / 139
6.1 相關(guān)實(shí)際問題 / 140
6.2 深入理解listen / 141
6.2.1 listen系統(tǒng)調(diào)用 / 141
6.2.2 協(xié)議棧listen / 142
6.2.3 接收隊(duì)列定義 / 143
6.2.4 接收隊(duì)列申請(qǐng)和初始化 / 145
6.2.5 半連接隊(duì)列長(zhǎng)度計(jì)算 / 146
6.2.6 listen過程小結(jié) / 148
6.3 深入理解connect / 148
6.3.1 connect調(diào)用鏈展開 / 149
6.3.2 選擇可用端口 / 151
6.3.3 端口被使用過怎么辦 / 153
6.3.4 發(fā)起syn請(qǐng)求 / 155
6.3.5 connect小結(jié) / 156
6.4 完整TCP連接建立過程 / 157
6.4.1 客戶端connect / 159
6.4.2 服務(wù)端響應(yīng)SYN / 160
6.4.3 客戶端響應(yīng)SYNACK / 162
6.4.4 服務(wù)端響應(yīng)ACK / 164
6.4.5 服務(wù)端accept / 167
6.4.6 連接建立過程總結(jié) / 167
6.5 異常TCP連接建立情況 / 169
6.5.1 connect系統(tǒng)調(diào)用耗時(shí)失控 / 169
6.5.2 第一次握手丟包 / 171
6.5.3 第三次握手丟包 / 176
6.5.4 握手異?偨Y(jié) / 178
6.6 如何查看是否有連接隊(duì)列溢出發(fā)生 / 179
6.6.1 全連接隊(duì)列溢出判斷 / 179
6.6.2 半連接隊(duì)列溢出判斷 / 181
6.6.3 小結(jié) / 183
6.7 本章總結(jié) / 183
第7章 一條TCP連接消耗多大內(nèi)存 / 187
7.1 相關(guān)實(shí)際問題 / 188
7.2 Linux內(nèi)核如何管理內(nèi)存 / 188
7.2.1 node劃分 / 189
7.2.2 zone劃分 / 191
7.2.3 基于伙伴系統(tǒng)管理空閑頁面 / 192
7.2.4 slab分配器 / 194
7.2.5 小結(jié) / 197
7.3 TCP連接相關(guān)內(nèi)核對(duì)象 / 198
7.3.1 socket函數(shù)直接創(chuàng)建 / 198
7.3.2 服務(wù)端socket創(chuàng)建 / 206
7.4 實(shí)測(cè)TCP內(nèi)核對(duì)象開銷 / 207
7.4.1 實(shí)驗(yàn)準(zhǔn)備 / 207
7.4.2 實(shí)驗(yàn)開始 / 208
7.4.3 觀察ESTABLISH狀態(tài)開銷 / 209
7.4.4 觀察非ESTABLISH狀態(tài)開銷 / 211
7.4.5 收發(fā)緩存區(qū)簡(jiǎn)單測(cè)試 / 214
7.4.6 實(shí)驗(yàn)結(jié)果小結(jié) / 215
7.5 本章總結(jié) / 216
第8章 一臺(tái)機(jī)器最多能支持多少條TCP連接 / 218
8.1 相關(guān)實(shí)際問題 / 219
8.2 理解Linux最大文件描述符限制 / 219
8.2.1 找到源碼入口 / 220
8.2.2 尋找進(jìn)程級(jí)限制nofile和fs.nr_open / 221
8.2.3 尋找系統(tǒng)級(jí)限制fs.file-max / 223
8.2.4 小結(jié) / 224
8.3 一臺(tái)服務(wù)端機(jī)器最多可以支撐多少條TCP連接 / 225
8.3.1 一次關(guān)于服務(wù)端并發(fā)的聊天 / 225
8.3.2 服務(wù)器百萬連接達(dá)成記 / 228
8.3.3 小結(jié) / 232
8.4 一臺(tái)客戶端機(jī)器最多只能發(fā)起65 535條連接嗎 / 232
8.4.1 65 535的束縛 / 232
8.4.2 多IP增加連接數(shù) / 234
8.4.3 端口復(fù)用增加連接數(shù) / 236
8.4.4 小結(jié) / 243
8.5 單機(jī)百萬并發(fā)連接的動(dòng)手實(shí)驗(yàn) / 243
8.5.1 方案一,多IP客戶端發(fā)起百萬連接 / 244
8.5.2 方案二,單IP客戶端機(jī)器發(fā)起百萬連接 / 248
8.5.3 最后多談一點(diǎn) / 250
8.6 本章總結(jié) / 251
第9章 網(wǎng)絡(luò)性能優(yōu)化建議 / 253
9.1 網(wǎng)絡(luò)請(qǐng)求優(yōu)化 / 254
9.2 接收過程優(yōu)化 / 256
9.3 發(fā)送過程優(yōu)化 / 262
9.4 內(nèi)核與進(jìn)程協(xié)作優(yōu)化 / 268
9.5 握手揮手過程優(yōu)化 / 269
第10章 容器網(wǎng)絡(luò)虛擬化 / 272
10.1 相關(guān)實(shí)際問題 / 273
10.2 veth設(shè)備對(duì) / 274
10.2.1 veth如何使用 / 274
10.2.2 veth底層創(chuàng)建過程 / 276
10.2.3 veth網(wǎng)絡(luò)通信過程 / 278
10.2.4 小結(jié) / 281
10.3 網(wǎng)絡(luò)命名空間 / 281
10.3.1 如何使用網(wǎng)絡(luò)命名空間 / 282
10.3.2 命名空間相關(guān)的定義 / 284
10.3.3 網(wǎng)絡(luò)命名空間的創(chuàng)建 / 287
10.3.4 網(wǎng)絡(luò)收發(fā)如何使用網(wǎng)絡(luò)命名空間 / 295
10.3.5 結(jié)論 / 296
10.4 虛擬交換機(jī)Bridge / 297
10.4.1 如何使用Bridge / 298
10.4.2 Bridge是如何創(chuàng)建出來的 / 301
10.4.3 添加設(shè)備 / 303
10.4.4 數(shù)據(jù)包處理過程 / 305
10.4.5 小結(jié) / 308
10.5 外部網(wǎng)絡(luò)通信 / 310
10.5.1 路由和NAT / 311
10.5.2 實(shí)現(xiàn)外部網(wǎng)絡(luò)通信 / 313
10.5.3 小結(jié) / 318
10.6 本章總結(jié) / 319