DICOM 通讯协议中的 ACSE → DIMSE → Worklist 这条通讯链路。DICOM 通讯栈本身是一个多层的协议结构,就像 OSI 模型一样,逐层封装功能。
一、DICOM 通讯协议栈总体架构
DICOM 通讯使用 TCP/IP 建立连接,其上面封装了多个协议层次,如下所示:
物理层 (TCP/IP)
└── 应用服务元素层(ACSE)
└── DICOM 消息服务元素层(DIMSE)
└── DICOM 服务类(如 Worklist、C-FIND、C-STORE)
二、分层结构分析(ACSE → DIMSE → 服务类)
层级 |
全称 |
功能 |
示例 |
ACSE |
Association Control Service Element |
建立、维护、释放连接 |
握手、验证 AE Title、协商 SOP Class |
DIMSE |
DICOM Message Service Element |
封装具体 DICOM 命令 |
C-ECHO(测试联通)、C-FIND(查询)、C-STORE(存储) |
服务类(SCP/SCU) |
如 Worklist、Storage 等 |
提供特定服务操作的实现 |
Modality Worklist、Image Store 等 |
三、各层通讯流程详解
1. ACSE – 建立连接和协商参数
- 目的: 类似“握手”,保证双方都支持相同的 SOP Class 和传输语法。
- 主要操作: A-ASSOCIATE 请求/响应。
- 双方角色:
- SCU(Service Class User)——客户端,一般是 Modalities(如 CT、MR);
- SCP(Service Class Provider)——服务端,一般是 RIS、PACS 系统。
🔁 示例流程:
Modality(SCU) ---- A-ASSOCIATE-REQUEST ----> RIS/PACS(SCP)
<---- A-ASSOCIATE-ACCEPT ----
2. DIMSE – 封装命令与数据
- DIMSE-C(Command)服务:
C-ECHO
:测试网络连通性;
C-FIND
:查找 Worklist;
C-STORE
:存储影像;
- DIMSE-N(Normalized)服务:
- 如 N-CREATE, N-SET,多用于打印、影像挂接等场景。
📌 这些命令都是通过 P-DATA 传输的,一次 DICOM 命令可能包含多个数据块(PDUs)。
3. 服务类:Modality Worklist 实际通讯流程
Modality Worklist(MWL)服务帮助 Modalities 自动获取病人检查信息,避免人工输入。
🧭 实际通讯步骤如下:
步骤 |
通讯方向 |
操作 |
协议层 |
说明 |
1 |
Modality → RIS |
A-ASSOCIATE |
ACSE |
连接并协商 SOP Class 和传输语法 |
2 |
Modality → RIS |
C-FIND 请求 |
DIMSE |
提交查询条件(如 Scheduled Station AE Title) |
3 |
RIS → Modality |
C-FIND 响应 |
DIMSE |
返回匹配的 Worklist 项(可能多条) |
4 |
Modality → RIS |
A-RELEASE |
ACSE |
释放连接 |
🌐 查询参数举例(Worklist C-FIND 请求 DataSet)
属性标签 |
属性名称 |
说明 |
示例 |
(0008,0050) |
Accession Number |
检查号 |
20240401-01 |
(0010,0020) |
Patient ID |
病人ID |
123456 |
(0010,0010) |
Patient Name |
病人姓名 |
张三 |
(0040,0100) |
Scheduled Procedure Step Sequence |
计划检查步骤 |
包含影像类型、时间等信息 |
四、现实系统中的典型场景(示意图)
+-----------+ +-------------+
| Modalities| <--C-FIND--| Worklist SCP|
| (CT/MR) | --C-FIND--> | (如RIS) |
+-----------+ +-------------+
\ ^
\-C-STORE 影像--------/
\--> PACS 存储服务器
🧠 总结知识点(结构化回顾)
层级 |
关键术语 |
说明 |
举例 |
ACSE |
A-ASSOCIATE, A-RELEASE, A-RJ |
建立/释放会话连接 |
连接 RIS/PACS |
DIMSE |
C-FIND, C-STORE, C-ECHO |
封装 DICOM 操作指令 |
查询 Worklist、发送影像 |
服务类 |
Worklist, Storage 等 |
提供具体 DICOM 服务 |
自动查询病人信息、影像归档 |
🌐模块一 DICOM 通讯分层机制简明解析
DICOM 通讯协议遵循类似于 TCP/IP 的分层架构,其核心通信流程由以下三层构成:
🔷 1. ACSE(Association Control Service Element)
负责 建立、确认、拒绝或释放会话连接
✅ 功能:
- 完成 SCU(客户端) 与 SCP(服务器)之间的会话建立和协商
- 协议协商内容:SOP Class、传输语法、AE Title 等
📦 ACSE 层常见 PDU(协议数据单元)类型:
PDU 类型 |
含义 |
功能说明 |
A-ASSOCIATE-RQ |
请求建立连接 |
SCU 发起连接请求 |
A-ASSOCIATE-AC |
接受连接 |
SCP 接受并返回 |
A-ASSOCIATE-RJ |
拒绝连接 |
SCP 拒绝连接请求 |
A-RELEASE-RQ / RP |
释放连接 |
通讯结束时使用 |
P-DATA-TF |
传输数据 |
封装 DICOM 命令与数据(传入 DIMSE 层) |
🔷 2. DIMSE(DICOM Message Service Element)
处理 DICOM 命令、响应和数据,如查询、存储、回声测试等
✅ 功能:
- 接收 ACSE 层传入的
P-DATA
PDU;
- 解包获取 DIMSE 命令:如
C-ECHO
、C-FIND
、C-STORE
等;
- 执行 DICOM 服务操作,封装响应回传。
📌 数据识别关键:
📍若接收到的第一个字节为 0x04
(十进制 4),则代表该 PDU 类型为 P-DATA-TF
,表明数据需进入 DIMSE 层进一步处理。
🔷 3. DICOM 服务类(以 Worklist 为例)
通过 DIMSE 封装的服务,提供真实的医疗影像业务能力,例如病人信息查询、影像传输等。
✅ Worklist 示例(Modality Worklist):
- 基于 DIMSE 层的
C-FIND
命令;
- 查询参数包括病人姓名、检查日期、检查类型等;
- 返回结果包含待检查病人的详细信息,供 Modalities 自动填充。
你的分析很精准,抓住了 DICOM 协议中从 ACSE 到 DIMSE 的过渡细节。下面我将对你这段内容进行条理清晰的结构化分析,并补充:
- PDU → PDV → DIMSE Command/DataSet 的转换流程图解
- DIMSE 服务组(11种服务)全部列出并说明作用
- PDV Flags 字节说明表格
🔄 模块二 DICOM 通讯处理流程:PDU → PDV → DIMSE
当 ACSE 层接收到 PDU 且其类型为 0x04(P-DATA-TF) 时,进入以下处理流程:
PDU(P-DATA-TF)
↓
剥离 PDU Header
↓
分解为一个或多个 PDV(Presentation Data Value)
↓
每个 PDV 包含:
- Presentation Context ID(表示关联 SOP Class)
- PDV Header Flags(标识 Command/Data Set 及是否结束)
- PDV 内容(真正的数据)
↓
根据 Flags 判断:
- 是 Command 还是 Data Set
- 是否已完成该 PDV 单元
↓
交由 DIMSE 层解析并执行服务操作(如 C-FIND、C-STORE)
🧱 DIMSE 层完整服务列表(11种)
DIMSE(DICOM Message Service Element)定义了 11种服务原语,包括命令和响应,分为两类:
1️⃣ DIMSE-C 服务(基于 Composite 信息对象,最常用)
服务名 |
操作代码 |
用途说明 |
C-ECHO |
0x0030 |
测试 DICOM 通讯连通性 |
C-FIND |
0x0020 |
执行查询操作(如 Worklist 查询) |
C-GET |
0x0010 |
从 SCP 获取数据(图像等) |
C-MOVE |
0x0021 |
将数据从 SCP 推送到其他 AE |
C-STORE |
0x0001 |
向 PACS 服务器存储图像或其他实例 |
2️⃣ DIMSE-N 服务(基于 Normalized 信息对象,主要用于打印管理等)
服务名 |
操作代码 |
用途说明 |
N-EVENT-REPORT |
0x0100 |
报告事件(如打印完成) |
N-GET |
0x0110 |
获取属性信息 |
N-SET |
0x0120 |
设置属性(如修改打印参数) |
N-ACTION |
0x0130 |
请求操作(如开始打印) |
N-CREATE |
0x0140 |
创建对象(如打印作业) |
N-DELETE |
0x0150 |
删除对象 |
🧾 PDV Header Flags 字节说明
每个 PDV(Presentation Data Value) 的头部包含一个 Flags 字节(1字节),用于指示数据性质:
位 |
含义 |
值为 1 时 |
备注 |
bit 0 |
命令/数据集标识 |
表示这是一个命令(Command);为0则为数据集(Data Set) |
|
bit 1 |
最后一个片段标识 |
表示这是该 PDV 的最后一个片段 |
PDV 可能被分片 |
bit 2-7 |
保留 |
固定为0 |
未来扩展位 |
示例:
Flags 十六进制 |
说明 |
0x01 |
命令,未结束(中间片段) |
0x03 |
命令,最后片段 |
0x00 |
数据集,未结束 |
0x02 |
数据集,最后片段 |
🎯 完整结构梳理
层级 |
数据类型 |
说明 |
PDU 层(ACSE) |
P-DATA-TF |
类型值为 0x04,承载 PDV |
表示层(PDV) |
Flags + 数据 |
表示是否是命令、数据及是否最后片段 |
DIMSE 层 |
命令/数据集 |
解析 PDV 后进入执行(如 C-FIND 查询) |
每个 DIMSE 服务对应的典型 SOP Class UID(服务对象类唯一标识符) 和实际应用场景。我们将从 DIMSE-C 和 DIMSE-N 两大类出发,列成表格。
🧱 模块三 DIMSE-C 服务类:SOP Class UID & 典型场景
DIMSE 命令 |
SOP Class 名称 |
SOP Class UID |
应用场景 |
C-ECHO |
Verification SOP Class |
1.2.840.10008.1.1 |
检查 DICOM 节点联通性(Ping 测试) |
C-FIND |
Modality Worklist Information Model – FIND |
1.2.840.10008.5.1.4.31 |
Modalities 查询待检病人信息(从 RIS) |
C-FIND |
Patient Root Query/Retrieve Information Model – FIND |
1.2.840.10008.5.1.4.1.2.1.1 |
PACS 查询病人级别影像信息 |
C-FIND |
Study Root Query/Retrieve Information Model – FIND |
1.2.840.10008.5.1.4.1.2.2.1 |
PACS 查询检查级影像信息 |
C-MOVE |
Study Root Query/Retrieve Information Model – MOVE |
1.2.840.10008.5.1.4.1.2.2.2 |
从 PACS 将图像“推送”到目标 AE |
C-GET |
Study Root Query/Retrieve Information Model – GET |
1.2.840.10008.5.1.4.1.2.2.3 |
客户端主动“拉取”图像 |
C-STORE |
CT Image Storage |
1.2.840.10008.5.1.4.1.1.2 |
CT 图像发送至 PACS |
C-STORE |
MR Image Storage |
1.2.840.10008.5.1.4.1.1.4 |
MR 图像发送至 PACS |
C-STORE |
Secondary Capture Image Storage |
1.2.840.10008.5.1.4.1.1.7 |
屏幕截图或再处理图像存储 |
📝 说明:
C-FIND
与 C-MOVE
、C-GET
对应的 SOP Class UID 会根据查询层级(Patient/Study/Image)变化;
C-STORE
的 SOP Class UID 会根据图像类型变化(CT、MR、US、CR 等);
- 有超过百种 SOP Class UID,但常用如上所列。
🧱 DIMSE-N 服务类:SOP Class UID & 典型场景
DIMSE 命令 |
SOP Class 名称 |
SOP Class UID |
应用场景 |
N-CREATE / N-SET / N-ACTION |
Basic Film Session |
1.2.840.10008.5.1.1.1 |
打印系统:创建打印会话 |
N-CREATE / N-SET |
Basic Film Box |
1.2.840.10008.5.1.1.2 |
打印系统:设置打印页布局 |
N-CREATE / N-SET |
Basic Grayscale Image Box |
1.2.840.10008.5.1.1.4 |
打印图像 |
N-GET / N-DELETE |
Print Job SOP Class |
1.2.840.10008.5.1.1.14 |
查询或取消打印作业 |
N-EVENT-REPORT |
Basic Film Session Event Reporting |
1.2.840.10008.5.1.1.40 |
打印完成等事件通知 |
📝 DIMSE-N 服务多用于 DICOM 打印系统(DICOM Print Management),在临床中已有 PACS 较少使用,但仍用于一些医疗影像打印服务器对接中。
🧩 补充说明:SOP Class UID 的作用
- 每个 SOP Class UID 唯一标识一种 DICOM 服务或数据模型;
- 在 ACSE 建立连接时,双方通过 A-ASSOCIATE-RQ 中的 Presentation Context 协商 SOP Class(即功能);
- 若某一端不支持该 UID,则连接请求会被拒绝或功能无法执行。
📌模块四 总结 Modality Worklist 通讯涉及的完整流程
阶段 |
协议元素 |
操作描述 |
1️⃣ 连接建立 |
A-ASSOCIATE-RQ |
SCU(模态设备)发起连接请求,协商服务(如 Worklist SOP Class)和传输语法 |
|
A-ASSOCIATE-AC |
SCP(Worklist Server)返回确认接受连接 |
2️⃣ 查询发起 |
P-DATA-TF (封装 C-FIND-RQ ) |
SCU 发送 Worklist 查询请求,封装在 P-DATA-TF 中 |
3️⃣ 查询响应 |
P-DATA-TF (封装 C-FIND-RSP ) |
SCP 多次返回查询结果(逐条或批量),每次包含状态字段 |
4️⃣ 查询结束 |
C-FIND-RSP (Status=0x0000) |
表示查询结果已全部返回,结束 |
5️⃣ 会话释放 |
A-RELEASE-RQ / A-RELEASE-RP |
通讯完成后主动释放连接 |
🔁 流程图概览(通讯交互顺序)
[SCU] [SCP]
| |
|-- A-ASSOCIATE-RQ (请求连接) -------->|
|<-- A-ASSOCIATE-AC (接受连接) --------|
| |
|-- P-DATA-TF (封装 C-FIND-RQ) ------->|
|<-- P-DATA-TF (封装 C-FIND-RSP) -----|
|<-- P-DATA-TF (封装 C-FIND-RSP) -----| 多次,返回一个或多个结果
|<-- P-DATA-TF (Status=0x0000) -------| 表示返回完毕
| |
|-- A-RELEASE-RQ --------------------->|
|<-- A-RELEASE-RP ---------------------|
🧾 关键服务元素详解
1️⃣ A-ASSOCIATE-RQ 包含协商内容:
字段 |
含义 |
Called AE Title |
接收方 AE 标识(服务器) |
Calling AE Title |
发送方 AE 标识(客户端) |
SOP Class UID |
通讯中使用的服务类(如:1.2.840.10008.5.1.4.31 ) |
Transfer Syntax |
如:Implicit VR Little Endian、Explicit VR 等 |
Presentation Context ID |
绑定 SOP Class + Transfer Syntax |
2️⃣ C-FIND-RQ 包含查询数据集(DataSet)
一个标准的 Worklist 查询参数示例:
(PatientName, PN, “DOE^JOHN”)
(ScheduledProcedureStepStartDate, DA, “20250414”)
(Modality, CS, “CT”)
3️⃣ C-FIND-RSP 包含:
字段 |
含义 |
Command Field |
C-FIND-RSP |
Status |
0xFF00(匹配项)、0x0000(完成)、其他值(错误) |
DataSet |
一项或多项匹配结果(病人、预约信息) |
🎯 四、Status 字段值说明(C-FIND-RSP)
Status 值 |
含义 |
说明 |
0xFF00 |
Pending |
匹配项返回中,后续还有结果 |
0xFF01 |
Pending |
同上(备用代码) |
0x0000 |
Success |
所有结果已返回,正常结束 |
0xA700 |
Refused |
SCP 拒绝处理请求 |
0xA900 |
Error |
请求参数错误或内部失败 |
0xCxxx |
Failed |
查询失败,具体错误由 x 标识 |
✅典型场景回顾(应用于 Modalities 自动填充)
- CT 设备启动时主动发起 Worklist 查询;
- 查询参数通常为当天日期;
- PACS 或 RIS 返回病人待检查列表;
- 技术员选择一条记录,设备自动填充病人信息;
- 完善检查项后进行采集、图像发送等操作。
📘 模块五 连接释放的作用
在 DICOM 网络通讯中,一个完整的会话由“建立 → 通讯 → 释放”三阶段构成:
阶段 |
操作 |
功能 |
建立连接 |
A-ASSOCIATE-RQ / AC |
建立 DICOM 连接 |
数据交换 |
P-DATA-TF 封装 DIMSE 命令 |
进行 C-FIND、C-STORE 等业务操作 |
释放连接 |
A-RELEASE-RQ / RP |
优雅关闭连接,释放网络和会话资源 |
📌 释放连接并不是“强制断开”,而是一种双向确认的正常断开过程。
🧱 A-RELEASE-RQ / RP 数据结构说明(简化)
A-RELEASE-RQ
(SCU 发起)
字段 |
值 |
PDU Type |
0x05 |
Reserved |
00 |
Length |
固定值 4(或0) |
Data |
空(无实际数据) |
A-RELEASE-RP
(SCP 响应)
字段 |
值 |
PDU Type |
0x06 |
Reserved |
00 |
Length |
固定值 4(或0) |
Data |
空(无实际数据) |
🔁 释放流程图(时序)
[SCU] [SCP]
| |
|-- A-RELEASE-RQ --------------------->| ← 客户端请求释放连接
|<-- A-RELEASE-RP ---------------------| ← 服务端确认释放
| |
|----> 关闭 Socket ------------------->| ← 通讯资源释放完成
🔍 为什么“释放连接”是必须的?
原因 |
描述 |
✅ 协议规范要求 |
不释放会话会被视为异常断开,影响后续通讯 |
✅ 系统资源回收 |
每个连接都占用线程、缓冲区、Socket 等资源 |
✅ 日志清晰 |
正常释放连接便于审计和问题追踪 |
❌ 反面案例 |
强制断开(如关闭Socket)可能导致远端状态不一致或挂起 |
🎯 释放连接失败的处理(异常处理建议)
场景 |
建议 |
网络中断时强制断开 |
日志记录 + 自动重连机制 |
SCP 未响应 A-RELEASE-RP |
设置超时后断开连接并释放资源 |
出现异常前未释放连接 |
加入 finally 或连接池释放机制 |
✅ 总结:释放连接在 DICOM 中的地位
- 是整个 ACSE 协议的重要组成;
- 是符合 DICOM 协议的“优雅断开”;
- 必须在 SCU 或 SCP 完成所有 DIMSE 命令操作后再发起;
- 在调试网络通讯时,如果发现连接悬挂不释放,极可能是
A-RELEASE
环节未正确处理。