第1章緒論/1
1.1我在工作中的困惑/2
1.1.1過多的TIME_WAIT/2
1.1.2長連接開銷/2
1.1.3CPU被消耗光了/3
1.1.4為什么不同的語言網絡性能差別巨大/4
1.1.5訪問127.0.0.1過網卡嗎/4
1.1.6軟中斷和硬中斷/5
1.1.7零拷貝到底是怎么回事/5
1.1.8DPDK/5
1.2本書內容結構/6
1.3一些約定/7
1.4一些術語/8
第2章內核是如何接收網絡包的/9
2.1相關實際問題/10
2.2數據是如何從網卡到協(xié)議棧的/11
2.2.1Linux網絡收包總覽/12
2.2.2Linux啟動/13
2.2.3迎接數據的到來/23
2.2.4收包小結/33
2.3本章總結/34
第3章內核是如何與用戶進程協(xié)作的/41
3.1相關實際問題/42
3.2socket的直接創(chuàng)建/43
3.3內核和用戶進程協(xié)作之阻塞方式/46
3.3.1等待接收消息/47
3.3.2軟中斷模塊/52
3.3.3同步阻塞總結/57
3.4內核和用戶進程協(xié)作之epoll/59
3.4.1epoll內核對象的創(chuàng)建/60
3.4.2為epoll添加socket/62
3.4.3epoll_wait之等待接收/68
3.4.4數據來了/71
3.4.5小結/79
3.5本章總結/80
第4章內核是如何發(fā)送網絡包的/84
4.1相關實際問題/85
4.2網絡包發(fā)送過程總覽/86
4.3網卡啟動準備/90
4.4數據從用戶進程到網卡的詳細過程/92
4.4.1send系統(tǒng)調用實現/92
4.4.2傳輸層處理/94
4.4.3網絡層發(fā)送處理/99
4.4.4鄰居子系統(tǒng)/103
4.4.5網絡設備子系統(tǒng)/105
4.4.6軟中斷調度/109
4.4.7igb網卡驅動發(fā)送/111
4.5RingBuffer內存回收/114
4.6本章總結/115
第5章深度理解本機網絡IO/119
5.1相關實際問題/120
5.2跨機網絡通信過程/120
5.2.1跨機數據發(fā)送/120
5.2.2跨機數據接收/125
5.2.3跨機網絡通信匯總/127
5.3本機發(fā)送過程/127
5.3.1網絡層路由/127
5.3.2本機IP路由/130
5.3.3網絡設備子系統(tǒng)/131
5.3.4“驅動”程序/133
5.4本機接收過程/135
5.5本章總結/137
第6章深度理解TCP連接建立過程/139
6.1相關實際問題/140
6.2深入理解listen/141
6.2.1listen系統(tǒng)調用/141
6.2.2協(xié)議棧listen/142
6.2.3接收隊列定義/143
6.2.4接收隊列申請和初始化/145
6.2.5半連接隊列長度計算/146
6.2.6listen過程小結/148
6.3深入理解connect/148
6.3.1connect調用鏈展開/149
6.3.2選擇可用端口/151
6.3.3端口被使用過怎么辦/153
6.3.4發(fā)起syn請求/155
6.3.5connect小結/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連接建立過程總結/167
6.5異常TCP連接建立情況/169
6.5.1connect系統(tǒng)調用耗時失控/169
6.5.2第一次握手丟包/171
6.5.3第三次握手丟包/176
6.5.4握手異??偨Y/178
6.6如何查看是否有連接隊列溢出發(fā)生/179
6.6.1全連接隊列溢出判斷/179
6.6.2半連接隊列溢出判斷/181
6.6.3小結/183
6.7本章總結/183
第7章一條TCP連接消耗多大內存/187
7.1相關實際問題/188
7.2Linux內核如何管理內存/188
7.2.1node劃分/189
7.2.2zone劃分/191
7.2.3基于伙伴系統(tǒng)管理空閑頁面/192
7.2.4slab分配器/194
7.2.5小結/197
7.3TCP連接相關內核對象/198
7.3.1socket函數直接創(chuàng)建/198
7.3.2服務端socket創(chuàng)建/206
7.4實測TCP內核對象開銷/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實驗結果小結/215
7.5本章總結/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小結/224
8.3一臺服務端機器最多可以支撐多少條TCP連接/225
8.3.1一次關于服務端并發(fā)的聊天/225
8.3.2服務器百萬連接達成記/228
8.3.3小結/232
8.4一臺客戶端機器最多只能發(fā)起65535條連接嗎/232
8.4.165535的束縛/232
8.4.2多IP增加連接數/234
8.4.3端口復用增加連接數/236
8.4.4小結/243
8.5單機百萬并發(fā)連接的動手實驗/243
8.5.1方案一,多IP客戶端發(fā)起百萬連接/244
8.5.2方案二,單IP客戶端機器發(fā)起百萬連接/248
8.5.3最后多談一點/250
8.6本章總結/251
第9章網絡性能優(yōu)化建議/253
9.1網絡請求優(yōu)化/254
9.2接收過程優(yōu)化/256
9.3發(fā)送過程優(yōu)化/262
9.4內核與進程協(xié)作優(yōu)化/268
9.5握手揮手過程優(yōu)化/269
第10章容器網絡虛擬化/272
10.1相關實際問題/273
10.2veth設備對/274
10.2.1veth如何使用/274
10.2.2veth底層創(chuàng)建過程/276
10.2.3veth網絡通信過程/278
10.2.4小結/281
10.3網絡命名空間/281
10.3.1如何使用網絡命名空間/282
10.3.2命名空間相關的定義/284
10.3.3網絡命名空間的創(chuàng)建/287
10.3.4網絡收發(fā)如何使用網絡命名空間/295
10.3.5結論/296
10.4虛擬交換機Bridge/297
10.4.1如何使用Bridge/298
10.4.2Bridge是如何創(chuàng)建出來的/301
10.4.3添加設備/303
10.4.4數據包處理過程/305
10.4.5小結/308
10.5外部網絡通信/310
10.5.1路由和NAT/311
10.5.2實現外部網絡通信/313
10.5.3小結/318
10.6本章總結/319