产品及架构介绍
定义
命名空间:TouchSocket.Dmtp
程序集:TouchSocket.Dmtp.dll
一、说明
DMTP(Duplex Message Transport Protocol双工消息传输协议)是一个简单易用,便捷高效,且易于扩展的二进制数据协议。
【协议格式】
|--Head--|--Flags--|--Length--|-----Data-----|
|----2----|----2----|-----4------|-------n-------|
协议格式非常简单。
- 协议头为2字节,一般为固定值,目前第一版为“dm”。
- 协议标志位为2字节,表示本次协议的标志位。类型是
大端ushort无符号
类型。其中0-19
的协议框架内部占用。其余的均可被自定义使用 - 再4字节为
大端Int32
有符号类型,表示本次协议的载荷数据长度。 - 其余数据为实际载荷数据。
可能好多人会疑惑,Dmtp和tcp、udp有什么关系?或者说,类似tcp,本身就是可靠传输协议了,那Dmtp的可靠又体现在什么地方呢?
1.1 Dmtp和Tcp、Udp有什么关系?
Dmtp像http和websocket一样,也是封装的应用层协议。它可以基于最基本的tcp或http工作,也能基于websocket工作。
所以,可以 认为Dmtp是更为高级的应用层协议。
1.2 Tcp本身就是可靠传输协议了,那Dmtp的可靠又体现在什么地方呢?
首先呢,我们得明确,tcp的可靠,是在保持连接的时候,才可靠。当突然断网时,这种可靠将被打破。其次这种可靠是单项的,举例来说,发送方只是负责将数据发给接收方,至于接收方处理了没有,或者处理结果如何,都是未知的。那么这时候聪明的小伙伴就会想到让接收方回复一个状态不就行了?是的,这就是Dmtp工作的场景之一了。
当然,Dmtp的功能远非上述的两个场景,详细概览如下:
二、特点
2.1 基础功能
- 支持连接验证,也支持动态信息验证。
- 支持Id同步,每个客户端连接到服务器后,自身Id会与服务器Id同步,且支持重置。
- 支持ssl加密。
- 支持协议扩展。
- 支持独立通道数据,可进行数据隔离。
- 支持服务器 到客户端,客户端到客户端的操作。
三、场景
什么情况下使用Dmtp比较好呢?。
- 基本上不需要跨语言的终端,例如:Unity游戏,Winform、WPF、MAUI等软件。
- 服务器之间集群。
- 扩展微服务,此时可以使用反向Rpc实现。
实际上目前Dmtp有五个版本,分别为:
类型 | 特性 |
---|---|
Tcp版 | 基于Tcp协议,连接性能最好,执行效率最高,支持Dmtp所有功能。 |
Udp版 | 基于Udp协议,不需要连接,会标识基于不可靠协议,可能支持Dmtp所有功能,具体的还要看实际添加的插件是否支持在不可靠协议工作。例如DmtpRpc就支持在Udp不可靠协议工作。 |
NamedPipe版 | 基于命名管道,流速性能最好,比Tcp版多出3倍。响应效率一般,是Tcp版的一半,是进程通讯的最佳选择。支持Dmtp所有功能。 |
Http版 | 基于Http握手连接,数据交互仍然使用TCP。连接性能一般,但兼容性强,支持JsonRpc,WebApi,XmlRpc,WebSocket等一系列Http组件,且执行效率和TCP版一样高,支持Dmtp所有功能。 |
WebSocket版 | 该版本是仅适用于Asp.Net Core的版本,特点就是和Asp.Net Core共用端口。但是执行数据使用的是WebSocket,所有效率只有Tcp版的80%。支持Dmtp所有功能 |
Http中间件版 | 该版本是仅适用于Asp.Net Core的版本,特点就是和Asp.Net Core共用端口。但是执行数据使用的Http自升级协议,所有效率介于WebSocket与Tcp版之间。支持Dmtp所有功能 |
四、注意事项
4.1 连接注意事项
Dmtp拥有独立的连接机制,在连接前后会依次触发IDmtpHandshakingPlugin
与IDmtpHandshakedPlugin
插件。当完成连接时,其IDmtpActor.IsHandshaked
方为true
,此后才可以进行后续操作。
例如:Dmtp-Tcp组件,这是基于Tcp协议的Dmtp,因为它是继承实现,所以会拥有Online
和IsHandshaked
两个属性。其中Online仅仅表示已经建立Tcp连接,IsHandshaked才表示Dmtp是否完成握手。
所以,在一些情况下,可能可能需要判断IsHandshaked
完成,才能进行后续操作。