🧾 UNP × Nginx 源码对照表(完整版 / 2025)
目标:
看到 UNP 某个章节 → 立即知道 Nginx 对应的源码是什么
✔️ 第一部分:基础 Socket API → Nginx 监听与连接管理
| UNP 章节 | 内容 | Nginx 源码部分 | 关键文件 / 函数 |
|---|---|---|---|
| Ch4 socket | 创建 socket | 监听端口初始化 | ngx_create_listening_sockets() |
| Ch5 bind | 绑定地址 | Nginx bind 封装 | ngx_open_listening_sockets() |
| Ch6 listen/accept | 建立监听、接受连接 | 连接对象创建、accept | ngx_event_accept() listen/accept handler |
| Ch7 TCP 连接 | backlog、半连接队列 | 多 worker accept | ngx_enable_accept_events() |
✔️ 第二部分:I/O 模型 & Nginx 事件驱动框架
| UNP 章节 | 内容 | Nginx 对应 | 文件 |
|---|---|---|---|
| Ch6 阻塞/非阻塞 | 非阻塞 IO | 全局 nonblocking | ngx_nonblocking() |
| Ch14 select | I/O 多路复用 | 事件抽象层 | ngx_event.c |
| Ch15 poll | poll 模型 | 事件接口 | ngx_event.h |
| Ch16 epoll | epoll | epoll 模块 | ngx_epoll_module.c |
| Ch17 信号处理 | 信号驱动 IO | master 处理信号 | ngx_signal_handler() |
✔️ 第三部分:UNP I/O → Nginx recv/send
| UNP 章节 / 内容 | Nginx 实现 |
|---|---|
| Ch8 read | 统一读 API ngx_recv() |
| Ch9 write | 统一写 API ngx_send() |
| Ch11 readv/writev 多 buffer | 多链发送 ngx_writev_chain() |
| Ch16 sendfile 零拷贝 | sendfile chain ngx_linux_sendfile_chain.c |
| Ch13 非阻塞 connect | upstream connect ngx_event_connect.c |
✔️ 第四部分:TCP 选项 → Nginx tuning
| UNP 内容 | Nginx 文件 / 实现 |
|---|---|
| SO_REUSEADDR | listen ngx_open_listening_sockets() |
| SO_KEEPALIVE | TCP 保活 upstream ngx_event_connect.c |
| TCP_NODELAY | Nagle nodelay ngx_tcp_nodelay() |
| SNDBUF / RCVBUF | 缓冲区配置解析 core module |
✔️ 第五部分:Timer 与超时管理
| UNP 内容 | Nginx 文件 / 实现 |
|---|---|
| Ch22 超时机制 | read/write 超时 event timeout ngx_event_timer.c |
| Ch23 时钟精度 | 精度、红黑树 timer event |
| Ch24 定时任务 | timer 定时器管理 ngx_add_timer() |
✔️ 第六部分:进程模型(UNP 不讲但 Nginx 核心)
| 内容 | Nginx 模块 | 文件 / 函数 |
|---|---|---|
| master/worker 进程模型 | ngx_process_cycle.c | 进程生命周期管理 |
| 平滑升级 | 热升级 | ngx_reconfigure() |
| 共享内存 | slab pool | ngx_slab.c |
✔️ 第七部分:TCP 服务器框架(UNP 第 30 章) → Nginx HTTP 框架
| UNP 内容 | Nginx 对应 |
|---|---|
| 异步 echo server | HTTP 请求处理 |
| 连接池 | ngx_connection_t |
| 回调机制 | 事件回调 |
| 读→解析→写 | HTTP 生命周期 |
| 多次读写 | filter chain |
🧩 模块级对照(深入 HTTP)
| 模块 | UNP | Nginx 入口 |
|---|---|---|
| HTTP 解析器 | FSM、流式解析 | ngx_http_parse.c |
| upstream | 非阻塞 connect | ngx_http_upstream.c |
| sendfile | 零拷贝 | ngx_linux_sendfile_chain.c |
| 内存池 | malloc/free | ngx_palloc.c |
附录 目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
第一部分 简介和TCP/IP 1
第1章 简介 2
1.1 概述 2
1.2 一个简单的时间获取客户程序 5
1.3 协议无关性 9
1.4 错误处理:包裹函数 10
1.5 一个简单的时间获取服务器程序 12
1.6 本书中客户/服务器程序示例索引表 14
1.7 OSI模型 16
1.8 BSD网络支持历史 17
1.9 测试用网络及主机 19
1.10 Unix标准 22
1.11 64位体系结构 24
1.12 小结 25
习题 25
第2章 传输层:TCP、UDP和SCTP 27
2.1 概述 27
2.2 总图 27
2.3 用户数据报协议(UDP) 29
2.4 传输控制协议(TCP) 30
2.5 流控制传输协议(SCTP) 31
2.6 TCP连接的建立和终止 31
2.7 TIME_WAIT状态 37
2.8 SCTP关联的建立和终止 38
2.9 端口号 42
2.10 TCP端口号与并发服务器 43
2.11 缓冲区大小及限制 45
2.12 标准因特网服务 50
2.13 常见因特网应用的协议使用 51
2.14 小结 52
习题 53
第二部分 基本套接字编程 55
第3章 套接字编程简介 56
3.1 概述 56
3.2 套接字地址结构 56
3.3 值-结果参数 61
3.4 字节排序函数 63
3.5 字节操纵函数 66
3.6 inet_aton、inet_addr和inet_ntoa函数 67
3.7 inet_pton和inet_ntop函数 68
3.8 sock_ntop和相关函数 70
3.9 readn、writen和readline函数 72
3.10 小结 76
习题 76
第4章 基本TCP套接字编程 77
4.1 概述 77
4.2 socket函数 77
4.3 connect函数 80
4.4 bind函数 81
4.5 listen函数 84
4.6 accept函数 88
4.7 fork和exec函数 90
4.8 并发服务器 91
4.9 close函数 93
4.10 getsockname和getpeername函数 94
4.11 小结 96
习题 96
第5章 TCP客户/服务器程序示例 97
5.1 概述 97
5.2 TCP回射服务器程序:main函数 97
5.3 TCP回射服务器程序:str_echo函数 98
5.4 TCP回射客户程序:main函数 99
5.5 TCP回射客户程序:str_cli函数 100
5.6 正常启动 101
5.7 正常终止 102
5.8 POSIX信号处理 103
5.9 处理SIGCHLD信号 106
5.10 wait和waitpid函数 108
5.11 accept返回前连接中止 111
5.12 服务器进程终止 112
5.13 SIGPIPE信号 113
5.14 服务器主机崩溃 114
5.15 服务器主机崩溃后重启 115
5.16 服务器主机关机 116
5.17 TCP程序例子小结 116
5.18 数据格式 117
5.19 小结 120
习题 120
第6章 I/O复用:select和poll函数 122
6.1 概述 122
6.2 I/O模型 122
6.3 select函数 127
6.4 str_cli函数(修订版) 132
6.5 批量输入 133
6.6 shutdown函数 136
6.7 str_cli函数(再修订版) 137
6.8 TCP回射服务器程序(修订版) 138
6.9 pselect函数 142
6.10 poll函数 144
6.11 TCP回射服务器程序(再修订版) 146
6.12 小结 148
习题 149
第7章 套接字选项 150
7.1 概述 150
7.2 getsockopt和setsockopt函数 150
7.3 检查选项是否受支持并获取默认值 152
7.4 套接字状态 156
7.5 通用套接字选项 156
7.6 IPv4套接字选项 168
7.7 ICMPv6套接字选项 169
7.8 IPv6套接字选项 169
7.9 TCP套接字选项 171
7.10 SCTP套接字选项 173
7.11 fcntl函数 182
7.12 小结 184
习题 184
第8章 基本UDP套接字编程 186
8.1 概述 186
8.2 recvfrom和sendto函数 187
8.3 UDP回射服务器程序:main函数 187
8.4 UDP回射服务器程序:dg_echo函数 188
8.5 UDP回射客户程序:main函数 190
8.6 UDP回射客户程序:dg_cli函数 190
8.7 数据报的丢失 191
8.8 验证接收到的响应 191
8.9 服务器进程未运行 193
8.10 UDP程序例子小结 194
8.11 UDP的connect函数 196
8.12 dg_cli函数(修订版) 199
8.13 UDP缺乏流量控制 200
8.14 UDP中的外出接口的确定 203
8.15 使用select函数的TCP和UDP回射服务器程序 204
8.16 小结 206
习题 207
第9章 基本SCTP套接字编程 208
9.1 概述 208
9.2 接口模型 208
9.3 sctp_bindx函数 212
9.4 sctp_connectx函数 213
9.5 sctp_getpaddrs函数 213
9.6 sctp_freepaddrs函数 213
9.7 sctp_getladdrs函数 214
9.8 sctp_freeladdrs函数 214
9.9 sctp_sendmsg函数 214
9.10 sctp_recvmsg函数 215
9.11 sctp_opt_info函数 215
9.12 sctp_peeloff函数 216
9.13 shutdown函数 216
9.14 通知 217
9.15 小结 221
习题 222
第10章 SCTP客户/服务器程序例子 223
10.1 概述 223
10.2 SCTP一到多式流分回射服务器程序:main函数 223
10.3 SCTP一到多式流分回射客户程序:main函数 225
10.4 SCTP流分回射客户程序:sctpstr_cli函数 226
10.5 探究头端阻塞 228
10.6 控制流的数目 233
10.7 控制终结 233
10.8 小结 234
习题 235