第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数据是如何从网卡到协议栈的/11
2.2.1Linux网络收包总览/12
2.2.2Linux启动/13
2.2.3迎接数据的到来/23
2.2.4收包小结/33
2.3本章总结/34
第3章内核是如何与用户进程协作的/41
3.1相关实际问题/42
3.2socket的直接创建/43
3.3内核和用户进程协作之阻塞方式/46
3.3.1等待接收消息/47
3.3.2软中断模块/52
3.3.3同步阻塞总结/57
3.4内核和用户进程协作之epoll/59
3.4.1epoll内核对象的创建/60
3.4.2为epoll添加socket/62
3.4.3epoll_wait之等待接收/68
3.4.4数据来了/71
3.4.5小结/79
3.5本章总结/80
第4章内核是如何发送网络包的/84
4.1相关实际问题/85
4.2网络包发送过程总览/86
4.3网卡启动准备/90
4.4数据从用户进程到网卡的详细过程/92
4.4.1send系统调用实现/92
4.4.2传输层处理/94
4.4.3网络层发送处理/99
4.4.4邻居子系统/103
4.4.5网络设备子系统/105
4.4.6软中断调度/109
4.4.7igb网卡驱动发送/111
4.5RingBuffer内存回收/114
4.6本章总结/115
第5章深度理解本机网络IO/119
5.1相关实际问题/120
5.2跨机网络通信过程/120
5.2.1跨机数据发送/120
5.2.2跨机数据接收/125
5.2.3跨机网络通信汇总/127
5.3本机发送过程/127
5.3.1网络层路由/127
5.3.2本机IP路由/130
5.3.3网络设备子系统/131
5.3.4“驱动”程序/133
5.4本机接收过程/135
5.5本章总结/137
第6章深度理解TCP连接建立过程/139
6.1相关实际问题/140
6.2深入理解listen/141
6.2.1listen系统调用/141
6.2.2协议栈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发起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系统调用耗时失控/169
6.5.2第一次握手丢包/171
6.5.3第三次握手丢包/176
6.5.4握手异常总结/178
6.6如何查看是否有连接队列溢出发生/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基于伙伴系统管理空闲页面/192
7.2.4slab分配器/194
7.2.5小结/197
7.3TCP连接相关内核对象/198
7.3.1socket函数直接创建/198
7.3.2服务端socket创建/206
7.4实测TCP内核对象开销/207
7.4.1实验准备/207
7.4.2实验开始/208
7.4.3观察ESTABLISH状态开销/209
7.4.4观察非ESTABLISH状态开销/211
7.4.5收发缓存区简单测试/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寻找系统级限制fs.file-max/223
8.2.4小结/224
8.3一台服务端机器最多可以支撑多少条TCP连接/225
8.3.1一次关于服务端并发的聊天/225
8.3.2服务器百万连接达成记/228
8.3.3小结/232
8.4一台客户端机器最多只能发起65535条连接吗/232
8.4.165535的束缚/232
8.4.2多IP增加连接数/234
8.4.3端口复用增加连接数/236
8.4.4小结/243
8.5单机百万并发连接的动手实验/243
8.5.1方案一,多IP客户端发起百万连接/244
8.5.2方案二,单IP客户端机器发起百万连接/248
8.5.3最后多谈一点/250
8.6本章总结/251
第9章网络性能优化建议/253
9.1网络请求优化/254
9.2接收过程优化/256
9.3发送过程优化/262
9.4内核与进程协作优化/268
9.5握手挥手过程优化/269
第10章容器网络虚拟化/272
10.1相关实际问题/273
10.2veth设备对/274
10.2.1veth如何使用/274
10.2.2veth底层创建过程/276
10.2.3veth网络通信过程/278
10.2.4小结/281
10.3网络命名空间/281
10.3.1如何使用网络命名空间/282
10.3.2命名空间相关的定义/284
10.3.3网络命名空间的创建/287
10.3.4网络收发如何使用网络命名空间/295
10.3.5结论/296
10.4虚拟交换机Bridge/297
10.4.1如何使用Bridge/298
10.4.2Bridge是如何创建出来的/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