3. DICOM通信与服务

DICOM网络通信是医学影像工作站与PACS、RIS、影像设备之间交换数据的核心机制。理解它,不能只停留在“发送和接收图像”这一层,而要看清一条完整的通信链路上,谁发起、谁响应、协商了什么、传了什么、结果如何确认。本节围绕DIMSE服务、关联协商、SCP/SCU角色以及实际网络调试展开。

一、DIMSE:DICOM消息服务的语义

DIMSE(DICOM Message Service Element)定义了在已建立关联的两个DICOM应用实体之间交换消息的规则。它分为两类:一类是带确认的操作(如C-STORE、C-FIND、C-MOVE、C-GET),另一类是通知类操作(如C-ECHO用于连通性验证)。每个DIMSE消息都包含命令集和可选的数据集,命令集描述“做什么”,数据集承载“具体内容”。

需要区分两个层次:DIMSE是消息层语义,而DIMSE-C(复合服务)和DIMSE-N(规范化服务)是它的两个分支。影像工作站的日常交互几乎都落在DIMSE-C上,即围绕SOP实例和SOP类的复合对象操作。

二、四个核心服务:C-STORE、C-FIND、C-MOVE、C-GET

C-STORE用于把SOP实例(如CT图像、MR图像、SR结构化报告)推送到对端。SCU发送C-STORE-RQ,携带SOP类UID、SOP实例UID和数据集;SCP接收后返回C-STORE-RSP,状态码0x0000表示成功,0xB000/0xB006等表示警告,0xA7xx表示资源不足,0x0110等表示处理失败。工作站发送图像时,通常按Study/Series/Instance层级逐张发送,并依据对端返回状态决定是否重传。

C-FIND用于查询。SCU发出C-FIND-RQ,指定查询模型(Patient/Study/Series/Image/Composite)和查询键(Query Keys),SCP返回若干C-FIND-RSP,状态0xFF00表示“还有匹配项”,0x0000表示查询结束。查询键分匹配键和返回键,匹配方式包括单值匹配、通配符匹配、范围匹配和序列匹配。例如按检查日期范围查询:(0008,0020)=20240101-20240131。

C-MOVE用于“让对端把数据发到第三方”。SCU向SCP发出C-MOVE-RQ,指定目标AE Title,SCP负责把匹配的实例通过C-STORE推送到目标AE。C-MOVE的响应只表示“请求已受理并完成调度”,并不等于数据已成功到达目标,因此实际调试中必须结合目标端的接收日志判断。

C-GET与C-MOVE类似,但数据直接回传到发起方所在的同一关联上,不需要第三方AE。它适合工作站主动拉取数据,但要求双方在同一关联内同时具备SCP和SCU能力,实现复杂度更高,实际部署中C-MOVE更常见。

DICOM 关联协商与 DIMSE 服务交互 SCU(服务使用者) 影像工作站 / 发起方 AE Title: WORKSTATION SCP(服务提供者) PACS / 接收方 AE Title: PACS_SERVER 关联协商 A-ASSOCIATE Presentation Context:SOP类 + 传输语法 结果:Accept / Reject / 协商子集 DIMSE-C 服务交互 C-STORE 推送SOP实例 RQ → RSP 状态: 0x0000成功 C-FIND 查询匹配项 Query Keys 0xFF00 / 0x0000 C-MOVE 第三方转发 指定目标AE SCP→目标C-STORE C-GET 同关联回传 无需第三方AE SCU兼SCP能力 网络调试要点: 1. 用 C-ECHO 验证关联与连通性;2. 检查 AE Title、IP、端口、Presentation Context 是否匹配; 3. 抓包观察 A-ASSOCIATE 协商结果与 PDU 类型;4. 核对传输语法(Implicit/Explicit VR、JPEG 等); 5. C-MOVE 需确认目标端接收日志,不能只看响应状态。

三、关联协商:通信开始前的“谈判”

任何DIMSE服务都必须先建立关联。SCU发送A-ASSOCIATE-RQ,其中包含:调用的AE Title、被调用的AE Title、应用上下文、以及一组Presentation Context。每个Presentation Context由抽象语法(SOP类UID)和传输语法(编码方式)组成。SCP在A-ASSOCIATE-AC中逐条回应接受或拒绝,并可能只接受部分传输语法。

协商失败最常见的原因有三类:AE Title不匹配、SOP类不支持、传输语法不支持。例如工作站请求1.2.840.10008.5.1.4.1.1.2(CT图像存储)并使用JPEG Baseline传输语法,而PACS只接受Implicit VR Little Endian,则协商结果会拒绝该上下文,后续C-STORE无法执行。调试时应优先确认双方支持的SOP类和传输语法列表。

四、SCP/SCU角色:不是固定身份

SCU和SCP是相对角色,不是设备类型。同一台工作站,在发送图像时是C-STORE的SCU,在接收查询请求时又可能是C-FIND的SCP。配置时必须明确每个服务方向上的角色。例如:

  • 工作站 → PACS:C-STORE(工作站为SCU,PACS为SCP)
  • 工作站 → PACS:C-FIND(工作站为SCU,PACS为SCP)
  • PACS → 工作站:C-STORE(PACS为SCU,工作站为SCP)
  • 工作站 → PACS:C-MOVE(工作站为SCU,PACS为SCP,目标AE为另一台工作站)

角色配置错误会导致“关联建立成功但服务被拒绝”的现象,例如把C-FIND的SCP端口配成了只支持C-STORE的端口。

五、网络调试的实操方法

调试DICOM通信,建议按以下顺序推进:

  1. 连通性验证:先用ping和telnet确认IP和端口可达,再用C-ECHO验证DICOM层关联是否成功。
  2. 关联日志:查看双方A-ASSOCIATE的请求与响应,确认Presentation Context的接受情况。
  3. 抓包分析:使用Wireshark过滤tcp.port==104或实际端口,观察A-ASSOCIATE-RQ/AC、P-DATA-TF中的DIMSE命令。
  4. 状态码判读:C-STORE返回0x0000为成功,0xB000为警告(如数据集不一致),0xA700为资源不足,0x0110为处理失败。C-FIND的0xFF00表示还有结果,0x0000表示结束。
  5. 传输语法核对:确认双方对同一SOP类接受的传输语法一致,必要时在配置中显式指定。
  6. C-MOVE专项检查:确认目标AE Title在SCP端已注册、目标端已启动C-STORE SCP、网络策略允许SCP主动连接目标端。
调试时建议同时打开SCU和SCP两侧日志,并记录每次关联的AE Title、Presentation Context、DIMSE命令类型和状态码。仅凭单侧日志往往无法判断是协商失败、传输失败还是目标端未接收。
C-MOVE的响应状态只表示“请求已被受理”,并不保证数据已成功送达目标AE。实际排障中必须结合目标端的C-STORE接收日志和存储结果进行判断,否则容易误判为成功。

六、一个可参考的调试检查清单

检查项 示例值 判断依据
本端 AE Title WORKSTATION 与对端配置一致
对端 AE Title PACS_SERVER 与对端配置一致
IP / 端口 192.168.1.50:104 telnet 可达
SOP 类 CT Image Storage 1.2.840.10008.5.1.4.1.1.2 协商被接受
传输语法 Implicit VR Little Endian 1.2.840.10008.1.2 双方均支持
C-ECHO 结果 0x0000 关联与服务正常
C-STORE 状态 0x0000 实例接收成功
C-MOVE 目标端日志 收到 N 个实例 与请求数量一致

掌握DIMSE各服务的语义、关联协商的细节以及SCU/SCP角色的相对性,是开发稳定DICOM通信模块的基础。实际调试中,状态码、协商结果和双侧日志三者结合,才能快速定位问题所在。