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

編輯推薦
適讀人群 :想通過(guò)提升自己的網(wǎng)絡(luò)內(nèi)功而進(jìn)大廠的讀者。 不滿足于只學(xué)習(xí)網(wǎng)絡(luò)協(xié)議,也想理解它是怎么實(shí)現(xiàn)的讀者。 雖有幾年開發(fā)工作經(jīng)驗(yàn),但對(duì)網(wǎng)絡(luò)開銷把握不準(zhǔn)的開發(fā)人員。 想做網(wǎng)絡(luò)性能優(yōu)化,但沒(méi)有成體系的理論指導(dǎo)的讀者。 維護(hù)各種高并發(fā)服務(wù)器的運(yùn)維人員。
榮獲CSDN“2022中國(guó)開發(fā)者影響力年度榜單年度IT圖書”
200幅底層原理全彩插圖,
48個(gè)高頻工程實(shí)踐問(wèn)題解決方案,
24條打造高性能應(yīng)用的硬核建議。
Java、C++、PHP實(shí)驗(yàn)代碼,助你——
清掃性能誤區(qū),探尋底層原理,應(yīng)對(duì)校招、社招、晉升考核,用底層內(nèi)功對(duì)抗中年焦慮。
時(shí)髦的東西終究過(guò)時(shí),但扎實(shí)的內(nèi)功將會(huì)伴隨你一生。只有具備了深厚的內(nèi)功底蘊(yùn),才能在發(fā)展的道路上走得更穩(wěn)、走得更遠(yuǎn)。
騰訊技術(shù)副總監(jiān)張勇、小米科技技術(shù)總監(jiān)黃學(xué)青等技術(shù)專家齊贊。
內(nèi)容簡(jiǎn)介
本書通過(guò)先拋出一些開發(fā)、運(yùn)維等技術(shù)人員在工作中經(jīng)常遇見的問(wèn)題,激發(fā)讀者的思考。從這些問(wèn)題出發(fā),深入地對(duì)網(wǎng)絡(luò)底層實(shí)現(xiàn)原理進(jìn)行拆解,帶領(lǐng)讀者看清楚問(wèn)題的核心,理解其背后的技術(shù)本質(zhì),提高大家的技術(shù)功力。例如網(wǎng)絡(luò)包是如何被接收和發(fā)送的?阻塞到底在內(nèi)部是如何發(fā)生的?epoll的底層工作原理又是啥?TCP連接在底層上是如何支持和實(shí)現(xiàn)的?書中對(duì)這些內(nèi)容都有深度的闡述。本書旨在通過(guò)帶領(lǐng)讀者修煉底層內(nèi)功,進(jìn)而幫助大家深度掌握網(wǎng)絡(luò)高性能原理。
作者簡(jiǎn)介
張彥飛,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)功修煉”一年便收到五萬(wàn)多讀者的關(guān)注。
精彩書評(píng)
這本書的出版令人欣喜。作者張彥飛能夠坦露心扉,從IT大廠面試聊到中年焦慮,技術(shù)上從內(nèi)核的工作原理聊起,將內(nèi)核如何接收網(wǎng)絡(luò)包、如何與用戶進(jìn)程協(xié)作講解得深入淺出,從而帶著讀者深入理解網(wǎng)絡(luò)IO、TCP連接建立過(guò)程,最后再與讀者一起總結(jié)出系統(tǒng)性能優(yōu)化的抓手與方案。閱讀他的作品是一種享受,不但讓我收獲很多底層技術(shù)細(xì)節(jié)和原理,還能夠激發(fā)我進(jìn)一步思考。分享給所有后端開發(fā)工程師閱讀,與作者一起完成內(nèi)功修煉。
騰訊技術(shù)副總監(jiān),張勇
本書從實(shí)際工作遇到的問(wèn)題出發(fā),以庖丁解牛式的手法,結(jié)合內(nèi)核源碼以簡(jiǎn)潔高效的話術(shù)把網(wǎng)絡(luò)原理講深講透,是非常少見的網(wǎng)絡(luò)進(jìn)階學(xué)習(xí)圖書。如果說(shuō)Stack Overflow、GitHub是用于實(shí)踐的“武當(dāng)長(zhǎng)拳”,那么本書屬于提升內(nèi)力的“小無(wú)相功”,前者能夠找到可復(fù)用或可參考的業(yè)務(wù)邏輯實(shí)現(xiàn),后者則在于提升“內(nèi)力”。
小米科技技術(shù)總監(jiān),黃學(xué)青
看彥飛的這部作品,滿足你對(duì)Linux內(nèi)核網(wǎng)絡(luò)模塊運(yùn)行原理的好奇心,讓你達(dá)到知其然也知其所以然的水平。通過(guò)深度掌握底層知識(shí),為你開發(fā)高性能后端應(yīng)用打下堅(jiān)實(shí)基礎(chǔ)。
C++ Workflow開源項(xiàng)目作者,謝翰
這是目前市面上少有的、深入底層回答實(shí)際工作中相關(guān)問(wèn)題的書。飛哥通過(guò)日常工作中的問(wèn)題,帶著你一步步深入其中的原理,不僅讓你知其然,而且知其所以然。要提升自己,內(nèi)功的修煉并不可少,飛哥的這本書給了你一個(gè)很好的起點(diǎn),相信通過(guò)修煉自己的底層技術(shù)能力,你的技術(shù)能力會(huì)突飛猛進(jìn)。
Go語(yǔ)言中文網(wǎng)創(chuàng)始人,polarisxu
目錄
第1章 緒論 / 1
1.1 我在工作中的困惑 / 2
1.1.1 過(guò)多的TIME_WAIT / 2
1.1.2 長(zhǎng)連接開銷 / 2
1.1.3 CPU被消耗光了 / 3
1.1.4 為什么不同的語(yǔ)言網(wǎng)絡(luò)性能差別巨大 / 4
1.1.5 訪問(wèn)127.0.0.1過(guò)網(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ù)語(yǔ) / 8
第2章 內(nèi)核是如何接收網(wǎng)絡(luò)包的 / 9
2.1 相關(guān)實(shí)際問(wèn)題 / 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ù)的到來(lái) / 23
2.2.4 收包小結(jié) / 33
2.3 本章總結(jié) / 34
第3章 內(nèi)核是如何與用戶進(jìn)程協(xié)作的 / 41
3.1 相關(guān)實(shí)際問(wèn)題 / 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ù)來(lái)了 / 71
3.4.5 小結(jié) / 79
3.5 本章總結(jié) / 80
第4章 內(nèi)核是如何發(fā)送網(wǎng)絡(luò)包的 / 84
4.1 相關(guān)實(shí)際問(wèn)題 / 85
4.2 網(wǎng)絡(luò)包發(fā)送過(guò)程總覽 / 86
4.3 網(wǎng)卡啟動(dòng)準(zhǔn)備 / 90
4.4 數(shù)據(jù)從用戶進(jìn)程到網(wǎng)卡的詳細(xì)過(guò)程 / 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í)際問(wèn)題 / 120
5.2 跨機(jī)網(wǎng)絡(luò)通信過(guò)程 / 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ā)送過(guò)程 / 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ī)接收過(guò)程 / 135
5.5 本章總結(jié) / 137
第6章 深度理解TCP連接建立過(guò)程 / 139
6.1 相關(guān)實(shí)際問(wèn)題 / 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過(guò)程小結(jié) / 148
6.3 深入理解connect / 148
6.3.1 connect調(diào)用鏈展開 / 149
6.3.2 選擇可用端口 / 151
6.3.3 端口被使用過(guò)怎么辦 / 153
6.3.4 發(fā)起syn請(qǐng)求 / 155
6.3.5 connect小結(jié) / 156
6.4 完整TCP連接建立過(guò)程 / 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 連接建立過(guò)程總結(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í)際問(wèn)題 / 188
7.2 Linux內(nèi)核如何管理內(nèi)存 / 188
7.2.1 node劃分 / 189
7.2.2 zone劃分 / 191
7.2.3 基于伙伴系統(tǒng)管理空閑頁(yè)面 / 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í)際問(wèn)題 / 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ù)器百萬(wàn)連接達(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ī)百萬(wàn)并發(fā)連接的動(dòng)手實(shí)驗(yàn) / 243
8.5.1 方案一,多IP客戶端發(fā)起百萬(wàn)連接 / 244
8.5.2 方案二,單IP客戶端機(jī)器發(fā)起百萬(wàn)連接 / 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 接收過(guò)程優(yōu)化 / 256
9.3 發(fā)送過(guò)程優(yōu)化 / 262
9.4 內(nèi)核與進(jìn)程協(xié)作優(yōu)化 / 268
9.5 握手揮手過(guò)程優(yōu)化 / 269
第10章 容器網(wǎng)絡(luò)虛擬化 / 272
10.1 相關(guān)實(shí)際問(wèn)題 / 273
10.2 veth設(shè)備對(duì) / 274
10.2.1 veth如何使用 / 274
10.2.2 veth底層創(chuàng)建過(guò)程 / 276
10.2.3 veth網(wǎng)絡(luò)通信過(guò)程 / 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)建出來(lái)的 / 301
10.4.3 添加設(shè)備 / 303
10.4.4 數(shù)據(jù)包處理過(guò)程 / 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
查看全部↓
前言/序言
從大廠的面試說(shuō)起
互聯(lián)網(wǎng)大廠是當(dāng)今很多開發(fā)人員,尤其是應(yīng)屆畢業(yè)生們所向往的公司。但大家應(yīng)該都聽過(guò)關(guān)于大廠面試候選人的一句調(diào)侃的話,“面試造火箭,工作擰螺絲”。這雖然有一點(diǎn)兒夸張的成分,不過(guò)也確實(shí)描述得比較形象。在面試中,尤其是頂級(jí)互聯(lián)網(wǎng)大廠的面試,對(duì)技術(shù)的考查往往都很深。但是到了工作中,可能確實(shí)又需要花不少時(shí)間在寫各種各樣的重復(fù) CRUD 上。
那為啥會(huì)出現(xiàn)這種情況,是大廠閑得沒(méi)事非得為難候選人嗎?其實(shí)不是,這是因?yàn)樵鷮?shí)的底層功力確實(shí)對(duì)大廠來(lái)說(shuō)很重要。
互聯(lián)網(wǎng)大廠區(qū)別于小公司的一個(gè)業(yè)務(wù)特點(diǎn)就是海量請(qǐng)求,隨便一個(gè)業(yè)界第二梯隊(duì)的App,每天的后端接口請(qǐng)求數(shù)過(guò)億很常見,更不用提微信、淘寶等頭部應(yīng)用了。在這種量級(jí)的用戶請(qǐng)求下,業(yè)務(wù)能7×24小時(shí)穩(wěn)定地提供服務(wù)就非常重要了。哪怕服務(wù)故障出現(xiàn)十分鐘,對(duì)業(yè)務(wù)造成的損失可能都是不容小覷的。
所以在大廠中,你寫出來(lái)的程序不是能跑起來(lái)就行了,是必須能夠穩(wěn)定運(yùn)行。程序在運(yùn)行期間可能會(huì)無(wú)法避免地遭遇各種線上問(wèn)題。應(yīng)用都是跑在硬件、操作系統(tǒng)之上的,因此線上的很多問(wèn)題都和底層相關(guān)。如果遇到線上問(wèn)題,你是否有能力快速排查和處理?例如有的時(shí)候線上訪問(wèn)超時(shí)是因?yàn)門CP的全連接隊(duì)列滿導(dǎo)致的。如果你對(duì)這類底層的知識(shí)了解得不夠,則根本無(wú)法應(yīng)對(duì)。