Http 高并发服务器
Http 高并发服务器 · 学习路线图
> 原文档为碎片式关键词,现按「由浅入深」顺序重新梳理,形成可执行清单。
1 HTTP 协议基础
1.1 请求报文格式
- 请求行
- 请求头
- 空行
- 请求体(可选)
1.2 响应报文格式
- 状态行
- 响应头
- 空行
- 响应体
2 前置技能清单
| 模块 | 必备知识点 | 推荐做法 |
|---|---|---|
| HTML | 常用标签:form、img、table、a | 手写静态页面,浏览器验证 |
| Linux | 基本命令、man 手册、文件权限 | 每日一命令,写博客记录 |
| 网络编程 | socket、TCP 三次握手、四次挥手 | 先写 echo 服务器 |
| 多线程 | pthread_create、互斥锁、条件变量 | 实现生产者-消费者模型 |
| I/O 多路复用 | select → poll → epoll | 对比性能,写测试报告 |
3 分阶段实战
3.1 阶段一:C 语言版「线程池 + epoll」
- 目标:1 万并发静态网页
- 技术栈:epoll(ET) + 非阻塞 socket + 线程池
- 输出:wrk 压测截图 + QPS 记录
3.2 阶段二:C 语言版「Reactor 模型」
- 单 Reactor:主线程负责 epoll_wait + 业务回调
- 多 Reactor:主线程只 accept,子线程各自 epoll
- 输出:draw.io 架构图 + 核心代码注释
3.3 阶段三:C++ 版「现代化重构」
- 用 C++11 thread、std::function、std::bind 替代裸指针
- 引入 Qt 信号槽思想,解耦线程通信
- 输出:GitHub 仓库 + README 徽章
4 工具与生态
| 工具 | 用途 | 一句话提示 |
|---|---|---|
| libevent | 开源 Reactor 库 | 先手写,再源码对照 |
| Ubuntu / CentOS | 开发/生产环境 | 开发用 Ubuntu,上线用 CentOS |
| man | 查系统 API | man 2 epoll_wait 比百度准 |
| VS2019 / CLion | IDE | 写代码爽,最终 Linux 编译 |
5 六周学习节奏
| 周次 | 任务 | 交付物 |
|---|---|---|
| 1 | 图解 HTTP + telnet 手敲请求 | 博客笔记 |
| 2 | 单线程 echo 服务器 | 源码 + 运行截图 |
| 3 | 返回固定 HTML,浏览器可访问 | 最丑 HTTP 服务器 |
| 4 | 引入 epoll + 线程池,压测 1 w 并发 | wrk 报告 |
| 5 | 重构为单/多 Reactor | 架构图 + 代码 |
| 6 | C++ 重写 + 单元测试 + GitHub | 仓库链接 |
6 常见疑问速答
-
select/poll/epoll 区别?
select:1024 上限;poll:无上限但遍历;epoll:回调通知,O(1)。 -
为何 socket 要非阻塞?
边缘触发下,阻塞读可能卡死整个线程。 -
Reactor vs Proactor?
Reactor:内核通知“准备好了”,自己读;
Proactor:内核帮你读完,再通知“读完了”。Linux 下主流 Reactor。
7 后续可拓展
- HTTP/1.1 chunked 编码
- POST 表单解析 & 文件上传
- OpenSSL 升级 HTTPS
- 静态资源缓存(etag、last-modified)
- WebSocket 聊天室
- 协程化(libco/boost::coroutine)
> 先让浏览器能打开你的网页,再让一万人同时打开,再去谈优雅与性能。
> 记得常 git commit 和 wrk -t12 -c10000 -d30s http://localhost/









