本书共计14章,介绍Linux网络编程的各个方面。第1~2章介绍网络编程相关的基础知识,包括计算机网络基础、内核收发数据原理、套接字的概念等。第3章介绍套接字编程基础知识,包括字节序、套接字地址、IP地址转换、套接字核心函数等。第4~9章为网络编程实战,包括TCP套接字编程、UDP套接字编程、服务器模型、I/O模型、I/O多路复用、套接字选项。第10~14章为高级网络编程,包括原始套接字、域套接字、组播和广播、零拷贝技术和百万并发。
袁菘华,具有十余年Linux研发经验,曾就职于世界500强企业和国内某通讯公司。擅长以图文的形式写作技术文章,将复杂的技术知识讲得通俗易懂。个人微信公众号“物联网心球”深受广大读者的喜欢。
第1章 计算机网络基础 1
1.1 OSI参考模型 1
1.1.1 OSI参考模型介绍 2
1.1.2 OSI参考模型的特点 3
1.1.3 OSI与TCP/IP模型 3
1.1.4 封装和解封 4
1.2 TCP/IP 6
1.2.1 物理层 6
1.2.2 数据链路层 6
1.2.3 网络层 14
1.2.4 传输层 27
1.2.5 应用层 29
1.3 两台主机直连 29
1.3.1 通信过程 29
1.3.2 ARP和ARP表 30
1.4 局域网通信 33
1.4.1 通信过程 33
1.4.2 交换机工作原理 34
1.5 跨网段通信 35
1.5.1 通信过程 35
1.5.2 访问公网服务端 37
第2章 认识套接字 39
2.1 从不同角度看套接字 39
2.1.1 数据加工厂 41
2.1.2 不同设备进程间通信 41
2.1.3 本机进程间通信 42
2.2 从内核看Linux接收数据 43
2.2.1 硬中断处理 44
2.2.2 软中断处理 44
2.3 从内核看Linux发送数据 46
2.3.1 传输层处理 47
2.3.2 网络层处理 47
2.3.3 邻居子系统处理 48
2.3.4 网络设备子系统处理 48
2.3.5 网卡驱动处理 48
2.4 常见套接字介绍 48
2.4.1 IPv4套接字 49
2.4.2 数据链路层原始套接字 51
2.4.3 域套接字 52
第3章 套接字编程基础 54
3.1 字节序 54
3.1.1 字节序的概念 54
3.1.2 字节序对通信的影响 55
3.1.3 字节序转换函数 56
3.1.4 主机字节序判断 58
3.2 套接字地址 59
3.2.1 通用套接字地址 60
3.2.2 新的通用套接字地址 61
3.2.3 IPv4套接字地址 62
3.3 IP地址转换 63
3.3.1 字符串IP地址转二进制
IP地址 63
3.3.2 二进制IP地址转字符串
IP地址 66
3.3.3 二进制IP地址和网络ID、
主机ID的转换 68
3.4 域名与IP地址的转换 71
3.4.1 域名系统 71
3.4.2 域名和IP地址转换 74
3.4.3 获取系统服务 77
3.5 套接字核心函数 84
3.5.1 socket函数 84
3.5.2 bind函数 86
3.5.3 listen函数 87
3.5.4 connect函数 89
3.5.5 accept函数 90
3.6 套接字发送函数 91
3.6.1 send函数 91
3.6.2 sendto函数 93
3.6.3 sendmsg函数 93
3.6.4 writev函数 95
3.7 套接字接收函数 95
3.7.1 recv函数 96
3.7.2 recvfrom函数 96
3.7.3 recvmsg函数 97
3.7.4 readv函数 98
第4章 TCP套接字编程 99
4.1 TCP编程基础 99
4.1.1 TCP简介 99
4.1.2 TCP状态机 102
4.1.3 TCP调试工具 104
4.2 TCP套接字编程基础 108
4.2.1 TCP编程流程 108
4.2.2 正确设置recv函数的
flags标志 113
4.2.3 getsockname和
getpeername函数 114
4.3 优雅关闭套接字 115
4.3.1 close函数关闭套接字 116
4.3.2 shutdown函数优雅关闭
套接字 117
4.4 TCP连接快速打开 121
4.4.1 TFO的工作流程 121
4.4.2 TFO编程实战 123
4.4.3 验证TFO功能 124
4.5 SYN Flood攻击 126
4.5.1 什么是SYN Flood攻击 126
4.5.2 TCP SYN Cookies简介 126
4.5.3 TCP SYN Cookies实战 128
第5章 UDP套接字编程 130
5.1 UDP编程基础 130
5.2 UDP套接字编程基础 131
5.2.1 UDP编程流程 131
5.2.2 CS网络模型和P2P网络
模型 134
5.2.3 深入理解UDP connect
函数 135
5.2.4 正确发送和接收数据 140
5.3 UDP可靠性编程 143
5.3.1 UDP丢包 143
5.3.2 UDP乱序 145
5.3.3 可靠性编程 146
第6章 服务器模型 150
6.1 循环服务器 150
6.1.1 UDP循环服务器 150
6.1.2 TCP循环服务器 151
6.2 并发服务器 153
6.2.1 多进程并发服务器 153
6.2.2 多线程并发服务器 159
6.3 I/O多路复用服务器 165
6.4 本章小结 166
第7章 I/O模型 168
7.1 同步I/O和异步I/O的区别 168
7.2 阻塞I/O 169
7.3 非阻塞I/O 170
7.4 I/O多路复用 172
7.5 信号驱动I/O 173
7.5.1 工作原理 173
7.5.2 信号驱动I/O编程 174
7.6 异步I/O 177
7.6.1 工作原理 177
7.6.2 io_uring编程 180
第8章 I/O多路复用 185
8.1 从内核看select 185
8.2 select编程实战 187
8.2.1 位图 188
8.2.2 select编程流程 191
8.3 select小结 200
8.4 从内核看poll 201
8.5 poll编程实战 203
8.6 poll小结 209
8.7 从内核看epoll 210
8.8 epoll编程实战 211
8.8.1 编程接口 211
8.8.2 epoll的编程流程 214
8.9 epoll小结 219
第9章 套接字选项 221
9.1 套接字选项简介 221
9.2 setsockopt和getsockopt函数 224
9.2.1 函数原型 224
9.2.2 实现原理 224
9.3 sysctl相关知识 225
9.3.1 /proc/sys虚拟文件系统 225
9.3.2 sysctl命令 225
9.4 常用的套接字选项 227
9.4.1 SO_SNDBUF和
SO_RCVBUF 227
9.4.2 SO_REUSEADDR和
SO_REUSEPORT 230
9.4.3 SO_LINGER 237
9.4.4 TCP保活机制 238
9.4.5 TCP_NODELAY和
TCP_CORK 242
第10章 原始套接字 247
10.1 从内核看原始套接字 247
10.1.1 原始套接字如何发送
数据 248
10.1.2 原始套接字如何接收
数据 249
10.2 网络层原始套接字 251
10.2.1 编程流程 251
10.2.2 常见的网络层原始套接字
编程问题 254
10.3 链路层原始套接字 256
10.3.1 套接字地址 256
10.3.2 编程流程 257
10.3.3 混杂模式 259
10.3.4 常见的链路层原始套接字编程
问题 260
10.4 用户层TCP/IP编程 262
10.4.1 累加校验和的原理 262
10.4.2 以太网帧头 264
10.4.3 IP头 267
10.4.4 ARP 269
10.4.5 ICMP 272
10.4.6 UDP 274
第11章 域套接字 278
11.1 域套接字基础 278
11.1.1 域套接字地址 279
11.1.2 域套接字的工作原理 279
11.2 SOCK_STREAM域套接字 280
11.2.1 服务端程序 280
11.2.2 客户端程序 286
11.2.3 查看域套接字的状态 288
11.3 SOCK_DGRAM域套接字 288
11.3.1 服务端程序 289
11.3.2 客户端程序 291
11.4 socketpair域套接字 292
11.4.1 socketpair函数 292
11.4.2 发送和接收数据 293
11.4.3 socketpair函数和pipe函数的
对比 294
11.5 传递文件描述符 296
11.5.1 实现原理 297
11.5.2 编程实战 298
第12章 组播和广播 301
12.1 组播 301
12.1.1 组播系统 302
12.1.2 组播路由 304
12.1.3 组播地址 307
12.1.4 IGMP 309
12.2 组播编程 313
12.2.1 编程流程 313
12.2.2 组播调试 320
12.3 广播 323
12.3.1 广播类型 324
12.3.2 广播的工作原理 324
12.4 广播编程 325
第13章 零拷贝 329
13.1 传统文件传输 329
13.2 零拷贝技术 330
13.2.1 mmap内存映射 331
13.2.2 pipe 334
13.2.3 DMA 336
13.3 零拷贝网络编程 337
13.3.1 mmap+write 337
13.3.2 sendfile 339
13.3.3 splice 342
第14章 百万并发 347
14.1 打开百万个套接字文件 347
14.1.1 默认情况 347
14.1.2 限制条件 348
14.1.3 解除限制 350
14.2 建立上百万个网络连接 359
14.2.1 分析方法 359
14.2.2 单机百万网络连接 360
14.3 百万并发常见问题 365
14.4 Reactor模型 366
14.4.1 单Reactor单线程模型 367
14.4.2 单Reactor多线程模型 368
14.4.3 主从Reactor多线程模型 369
14.4.4 Reactor实战 370