跳到主要内容
版本:2.0

产品及架构介绍

定义

命名空间: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比较好呢?。

  1. 基本上不需要跨语言的终端,例如:Unity游戏,Winform、WPF、MAUI等软件。
  2. 服务器之间集群。
  3. 扩展微服务,此时可以使用反向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拥有独立的连接机制,在连接前后会依次触发IDmtpHandshakingPluginIDmtpHandshakedPlugin插件。当完成连接时,其IDmtpActor.IsHandshaked方为true,此后才可以进行后续操作。

例如:Dmtp-Tcp组件,这是基于Tcp协议的Dmtp,因为它是继承实现,所以会拥有OnlineIsHandshaked两个属性。其中Online仅仅表示已经建立Tcp连接,IsHandshaked才表示Dmtp是否完成握手。

所以,在一些情况下,可能可能需要判断IsHandshaked完成,才能进行后续操作。