通信系统:把外部通信转换成内部消息

通信系统是程序的第三个角色——把外部通信(字节/数据报)转换成系统内部消息,并把结果转换回通信数据。通信系统按组件组织(不是按模块,也不是分层),组件内部再按数据/算法/接口组织。网络系统是通信系统的组件组织实例。

通信系统不是和「服务器」并列的第四个系统。 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 是入口系统 + 业务系统,没有通信系统

通信系统是程序的对外通道。 它把外部的字节变成内部的消息,交给入口系统分发、业务系统处理,再把结果变回字节送出去。