「完整FX」C++从0实现百万并发Reactor服务器

112 阅读3分钟

C++从0实现百万并发Reactor服务器

核心代码,注释必读

// download:3w lexuecode com

C++从0实现百万并发Reactor服务器 - 网络编程基础

网络编程中有许多基础概念必须了解,比如 OSI,TCP/IP,字节序列等,这些都是开发网络应用的基础,可以帮助我们更好的理解网络程序的工作原理,来一起学习下一些比较重要的概念。

OSIOpen System Interconnection)是国际标准化组织(ISO)制定的计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI 模型把网络通信分为 7 层 TCP/IP 协议没有表示层和会话层,其中每层对应到 OSI 的协议主要有下面这些:

  • 应用层:TFTP,HTTP,FTP 等
  • 传输层:TCP,UDP
  • 网络层:IP,IGMP 等
  • 数据层:MTU 等
  • 物理层:ISO 2110,IEEE802 等

TCP/IP 协议基础

TCP/IP 包含许多协议,比如 TCP,UDP,IP,HTTP,FTP 等,平常上网都会使用到它们,必须要了解些概念:

  • TCP(Transport Control Protocol):传输控制协议
  • UDP(User Datagram Protocol):用户数据报协议
  • IP(Internetworking Protocol):网间协议
  • HTTP(Hypertext Transfer Protocol):超文本传输协议
  • FTP(File Transfer Protocol):文本传输协议

C++从0实现百万并发Reactor服务器 IO多路复用

在改进网络 I/O 模型前,我先来提一个问题,你知道服务器单机理论最大能连接多少个客户端?

相信你知道 TCP 连接是由四元组唯一确认的,这个四元组就是:本机IP, 本机端口, 对端IP, 对端端口

服务器作为服务方,通常会在本地固定监听一个端口,等待客户端的连接。因此服务器的本地 IP 和端口是固定的,于是对于服务端 TCP 连接的四元组只有对端 IP 和端口是会变化的,所以最大 TCP 连接数 = 客户端 IP 数×客户端端口数

对于 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方,也就是服务端单机最大 TCP 连接数约为 2 的 48 次方

这个理论值相当“丰满”,但是服务器肯定承载不了那么大的连接数,主要会受两个方面的限制:

  • 文件描述符,Socket 实际上是一个文件,也就会对应一个文件描述符。在 Linux 下,单个进程打开的文件描述符数是有限制的,没有经过修改的值一般都是 1024,不过我们可以通过 ulimit 增大文件描述符的数目;
  • 系统内存,每个 TCP 连接在内核中都有对应的数据结构,意味着每个连接都是会占用一定内存的;

那如果服务器的内存只有 2 GB,网卡是千兆的,能支持并发 1 万请求吗?

并发 1 万请求,也就是经典的 C10K 问题 ,C 是 Client 单词首字母缩写,C10K 就是单机同时处理 1 万个请求的问题。

从硬件资源角度看,对于 2GB 内存千兆网卡的服务器,如果每个请求处理占用不到 200KB 的内存和 100Kbit 的网络带宽就可以满足并发 1 万个请求。