深入理解Linux網(wǎng)絡: 修煉底層內(nèi)功,掌握高性能原理
鏈接:https://pan.baidu.com/s/1VD1ADQwdfVe7IhJvMYCEZA?pwd=nupj?
提取碼:nupj

本書通過先拋出一些開發(fā)、運維等技術(shù)人員在工作中經(jīng)常遇見的問題,激發(fā)讀者的思考。從這些問題出發(fā),深入地對網(wǎng)絡底層實現(xiàn)原理進行拆解,帶領讀者看清楚問題的核心,理解其背后的技術(shù)本質(zhì),提高大家的技術(shù)功力。例如網(wǎng)絡包是如何被接收和發(fā)送的?阻塞到底在內(nèi)部是如何發(fā)生的?epoll的底層工作原理又是啥?TCP連接在底層上是如何支持和實現(xiàn)的?書中對這些內(nèi)容都有深度的闡述。本書旨在通過帶領讀者修煉底層內(nèi)功,進而幫助大家深度掌握網(wǎng)絡高性能原理。
作者簡介
張彥飛,2010年碩士畢業(yè)于西北大學計算機學院,有十多年的大型互聯(lián)網(wǎng)公司項目經(jīng)驗,目前就職于騰訊。他喜歡對技術(shù)進行深度思考,善于挖掘技術(shù)點背后的原理。他的技術(shù)公眾號“開發(fā)內(nèi)功修煉”一年便收到五萬多讀者的關注。
精彩書評
這本書的出版令人欣喜。作者張彥飛能夠坦露心扉,從IT大廠面試聊到中年焦慮,技術(shù)上從內(nèi)核的工作原理聊起,將內(nèi)核如何接收網(wǎng)絡包、如何與用戶進程協(xié)作講解得深入淺出,從而帶著讀者深入理解網(wǎng)絡IO、TCP連接建立過程,最后再與讀者一起總結(jié)出系統(tǒng)性能優(yōu)化的抓手與方案。閱讀他的作品是一種享受,不但讓我收獲很多底層技術(shù)細節(jié)和原理,還能夠激發(fā)我進一步思考。分享給所有后端開發(fā)工程師閱讀,與作者一起完成內(nèi)功修煉。
騰訊技術(shù)副總監(jiān),張勇
本書從實際工作遇到的問題出發(fā),以庖丁解牛式的手法,結(jié)合內(nèi)核源碼以簡潔高效的話術(shù)把網(wǎng)絡原理講深講透,是非常少見的網(wǎng)絡進階學習圖書。如果說Stack Overflow、GitHub是用于實踐的“武當長拳”,那么本書屬于提升內(nèi)力的“小無相功”,前者能夠找到可復用或可參考的業(yè)務邏輯實現(xiàn),后者則在于提升“內(nèi)力”。
小米科技技術(shù)總監(jiān),黃學青
看彥飛的這部作品,滿足你對Linux內(nèi)核網(wǎng)絡模塊運行原理的好奇心,讓你達到知其然也知其所以然的水平。通過深度掌握底層知識,為你開發(fā)高性能后端應用打下堅實基礎。
C++ Workflow開源項目作者,謝翰
這是目前市面上少有的、深入底層回答實際工作中相關問題的書。飛哥通過日常工作中的問題,帶著你一步步深入其中的原理,不僅讓你知其然,而且知其所以然。要提升自己,內(nèi)功的修煉并不可少,飛哥的這本書給了你一個很好的起點,相信通過修煉自己的底層技術(shù)能力,你的技術(shù)能力會突飛猛進。
Go語言中文網(wǎng)創(chuàng)始人,polarisxu
目錄
第1章 緒論 / 1
1.1 我在工作中的困惑 / 2
1.1.1 過多的TIME_WAIT / 2
1.1.2 長連接開銷 / 2
1.1.3 CPU被消耗光了 / 3
1.1.4 為什么不同的語言網(wǎng)絡性能差別巨大 / 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)絡包的 / 9
2.1 相關實際問題 / 10
2.2 數(shù)據(jù)是如何從網(wǎng)卡到協(xié)議棧的 / 11
2.2.1 Linux網(wǎng)絡收包總覽 / 12
2.2.2 Linux啟動 / 13
2.2.3 迎接數(shù)據(jù)的到來 / 23
2.2.4 收包小結(jié) / 33
2.3 本章總結(jié) / 34
第3章 內(nèi)核是如何與用戶進程協(xié)作的 / 41
3.1 相關實際問題 / 42
3.2 socket的直接創(chuàng)建 / 43
3.3 內(nèi)核和用戶進程協(xié)作之阻塞方式 / 46
3.3.1 等待接收消息 / 47
3.3.2 軟中斷模塊 / 52
3.3.3 同步阻塞總結(jié) / 57
3.4 內(nèi)核和用戶進程協(xié)作之epoll / 59
3.4.1 epoll內(nèi)核對象的創(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)絡包的 / 84
4.1 相關實際問題 / 85
4.2 網(wǎng)絡包發(fā)送過程總覽 / 86
4.3 網(wǎng)卡啟動準備 / 90
4.4 數(shù)據(jù)從用戶進程到網(wǎng)卡的詳細過程 / 92
4.4.1 send系統(tǒng)調(diào)用實現(xiàn) / 92
4.4.2 傳輸層處理 / 94
4.4.3 網(wǎng)絡層發(fā)送處理 / 99
4.4.4 鄰居子系統(tǒng) / 103
4.4.5 網(wǎng)絡設備子系統(tǒng) / 105
4.4.6 軟中斷調(diào)度 / 109
4.4.7 igb網(wǎng)卡驅(qū)動發(fā)送 / 111
4.5 RingBuffer內(nèi)存回收 / 114
4.6 本章總結(jié) / 115
第5章 深度理解本機網(wǎng)絡IO / 119
5.1 相關實際問題 / 120
5.2 跨機網(wǎng)絡通信過程 / 120
5.2.1 跨機數(shù)據(jù)發(fā)送 / 120
5.2.2 跨機數(shù)據(jù)接收 / 125
5.2.3 跨機網(wǎng)絡通信匯總 / 127
5.3 本機發(fā)送過程 / 127
5.3.1 網(wǎng)絡層路由 / 127
5.3.2 本機IP路由 / 130
5.3.3 網(wǎng)絡設備子系統(tǒng) / 131
5.3.4 “驅(qū)動”程序 / 133
5.4 本機接收過程 / 135
5.5 本章總結(jié) / 137
第6章 深度理解TCP連接建立過程 / 139
6.1 相關實際問題 / 140
6.2 深入理解listen / 141
6.2.1 listen系統(tǒng)調(diào)用 / 141
6.2.2 協(xié)議棧listen / 142
6.2.3 接收隊列定義 / 143
6.2.4 接收隊列申請和初始化 / 145
6.2.5 半連接隊列長度計算 / 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請求 / 155
6.3.5 connect小結(jié) / 156
6.4 完整TCP連接建立過程 / 157
6.4.1 客戶端connect / 159
6.4.2 服務端響應SYN / 160
6.4.3 客戶端響應SYNACK / 162
6.4.4 服務端響應ACK / 164
6.4.5 服務端accept / 167
6.4.6 連接建立過程總結(jié) / 167
6.5 異常TCP連接建立情況 / 169
6.5.1 connect系統(tǒng)調(diào)用耗時失控 / 169
6.5.2 第一次握手丟包 / 171
6.5.3 第三次握手丟包 / 176
6.5.4 握手異??偨Y(jié) / 178
6.6 如何查看是否有連接隊列溢出發(fā)生 / 179
6.6.1 全連接隊列溢出判斷 / 179
6.6.2 半連接隊列溢出判斷 / 181
6.6.3 小結(jié) / 183
6.7 本章總結(jié) / 183
第7章 一條TCP連接消耗多大內(nèi)存 / 187
7.1 相關實際問題 / 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連接相關內(nèi)核對象 / 198
7.3.1 socket函數(shù)直接創(chuàng)建 / 198
7.3.2 服務端socket創(chuàng)建 / 206
7.4 實測TCP內(nèi)核對象開銷 / 207
7.4.1 實驗準備 / 207
7.4.2 實驗開始 / 208
7.4.3 觀察ESTABLISH狀態(tài)開銷 / 209
7.4.4 觀察非ESTABLISH狀態(tài)開銷 / 211
7.4.5 收發(fā)緩存區(qū)簡單測試 / 214
7.4.6 實驗結(jié)果小結(jié) / 215
7.5 本章總結(jié) / 216
第8章 一臺機器最多能支持多少條TCP連接 / 218
8.1 相關實際問題 / 219
8.2 理解Linux最大文件描述符限制 / 219
8.2.1 找到源碼入口 / 220
8.2.2 尋找進程級限制nofile和fs.nr_open / 221
8.2.3 尋找系統(tǒng)級限制fs.file-max / 223
8.2.4 小結(jié) / 224
8.3 一臺服務端機器最多可以支撐多少條TCP連接 / 225
8.3.1 一次關于服務端并發(fā)的聊天 / 225
8.3.2 服務器百萬連接達成記 / 228
8.3.3 小結(jié) / 232
8.4 一臺客戶端機器最多只能發(fā)起65 535條連接嗎 / 232
8.4.1 65 535的束縛 / 232
8.4.2 多IP增加連接數(shù) / 234
8.4.3 端口復用增加連接數(shù) / 236
8.4.4 小結(jié) / 243
8.5 單機百萬并發(fā)連接的動手實驗 / 243
8.5.1 方案一,多IP客戶端發(fā)起百萬連接 / 244
8.5.2 方案二,單IP客戶端機器發(fā)起百萬連接 / 248
8.5.3 最后多談一點 / 250
8.6 本章總結(jié) / 251
第9章 網(wǎng)絡性能優(yōu)化建議 / 253
9.1 網(wǎng)絡請求優(yōu)化 / 254
9.2 接收過程優(yōu)化 / 256
9.3 發(fā)送過程優(yōu)化 / 262
9.4 內(nèi)核與進程協(xié)作優(yōu)化 / 268
9.5 握手揮手過程優(yōu)化 / 269
第10章 容器網(wǎng)絡虛擬化 / 272
10.1 相關實際問題 / 273
10.2 veth設備對 / 274
10.2.1 veth如何使用 / 274
10.2.2 veth底層創(chuàng)建過程 / 276
10.2.3 veth網(wǎng)絡通信過程 / 278
10.2.4 小結(jié) / 281
10.3 網(wǎng)絡命名空間 / 281
10.3.1 如何使用網(wǎng)絡命名空間 / 282
10.3.2 命名空間相關的定義 / 284
10.3.3 網(wǎng)絡命名空間的創(chuàng)建 / 287
10.3.4 網(wǎng)絡收發(fā)如何使用網(wǎng)絡命名空間 / 295
10.3.5 結(jié)論 / 296
10.4 虛擬交換機Bridge / 297
10.4.1 如何使用Bridge / 298
10.4.2 Bridge是如何創(chuàng)建出來的 / 301
10.4.3 添加設備 / 303
10.4.4 數(shù)據(jù)包處理過程 / 305
10.4.5 小結(jié) / 308
10.5 外部網(wǎng)絡通信 / 310
10.5.1 路由和NAT / 311
10.5.2 實現(xiàn)外部網(wǎng)絡通信 / 313
10.5.3 小結(jié) / 318
10.6 本章總結(jié) / 319