# TcpServer **Repository Path**: erMu99/TcpServer ## Basic Information - **Project Name**: TcpServer - **Description**: 仿muduo库one thread one loop式高并发服务器实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-19 - **Last Updated**: 2025-03-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: Cpp ## README ## 1. 项目简介 本项目是一个基于主从Reactor模型实现的高性能服务器框架,主要采用C++11开发,支持HTTP协议及高并发网络通信。通过One Thread One Loop架构实现线程级事件循环,主Reactor负责监听新连接,子Reactor处理IO读写事件,结合时间轮算法管理超时连接,可承载 高并发请求。提供HTTP协议解析、动态缓冲区管理、正则匹配路由等核心功能,支持快速构建Web服务。 [muduo 源码](https://github.com/chenshuo/muduo/tree/master/muduo) muduo 剖析 - [link1](https://www.cyhone.com/articles/analysis-of-muduo/) - [link2](https://blog.csdn.net/T_Solotov/article/details/124044175) ## 2. 开发环境 本项目的开发环境如下: - Linux云服务器:在 Ubuntu Server 22.04 LTS 64bit 环境下进行开发环境搭建与项目部署。 - VSCode/Vim:通过 VSCode 远程连接服务器或直接使用 Vim 进行代码编写与功能测试。 - g++/gdb:通过 g++/gdb 进行代码编译与调试。 Makefile:通过 Makefile 进行项目构建。 ## 3. 核心技术 - C++11/C++17:使用 C++11/C++17 中的某些新特性完成代码的编写,如 `function/bind/shared_ptr/mutex/regex/any`。 - Linux 系统编程:使用 Linux 相关系统调用完成代码编写,如 `read/write/timerfd/eventfd/epoll`。 - Linux 网络编程:使用 Socket 相关接口实现网络通信,如 `socket/bind/listen/accept/recv/send/setsockopt`。 - HTML:编写简单 HTML 页面进行功能测试。 ## 4. 框架设计 整体模块设计如下: 由于本项目实现的是一个带有协议支持的 Reactor 模型高性能服务器组件,因此将整个项目划分为两个大的模块: - SERVER 模块:实现 Reactor 模型的 TCP 服务器。 - 协议模块:对当前的 Reactor 模型服务器提供应用层协议支持。(目前仅提供 HTTP 协议支持) ### 4.1 SERVER 模块 SERVER 模块就是对所有的连接以及线程进行管理,让它们各司其职,在合适的时候做合适的事,最终完成高性能服务器组件的实现。管理具体分为三个方面: - 监听连接管理:对监听连接进行管理 - 通信连接管理:对通信连接进行管理 - 超时连接管理:对超时连接进行管理 基于以上的管理思想,可以将 SERVER 模块划分为以下的一些子模块: Buffer 模块:实现通信套接字的用户态缓冲区,防止接收到的数据不是一条完整的数据,同时确保客户端响应的数据在套接字可写的情况下进行发送。 Socket 模块:对 socket 套接字的操作进行封装,使得程序中对于套接字的各项操作更加简便。 Channel 模块:对于一个描述符进行监控事件管理,便于在用户态对描述符的监控事件进行维护。 Connection 模块:对通信连接进行整体管理,一个连接的所有操作都通过此模块来完成,增加连接操作的灵活以及便捷性。 Acceptor 模块:对监听套接字进行管理,为客户端的新建连接创建 Connection 对象,并设置各种回调。 TimerQueue 模块:定时任务模块,让一个任务可以在指定的时间之后被执行。 Poller模块:对任意的描述符进行IO事件监控,本质上就是对 epoll 的各种操作进行封装,从而让对描述符进行事件监控的操作更加简单,此模块是 Channel 模块的一个子模块。 EventLoop 模块:对事件监控进行管理,为了确保线程安全,此模块一个模块对应一个线程,服务器中的所有的事件都是由此模块来完成。 LoopThread 模块:将 EventLoop 与 thread 整合到一起,向外部返回所实例化的 EventLoop 对象,即将 EventLoop 对象与线程一一绑定。 LoopThreadPool 模块:LoopThread 线程池,用于对所有的 LoopThread 进行管理及分配。 TcpServer 模块:对前边所有子模块进行整合,从而提供给组件使用者的可以便捷的完成一个高性能服务器搭建的模块。 ### 4.2 协议模块 协议模块用于对 SERVER 模块提供应用层协议支持,基于提供的协议支持能够更方便的完成指定协议服务器的搭建,同时还能够根据不同的应用场景切换不同的应用层协议。项目目前只提供了 HTTP 协议支持。 HTTP 协议支持模块可以划分为以下几个子模块: Util 模块:工具模块,提供 HTTP 协议模块所用到的一些工具函数,比如 URL 编码与解码、文件数据读取与写入等。 HttpRequest 模块:HTTP 请求数据模块,用于保存 HTTP 请求数据被解析后的各项请求元素信息。 HttpResponse 模块:HTTP 响应数据模块,用于业务处理后设置并保存 HTTP 响应数据的的各项元素信息。 HttpContext 模块:HTTP 请求接收的上下文模块,用于防止在一次接收的数据中不是一个完整的 HTTP 请求,便于后续接收新数据后继续根据上下文进行解析。 HttpServer 模块:对 HTTP 协议支持的所有模块的整合,让HTTP服务器的搭建变得更加简便。 整体的模块示意图如下: ![Reactor](img/Reactor.png) ## 5. 性能压力测试 使用服务器压力测试工具 [WebBench](https://github.com/EZLippi/WebBench) 模拟多个客户端同时访问服务器,测试服务器的并发量 (可以同时处理多少个客户端的请求而不会出现连接失败) 以及 QPS (每秒钟处理的包的数量)。 测试环境如下: - 服务器为2核2G带宽4M的云服务器。 - 在服务器或虚拟机上运行 WebBench 程序。 使用 WebBench 程序以 1000 的并发量,进行 60s 的测试。 测试结果如下: ![压测](img/压测.png)