01-从socket到网络系统
从 socket 到网络系统——网络通信是如何一步步长出来的
和「从指令到系统」同一种写法:从最简单的网络程序开始,每一步都是上一步「扛不住了」逼出来的。最终长出 EventLoop、协议、会话——这些概念不是某天被发明的,而是从一条 socket 调用演化出来的。
一、一条 socket 调用
最开始,网络就是收发字节:
1 | int sock = socket(AF_INET, SOCK_STREAM, 0); |
所有东西在一个函数里——创建、连接、发送、接收、关闭。没有组件,没有分层,没有协议。和「所有东西写在 main 里」是同一个阶段。
这个阶段有:socket、地址、字节流。没有连接管理,没有协议,没有并发。
二、第二个拐弯:循环处理
一条 socket 调用只能处理一次请求。要处理多次,需要循环:
1 | while (1) { |
和「顺序执行 → 循环」是同一步——程序从「做一次」变成「反复做」。
但这里有一个严重问题:处理一个连接时,其他连接在排队等待。 如果一个客户端发了大量数据,其他客户端全部阻塞。
三、第三个拐弯:多连接
要同时处理多个连接,需要管理多个 socket:
1 | int clients[100]; |
和「单文件 → 多文件」是同一步——职责从一个地方扩散到多个地方。
但遍历所有 socket 太慢了——100 个连接里可能只有 2 个有数据,但要逐个检查。
四、第四个拐弯:EventLoop
操作系统提供了高效的通知机制——只告诉「谁有事」,不用逐个检查:
1 | // epoll(Linux) |
这就是 EventLoop——事件循环。它的本质是:把「遍历所有连接」变成「只处理有事的连接」。
EventLoop 是网络系统的心脏——后续所有组件都围绕它运转。
EventLoop 是第一个有状态组件——它有自己的运行循环,自己决定什么时候处理什么事件。
五、第五个拐弯:协议出现
EventLoop 解决了并发问题,但收发的还是原始字节。调用者需要知道「这 4 个字节是命令,接下来 N 个字节是数据」——每个调用者都要自己解析。
更糟的是:TCP 是流式协议,一次 recv 可能收到半条消息,或者两条消息粘在一起。
需要一个统一的协议来定义消息格式:
1 | // 协议:定义消息长什么样 |
协议是独立的——它定义「消息长什么样」,不关心「字节怎么收发」。
协议的出现把「字节流」变成了「消息流」——调用者不再处理原始字节,而是处理结构化消息。
六、第六个拐弯:会话管理独立
每个客户端连接需要维护自己的状态——缓冲区、已收到的消息、协议状态(握手/正常/关闭)。这些状态不应该散落在 EventLoop 的回调里。需要独立的会话管理:
1 | struct Session { |
Session 是有状态的——每个客户端一个 Session,生命周期从连接建立到连接断开。
会话管理把「每个连接的状态」从 EventLoop 中抽离出来——EventLoop 只管事件分发,Session 管状态。
七、第七个拐弯:组件化
现在网络系统有了这些组成部分:
1 | 网络系统 |
和「按功能分模块」是同一步——职责从一个 EventLoop 回调扩散到多个独立组件。
每个组件有明确的职责边界:EventLoop 管事件,Connection 管连接,Session 管状态,Protocol 管格式,Buffer 管缓冲。
注意:解析(字节 ↔ 消息转换)和调度(消息路由)不属于网络系统——它们属于入口系统(通信程序)。网络系统只负责收发字节和管理连接,不关心消息怎么解析、交给谁处理。
八、第八个拐弯:封装与调用
组件拆出来了,但还不能被直接调用——需要封装成可调用的系统。系统封装有两种:
1 | ① 内部封装好了框架或接口: |
框架化是入口启动,接口化是上层调用接口——系统封装成哪种形态,决定它被怎么使用。
九、网络系统 vs 业务系统
网络系统组装好后,和业务系统的关系:
1 | 网络系统: |
1 | 入口系统 |
网络系统和业务系统是独立演化的——网络系统不知道业务是什么,业务系统不知道网络怎么收发。它们通过 Handler 接口连接。
十、演化总结
1 | 一条 socket 调用 最简单的网络程序 |
网络系统的构成:有状态组件 EventLoop/Connection/Session + 无状态工具 Buffer + 协议数据结构 Protocol。
解析层和分发层属于入口系统(通信程序),不属于网络系统。
每一步都是上一步「扛不住了」逼出来的:
1 | 循环 → 因为一次不够 |
这就是网络系统从一条 socket 调用长成完整系统的全过程。和「从指令到系统」是同一种演化逻辑——只是领域不同。
演化史 vs 设计线:本篇讲网络系统「怎么一步步长出来」(演化视角);
04-网络系统设计从想法到实现讲拿到通信需求后「按什么步骤设计」(设计视角,含协议/组件/接口/框架的原子步骤清单)。两者互补。
