系统与网络编程路线 / Systems and Network Programming Roadmap
1. 这个模块到底学什么
C++ 系统与网络编程不是把 POSIX 函数表背下来。它训练的是一种边界感:你的 C++ 对象什么时候只是普通内存,什么时候代表一个内核资源;你的函数什么时候只是一次库调用,什么时候会进入内核、阻塞线程、改变进程状态或参与网络协议。
C++ object model
-> RAII and ownership
-> system call boundary
-> kernel resource
-> observable state
-> production diagnosis2. 两条主线
本模块分成 OS lane 和 network lane。OS lane 先讲进程、fd、文件、mmap、IPC、调度和虚拟内存;network lane 在 fd 模型上继续讲 socket、TCP、epoll、Reactor、协议分帧和 HTTP 服务。
OS lane:
process -> fd -> file/mmap -> IPC/scheduler/VM
Network lane:
socket/TCP -> nonblocking/epoll/Reactor -> framing/HTTP hardening
Practice lane:
strace/lsof/ss/tcpdump/gdb/perf -> incident checklist3. 阅读顺序
- 01:进程、fork/exec、wait、exit status、signal 和生命周期。
- 02:文件描述符、fd 表、open file description、read/write、mmap 和 RAII。
- 03:IPC、pipe/socketpair/shared memory、调度、虚拟内存和隔离。
- 04:TCP、socket、地址端口、连接模型、字节流和关闭。
- 05:非阻塞 I/O、EAGAIN、epoll、Reactor、连接状态机和背压。
- 06:协议分帧、HTTP 请求响应、parser 状态机、限制、超时和加固。
- 07:系统网络调试、生产检查表和故障复盘。
4. 核心词先建立
process:操作系统调度和资源归属的基本单位。一个进程有地址空间、fd 表、信号处理方式、环境变量和退出状态。
file descriptor:进程 fd 表里的整数索引,指向内核 open file description、socket、pipe、eventfd 等资源。
system call:用户态请求内核操作资源的边界,例如 read、write、fork、exec、mmap、socket。
blocking:调用条件不满足时让线程等待,例如 accept 等连接、read 等数据、waitpid 等子进程。
socket:网络端点句柄,在 POSIX 下也是 fd。服务端 listening socket 和 connected socket 职责不同。
TCP byte stream:可靠有序字节流,不保留应用层消息边界。协议必须自己分帧。
event loop:集中等待多个事件并分派处理的结构,常用于大量连接。
protocol parser:把字节流转换成请求/响应对象的状态机,必须带大小限制和错误策略。
5. 先修和边界
读本模块前最好已经理解 RAII、移动语义、异常安全、线程基础和基本命令行使用。这里不会重新讲 C++ 语法,也不会深入 Linux 内核源码;重点是用户态 C++ 怎样正确使用系统能力。
6. 学完后应能回答的问题
- fork 后父子进程共享什么、不共享什么?
- exec 为什么会替换进程映像,却保留部分 fd?
- fd、open file description、文件 offset 的关系是什么?
- mmap 为什么不是普通指针,映射失效会发生什么?
- pipe、socketpair、shared memory 分别适合什么 IPC?
- socket 和 TCP 连接是什么关系?
- 为什么 TCP 没有消息边界?
- 非阻塞 I/O 为什么必须处理 EAGAIN?
- epoll 的 LT/ET 语义为什么影响 read/write 循环?
- HTTP parser 为什么必须有状态和大小限制?
7. 实践路线
建议按小项目推进:先写进程启动器,再写文件复制和 mmap 检查器,再写 pipe 子进程通信,最后写阻塞 echo、epoll echo、长度前缀协议和最小 HTTP parser。
week 1: process runner + wait status
week 2: fd copier + mmap viewer
week 3: pipe child process protocol
week 4: blocking TCP echo
week 5: epoll echo with timeout
week 6: framed protocol + HTTP parser8. 总结
本模块的主线是:用 C++ 类型管理内核资源,用系统工具观察真实状态,用协议和状态机处理网络输入。只要这条线清楚,API 名字会自然归位。
深化切片 1:最小实验
围绕 process 和 fd 做一次工程练习。用一个最小程序观察一个系统行为,不要把 shell、库封装和业务代码混在一起。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 2:错误注入
围绕 fd 和 system call 做一次工程练习。故意制造一个失败条件,例如文件不存在、权限不足、子进程退出码非零、管道对端关闭或映射越界。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 3:外部观察
围绕 system call 和 socket 做一次工程练习。用 ps、strace、lsof、pmap、ss、tcpdump 或调试器观察内核状态,而不是只看 C++ 变量。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 4:RAII 封装
围绕 socket 和 TCP 做一次工程练习。把资源获取、移动、释放和失效状态写进类型,避免正常路径能释放、异常路径泄漏。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 5:并发边界
围绕 TCP 和 epoll 做一次工程练习。系统调用可能阻塞,信号可能打断等待,多个线程可能同时操作同一个资源。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 6:生产复盘
围绕 epoll 和 protocol 做一次工程练习。记录命令、errno、pid、fd、路径、peer、字节数和状态,保证另一个人能复现。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 7:最小实验
围绕 protocol 和 diagnosis 做一次工程练习。用一个最小程序观察一个系统行为,不要把 shell、库封装和业务代码混在一起。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 8:错误注入
围绕 diagnosis 和 process 做一次工程练习。故意制造一个失败条件,例如文件不存在、权限不足、子进程退出码非零、管道对端关闭或映射越界。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 9:外部观察
围绕 process 和 fd 做一次工程练习。用 ps、strace、lsof、pmap、ss、tcpdump 或调试器观察内核状态,而不是只看 C++ 变量。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 10:RAII 封装
围绕 fd 和 system call 做一次工程练习。把资源获取、移动、释放和失效状态写进类型,避免正常路径能释放、异常路径泄漏。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 11:并发边界
围绕 system call 和 socket 做一次工程练习。系统调用可能阻塞,信号可能打断等待,多个线程可能同时操作同一个资源。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 12:生产复盘
围绕 socket 和 TCP 做一次工程练习。记录命令、errno、pid、fd、路径、peer、字节数和状态,保证另一个人能复现。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 13:最小实验
围绕 TCP 和 epoll 做一次工程练习。用一个最小程序观察一个系统行为,不要把 shell、库封装和业务代码混在一起。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 14:错误注入
围绕 epoll 和 protocol 做一次工程练习。故意制造一个失败条件,例如文件不存在、权限不足、子进程退出码非零、管道对端关闭或映射越界。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 15:外部观察
围绕 protocol 和 diagnosis 做一次工程练习。用 ps、strace、lsof、pmap、ss、tcpdump 或调试器观察内核状态,而不是只看 C++ 变量。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 16:RAII 封装
围绕 diagnosis 和 process 做一次工程练习。把资源获取、移动、释放和失效状态写进类型,避免正常路径能释放、异常路径泄漏。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 17:并发边界
围绕 process 和 fd 做一次工程练习。系统调用可能阻塞,信号可能打断等待,多个线程可能同时操作同一个资源。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 18:生产复盘
围绕 fd 和 system call 做一次工程练习。记录命令、errno、pid、fd、路径、peer、字节数和状态,保证另一个人能复现。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 19:最小实验
围绕 system call 和 socket 做一次工程练习。用一个最小程序观察一个系统行为,不要把 shell、库封装和业务代码混在一起。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 20:错误注入
围绕 socket 和 TCP 做一次工程练习。故意制造一个失败条件,例如文件不存在、权限不足、子进程退出码非零、管道对端关闭或映射越界。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 21:外部观察
围绕 TCP 和 epoll 做一次工程练习。用 ps、strace、lsof、pmap、ss、tcpdump 或调试器观察内核状态,而不是只看 C++ 变量。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 22:RAII 封装
围绕 epoll 和 protocol 做一次工程练习。把资源获取、移动、释放和失效状态写进类型,避免正常路径能释放、异常路径泄漏。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 23:并发边界
围绕 protocol 和 diagnosis 做一次工程练习。系统调用可能阻塞,信号可能打断等待,多个线程可能同时操作同一个资源。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 24:生产复盘
围绕 diagnosis 和 process 做一次工程练习。记录命令、errno、pid、fd、路径、peer、字节数和状态,保证另一个人能复现。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 25:最小实验
围绕 process 和 fd 做一次工程练习。用一个最小程序观察一个系统行为,不要把 shell、库封装和业务代码混在一起。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 26:错误注入
围绕 fd 和 system call 做一次工程练习。故意制造一个失败条件,例如文件不存在、权限不足、子进程退出码非零、管道对端关闭或映射越界。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 27:外部观察
围绕 system call 和 socket 做一次工程练习。用 ps、strace、lsof、pmap、ss、tcpdump 或调试器观察内核状态,而不是只看 C++ 变量。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 28:RAII 封装
围绕 socket 和 TCP 做一次工程练习。把资源获取、移动、释放和失效状态写进类型,避免正常路径能释放、异常路径泄漏。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 29:并发边界
围绕 TCP 和 epoll 做一次工程练习。系统调用可能阻塞,信号可能打断等待,多个线程可能同时操作同一个资源。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 30:生产复盘
围绕 epoll 和 protocol 做一次工程练习。记录命令、errno、pid、fd、路径、peer、字节数和状态,保证另一个人能复现。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 31:最小实验
围绕 protocol 和 diagnosis 做一次工程练习。用一个最小程序观察一个系统行为,不要把 shell、库封装和业务代码混在一起。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 32:错误注入
围绕 diagnosis 和 process 做一次工程练习。故意制造一个失败条件,例如文件不存在、权限不足、子进程退出码非零、管道对端关闭或映射越界。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 33:外部观察
围绕 process 和 fd 做一次工程练习。用 ps、strace、lsof、pmap、ss、tcpdump 或调试器观察内核状态,而不是只看 C++ 变量。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 34:RAII 封装
围绕 fd 和 system call 做一次工程练习。把资源获取、移动、释放和失效状态写进类型,避免正常路径能释放、异常路径泄漏。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 35:并发边界
围绕 system call 和 socket 做一次工程练习。系统调用可能阻塞,信号可能打断等待,多个线程可能同时操作同一个资源。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 36:生产复盘
围绕 socket 和 TCP 做一次工程练习。记录命令、errno、pid、fd、路径、peer、字节数和状态,保证另一个人能复现。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 37:最小实验
围绕 TCP 和 epoll 做一次工程练习。用一个最小程序观察一个系统行为,不要把 shell、库封装和业务代码混在一起。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。
深化切片 38:错误注入
围绕 epoll 和 protocol 做一次工程练习。故意制造一个失败条件,例如文件不存在、权限不足、子进程退出码非零、管道对端关闭或映射越界。
hypothesis
-> minimal program
-> external observation
-> failure injection
-> engineering rule复盘时要说明:这个现象属于 C++ 对象生命周期、POSIX/系统调用语义、内核调度、文件系统、虚拟内存,还是网络协议。分层越清楚,系统与网络编程路线 就越不容易学成 API 背诵。