---
id: dmtpdescription
title: 产品及架构介绍
---


### 定义

命名空间：TouchSocket.Dmtp <br/>
程序集：[TouchSocket.Dmtp.dll](https://www.nuget.org/packages/TouchSocket.Dmtp)

## 一、说明

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 基础功能

- 支持[连接验证](./dmtpbase.mdx)，也支持动态信息验证。
- 支持[Id同步](./dmtpbase.mdx)，每个客户端连接到服务器后，自身Id会与服务器Id同步，且支持重置。
- 支持ssl加密。
- 支持[协议扩展](./dmtpbase.mdx)。
- 支持独立通道数据，可进行数据隔离。
- 支持服务器到客户端，客户端到客户端的操作。


## 三、场景

什么情况下使用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拥有独立的连接机制，在连接前后会依次触发`IDmtpHandshakingPlugin`与`IDmtpHandshakedPlugin`插件。当完成连接时，其`IDmtpActor.IsHandshaked`方为`true`，此后才可以进行后续操作。

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

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