背景:
从DICOM网络传输一文开始,相继介绍了C-ECHO、C-FIND、C-STORE、C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只有一个:基于C#的fo-dicom库具有高封装性。对于初学者来说实现大多数的DIMSE-C、DIMSE-N服务几乎都是“傻瓜式”操作——构造C-XXX-RQ、N-XXX-RQ然后绑定相应的OnResponseReceived处理函数即可。本博文希望在前几篇预热的基础上,对比DCMTK、fo-dicom、mDCM三种库构建DIMSE消息的具体操作,来分析一下三者对于DIMSE消息的发送和接收的实现,为后续搭建简易版的Dicom Server服务器做准备。
DIMSE:
DIMSE,是DICOM Message Service Element的简称。DICOM3.0第7部分指出:DIMSE为对等DICOM应用实体进行医学影像及相关信息交换提供了一种应用服务元素定义(Application Service Element),包括服务和协议(DIMSE Service 和DIMSE Protocol)。
DIMSE Protocol:
DIMSE基于DIMSE协议来提供服务,DIMSE协议规定了构造消息必需的编码规则。一条DICOM MESSAGE由固定的指令集合(Command Set),外加可选择的数据集合(Data Set)构成,如下截图所示:
可以简单的理解为Command Set就是本博文即将要介绍的各种服务的请求和应答消息;而Data Set可以认为类似于DCM后缀的文件,是我们希望在对等DICOM实体间进行传输的信息。但是从本质上来说Command Set和Data Set两者都遵循DICOM3.0协议中IOD的定义,都是“以(Group Number,Element Number)对”来进行标记的Data Element元素的集合,更形象一点的说明可参考早期的博文(http://blog.csdn.net/zssureqh/article/details/9275271)。
DIMSE Protocol指出Message可能会分片(fragmented,这与传统的TCP/IP中的概念类似),消息的具体传输是基于ASSOCIATE(DICOM3.0第8部分)中的P-DATA Service(博文http://blog.csdn.net/zssureqh/article/details/41016091中有介绍)。
DIMSE Services:
DIMSE服务因操作SOP类型的不同分为DIMSE-C Services和DIMSE-N Services,DIMSE-C服务支持在对等DICOM实体间进行Composite SOP Instance操作,主要包括C-ECHO、C-FIND、C-STORE、C-MOVE、C-GET等;而DIMSE-N服务支持Normalized SOP Instance操作,主要包括N-EVENT-REPORT、N-GET、N-SET、N-CREATE、N-ACTION、N-DELETE。
从上图可以看出DIMSE-C服务只提供操作服务,即对等DICOM实体一方请求另一方对Composite SOP Instance进行操作(operation);而DIMSE-N服务除了提供操作以外,还提供通知(notification)服务。DIMSE中的所有操作和通知都是确认服务(confirmed services),即一方发出的请求都需要得到对方的应答(原文:All DIMSE operations and notifications are confirmed services. The performing DIMSE-service-user shall report the response of each operation or notificationover the same Association on which the operation or notification was invoked.)。每种服务具体方式不同,例如某些操作可能会触发后续的子操作、某些操作可能需要多个响应等等,如下图: