通信系统:把外部通信转换成内部消息
通信系统是程序的第三个角色——把外部通信(字节/数据报)转换成系统内部消息,并把结果转换回通信数据。通信系统按组件组织(不是按模块,也不是分层),组件内部再按数据/算法/接口组织。网络系统是通信系统的组件组织实例。
通信系统不是和「服务器」并列的第四个系统。 cli / gui / 服务器都是入口系统;通信系统是可选第三角色——只有需要对外通信的程序才有(服务器、联网客户端),纯 CLI / 纯 GUI 没有。「通信系统」就是「网络系统」:通信系统是角色(抽象),网络系统是它的组件组织实例(具体形态)。
一、通信系统是什么
通信系统的职责一句话:
把外部通信转换成系统内部消息,并把结果转换回通信数据。
1 2 3 4 5 6 7 8 9
| 外部通信(字节流/数据报) ↓ 通信系统 ↓ 系统内部消息 ↓ 业务处理完 通信系统 ↓ 外部通信(响应)
|
它与入口系统的区别:
1 2
| 入口系统:用户输入 → 系统调用(用户操作) 通信系统:外部通信 → 内部消息(网络数据)
|
什么样的程序有通信系统?
1 2 3 4
| CLI(纯命令) :入口系统 + 业务系统 ← 无通信系统 GUI(纯界面) :入口系统 + 业务系统 ← 无通信系统 服务器 :入口系统 + 业务系统 + 通信系统(网络系统) 联网客户端 :入口系统 + 业务系统 + 通信系统(网络系统)
|
服务器不是「第四个系统」——服务器是入口系统的一种(长期运行的服务入口),它的网络收发能力来自通信系统。
二、通信系统的组织单位:组件
通信系统的核心组织单位是组件(不是模块,也不是分层):
1 2 3 4 5 6 7
| 通信系统 ├── 网络组件 Socket / Connection / Buffer / EventLoop ├── 传输组件 TCP / UDP ├── 会话组件 Session / Connection State ├── 协议组件 Message Definition / Packet Format ├── 编解码组件 Encode / Decode └── 通信调度组件 Dispatch / Routing / Handler
|
「模块设计」和「组件设计」不是上下级关系,而是系统类型不同产生的两条设计路线。 业务系统用模块,通信系统用组件。
三、通信系统的设计路线
1 2 3 4 5 6 7 8 9 10 11 12 13
| 通信需求 ↓ 通信系统设计 ↓ 通信组件设计 ↓ 组件接口设计 ↓ 组件实现 ↓ 框架化 ↓ 系统组装
|
通信系统有两个独立的设计对象:协议设计(对端之间)与组件接口设计(组件之间)——它们不是一回事:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 协议设计(对端之间): 确定通信双方 → 通信方向 → 消息类型 → 请求/响应类型 → 消息结构 → 消息字段 → 字段类型/长度/编码 → 消息边界 → 消息序列 → 请求响应关联 → 错误消息 → 协议状态 → 协议状态转换 → 协议版本 → 协议扩展方式 → 协议描述
组件接口设计(组件之间): 确定网络接口 → 连接接口 → 会话接口 → 缓冲接口 → 编码接口 → 解码接口 → 消息接口 → 发送接口 → 接收接口 → 事件接口 → 生命周期接口 → 停止接口 → 错误处理接口 → 建立组件调用关系
|
两者的区别:
1 2 3 4 5
| 协议 = 对端的交换规则:字节怎么组织、消息什么语义(wire format) 接口 = 组件的调用契约:代码怎么调用(send / recv / on_event 的函数签名)
协议管「线上长什么样」,接口管「代码怎么调」。 同一个协议可以有多种接口实现;同一个接口也可以换不同协议。
|
「通信协议设计」和「通信组件接口设计」是通信系统里两个独立的设计对象——协议定义双方交换什么,接口定义组件之间怎么调用。协议是通信组件体系中的一个独立设计对象,接口是组件的调用面。
四、通信系统:分组件不是分层
通信系统(网络系统)是分组件,不是分层:
1 2 3 4 5 6
| 网络系统的构成(三类东西,不是五个组件): EventLoop(有状态组件,心脏) Connection(有状态组件) Session(有状态组件) Buffer(无状态工具) Protocol(数据结构:协议格式定义,不是组件)
|
有状态组件之间平级,由 EventLoop 统一驱动,不存在「上层→下层」的层级关系。
五、通信系统与入口系统的边界
通信系统负责「字节」,入口系统负责「消息」:
1 2 3 4 5 6 7 8 9 10
| 通信系统(网络系统): EventLoop / Connection / Session / Protocol / Buffer 处理对象:字节 职责:收发、连接、会话、协议格式
入口系统(通信程序): 解析层(Parser):字节 ↔ 消息 分发层(Dispatcher):消息 → Handler 处理对象:消息 职责:解析、路由、分发
|
1 2
| protocol.cpp 是协议层(属于通信系统)——定义消息格式 parse 是解析层(属于入口系统)——字节 ↔ 消息转换
|
三个系统各管一段:网络系统管字节,入口系统管消息,业务系统管业务。
六、和其他内容的关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 通信系统 ←→ 网络系统 网络系统是通信系统的组件组织实例(3 有状态组件 + Buffer 工具 + Protocol 数据结构)
通信系统 ←→ 从socket到网络系统 从 socket 到网络系统的演化史 = 通信系统的形成过程
通信系统 ←→ 设计起点(通信程序的设计顺序) 通信系统的开发顺序 = 协议 → 组件 → 接口 → 实现 → 测试 → 框架化 → 组装 (组件接口设计的步骤清单在设计顺序线 06-设计/05 的 ③; 那边是设计顺序视角,这边是角色视角:协议 vs 接口的区分)
通信系统 ←→ 网络系统设计线(网络系统/04-网络系统设计从想法到实现) 本线讲通信系统的角色(职责、组织单位、边界) 设计线讲通信系统的设计过程(从通信需求到系统组装,含每步原子步骤清单)
通信系统 ←→ 服务器 服务器(入口系统)之下是通信系统
通信系统 ←→ 系统角色主题 04 是主题的第三个角色(通信 → 消息)
|
收束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 通信系统 = 把外部通信转换成内部消息 再转换回通信数据
组织单位:组件(不是模块,不是分层) 网络/传输/会话/协议/编解码/调度组件
设计路线:需求 → 组件设计 → 接口 → 实现 → 框架化 → 组装
设计对象:协议设计(对端规则)+ 组件接口设计(组件间契约)
分组件不是分层:组件平级,EventLoop 驱动
边界:通信管字节,入口管消息,业务管业务
有通信需求的程序才有通信系统(服务器/联网客户端); 纯 CLI / 纯 GUI 是入口系统 + 业务系统,没有通信系统
|
通信系统是程序的对外通道。 它把外部的字节变成内部的消息,交给入口系统分发、业务系统处理,再把结果变回字节送出去。