IO 多路复用:一个线程为什么可以同时处理大量 HTTP 请求?

IO 多路复用:一个线程为什么可以同时处理大量 HTTP 请求? 我们知道,一个 Web 服务同时面对大量 HTTP 请求时,并不一定需要: 1000 个请求 ↓ 1000 个线程 对于 IO 密集型服务,更常见的做法是让执行单元在等待网络 IO 时不要一直阻塞,然后利用事件机制处理其他连接。 这就引出了一个非常重要的概念: IO 多路复用(I/O Multiplexing)。 它是理解 Linux 网络服务器、Nginx、Node.js、Swoole、Hyperf 等高并发网络程序的基础。 1. 先从一个 Socket 开始 一个 HTTP 服务器,本质上需要处理大量网络连接。 例如服务器监听: 0.0.0.0:80 客户端建立 TCP 连接后,操作系统会为连接提供对应的 Socket。 可以简单理解为: Client A ─── Socket A ──┐ Client B ─── Socket B ──┤ Client C ─── Socket C ──┤ Client D ─── Socket D ──┤ ▼ Web Server 假设现在有: 10000 个 TCP 连接 服务器需要解决一个问题:...

2024年06月20日 · 6 min · Leanku

Socket 详解:应用程序如何进行网络通信

Socket 详解:应用程序如何进行网络通信 上一篇《TCP/IP 详解:理解互联网通信的基础》文章介绍了 TCP/IP。 我们知道: 应用层 ↓ TCP / UDP ↓ IP ↓ 网络 TCP/IP 负责完成网络通信,但应用程序并不会直接操作 TCP 报文或者 IP 数据包。 应用程序通常通过操作系统提供的 Socket API 来使用网络能力。 因此,如果 TCP/IP 是网络通信的基础,那么 Socket 就是: 应用程序进入网络世界的接口。 对于后端开发来说,理解 Socket 非常重要。 HTTP Server、MySQL、Redis、RPC、WebSocket,以及各种 TCP 长连接服务,底层都离不开 Socket。 1. Socket 到底是什么? Socket 通常翻译为“套接字”。 它不是一个网络协议,而是一种网络通信接口和抽象。 应用程序可以通过 Socket: 创建通信端点 绑定地址 建立连接 发送数据 接收数据 关闭连接 例如 TCP 服务端的典型流程: socket() ↓ bind() ↓ listen() ↓ accept() ↓ read() / write() ↓ close() 客户端则通常是:...

2023年07月18日 · 6 min · Leanku