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更常见。
三、关联协商:通信开始前的“谈判”
任何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通信,建议按以下顺序推进:
- 连通性验证:先用
ping和telnet确认IP和端口可达,再用C-ECHO验证DICOM层关联是否成功。 - 关联日志:查看双方A-ASSOCIATE的请求与响应,确认Presentation Context的接受情况。
- 抓包分析:使用Wireshark过滤
tcp.port==104或实际端口,观察A-ASSOCIATE-RQ/AC、P-DATA-TF中的DIMSE命令。 - 状态码判读:C-STORE返回0x0000为成功,0xB000为警告(如数据集不一致),0xA700为资源不足,0x0110为处理失败。C-FIND的0xFF00表示还有结果,0x0000表示结束。
- 传输语法核对:确认双方对同一SOP类接受的传输语法一致,必要时在配置中显式指定。
- C-MOVE专项检查:确认目标AE Title在SCP端已注册、目标端已启动C-STORE SCP、网络策略允许SCP主动连接目标端。
六、一个可参考的调试检查清单
| 检查项 | 示例值 | 判断依据 |
|---|---|---|
| 本端 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通信模块的基础。实际调试中,状态码、协商结果和双侧日志三者结合,才能快速定位问题所在。