Socket.D v2.5.10

协议概要

</> markdown

从层次上讲,我们是基于传输层之上的,算是应用协议。所以叫自己为:

基于事件和语义消息流的网络应用协议

因为:

  • 有事件
  • 有元信息(语义)
  • 有流(一个流,会有一个或多个帧组成)

1、连接地址风格

采用 url 的形式,做为客户端的连接地址(总长不超过 512 字节):

sd:tcp://19.10.2.3:9812/path?u=noear&t=1234
sd:udp://19.10.2.3:9812/path?u=noear&t=1234
sd:ws://19.10.2.3:1023/path?u=noear&t=1234
sd:kcp://19.10.2.3:1023/path?u=noear&t=1234

协议头架构说明:

应用协议传输协议说明
sd 表示 socket.d 应用协议,代表了帧码格式,代表了指令流
tcp表示使用 tcp 传输数据
udp表示使用 udp 传输数据
ws表示使用 ws (websocket) 传输数据
kcp表示使用 kcp 传输数据(基于 udp 的增强)

传输协议选择建议:

  • 弱网络且数据包很小。可以考虑 udp
  • 如果有 web 前端开发。可以考虑 ws
  • 其它随意

2、帧码结构

socket.d 的流是以帧为单位进行传输。大的帧还会自动分片成小帧进行传输,到达接收端后再自动聚合。

  • 帧的逻辑结构
frame: {flag, message: {sid, event, entity: { metaString, data}}}

帧的数据逻辑结构:帧里有标志和消息;消息里有流标识、事件、实体;实体里有元信息字符串和数据。

  • 完整的标准帧码
//udp only <2k
[len:int][flag:int][sid:str(<64)][\n][event:str(<512)][\n][metaString:str(<4k)][\n][data:byte(<16m)]
字段类型大小说明
lenint4字节帧长度(包括它自己的 4字节占位)
flagint4字节标志(相当于协议指令)
sidString64字节以内流标识。格式为: guid
eventString512字节以内事件。格式为:可见字符 string
metaStringString4Kb以内元信息字符串。格式为:通用的 uri queryString
databyte[]16Mb以内数据。格式为: byte[]
\nchar2字节换行符(字符串的间隔符)。编码为:x0a

注意1:String 的字符集由实现框架通过配置决定
注意2:当使用 udp 传输时,帧长度不能超过 1.4K

  • 简化的辅助帧码(Ping, Pong, Close),取消了 message 部分
[len:int][flag:int]

3、指令流

FlagValueServerClient
Unknown0::close()::close()
Connect10/c(Connect)->s::onOpen(),s(Connack?)->c::onOpen()
Connack11->s::onOpen(),s(Connack?)->c/
Ping20/c(Ping)->s(Pong)->c
Pong21->s(Pong)->c/
Close30s(Close)->cc(Close)->s
Alarm31s(Alarm)->cc(Alarm)->s
Message40s(Message)->cc(Message)->s
Request41s(Request)->c(Reply or ReplyEnd)->sc(Request)->s(Reply or ReplyEnd)->c
Subscribe42s(Subscribe)->c(Reply...ReplyEnd)->sc(Subscribe)->s(Reply...ReplyEnd)->c
Reply48->s(Reply)->c->c(Reply)->s
ReplyEnd49->s(ReplyEnd)->c->c(ReplyEnd)->s
//The reply acceptor registration in the channel is removed after the reply is completed