TCP接入层二进制协议设计

TCP接入层二进制协议设计

通常的协议设计一般都是消息头和消息体,公用的部分放在消息头。

RPC时方法名可以设计到消息头里(使用命令号字段),也可以设计到消息体里面。如果是紧凑的格式(流量是需要考虑的一部分的话),并且可以枚举的时候,建议放消息头里面。如果无法枚举,建议放消息体里面。

安全性考虑

安全性前提假设:

1. 客户端的代码对黑客是透明的
2. 网络上的包是可以被获取的
3. 客户端的机器是安全的,也就是黑客无法访问客户端机器内存
4. 服务端是安全的

建议客户端和服务段每次会话使用独立密钥加密,可以使用ECDHE算法(参考TLS)。选一个靠谱的椭圆曲线(需要双方提前约定),双方互相发送公钥后即可协商出对称加密的密钥。

通常加密的时候协议头是不加密的,只加密协议体。这里又回到上面提到的,如果你的调用方法名需要加密的话,那么可以把方法名放到协议体里面去。

客户端对服务端

客户端对服务端协议需要考虑如下的基本字段:

• 魔数(断包用)
• 版本
• 命令号/消息类型(用来区分心跳/加密/和普通消息)
• 请求id(异步回调用)
• Log id(关联日志)
• Body length
• Body[]

魔数的存在是为了断包,假如收到的包前面几个字节不符合魔数规则,就直接断开连接,说明这是一个非法连接

服务端对等RPC

服务端对服务端的调用通常不考虑加密,RPC协议需要考虑如下的基本字段:

• 魔数(断包用)
• 版本号
• 协议总长度
• 请求id(异步回调用)
• 服务编号(方法名称)
• 命令号/消息类型(用来区分心跳/加密/和普通消息)
• 压缩算法
• 序列化规则
• 平台号(调用方应用名称)
• Log_id(关联日志/链路追踪用)
• 消息主体