下文中的worklist交互的测试数据,请在资源中下载,需要wireshark将文件打开,并且加入过滤条件ip.addr == 192.168.2.193 and tcp.port == 104 ,并且选择dicom协议。
1 DICOM通讯概要介绍
DICOM通讯和TCP IP的设计原理别无二致。从用户数据发送到网络上的数据的过程中,要经历多层协议处理,每经一层,就会加入用来描述当前层含义的数据字段,例如,我们熟悉的TCP层,会在用户的数据流前,加入目标端口,源端口,TCP层用来模拟链接通道的Sequence Number和Acknowlegment Number等的字段。
![](https://img-blog.csdnimg.cn/20210704195359264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
在DICOM通讯中,当数据通过TCP层后,数据流就进入了DICOM的会话层(ACSE),详细介绍可在标准第8章中。ACSE(Association Control Service Element),包含了7种类型的协议数据单元,分别是A-ASSOCIATE-RQ PDU(Protocol Data Units),A-ASSOCIATE-AC PDU,A-ASSOCIATE-RJ PDU,P-DATA-TF PDU,A-RELEASE-RQ PDU,A-RELEASE-RP PDU,A-ABORT PDU。这些服务数据单元构成了ACSE服务组。解析数据流时,当第一个字节的值是4的时候,就代表PDU是一个P-DATA类型,应当由DIMSE层来处理;相反,如果是其他值,就属于a-associate-rq, a-associate-rj, a-associate-ac, a-release-rq, a-release-rsp, a-abort6种类型PDU中的一种,直接在ACSE层内进行处理。具体的解析过程,第二章节中,以一个Modality Worklist(C-Find)的例子来介绍。
![](https://img-blog.csdnimg.cn/20210704214907693.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
当会话层接收到PDU,并且PDU的Type是4的时候,ACSE层协议,擦掉PDU头信息,将信息流变为PDVs(Presentation Data Values )后,将数据流交给表示层来解析。详细介绍,可参考第七章。在表示层DIMSE层中,提供了C-Find, C-Store, C-Move, C-Get, C-Echo, N-EVENT-REPORT, N-GET,N-SET, N-CREATE, N-DELETE, N-ACTION 11种类型的服务,这些服务成为了DIMSE服务组。
![](https://img-blog.csdnimg.cn/20210704215215267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
能标识当前PDV是什么类型,数据流中,有一个Flags标识,具体的含义见下图。DIMSE中消息由指令(Command)和数据集(Data Set)构成。
![](https://img-blog.csdnimg.cn/20210704215419900.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2 Modality Worklist通讯
![](https://img-blog.csdnimg.cn/20210704215658636.png)
2.1 A-ASSOCIATE-req
![](https://img-blog.csdnimg.cn/20210704215754239.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
首先由SCU向SCP发起建立连接建立连接请求,此过程主要是要协商是否能够提供此服务,以及在实际通讯中所使用的传输语法,传输语法主要是指显式或者隐式VR以及大小尾编码方式;从上图中可以看出,在1标记处,能看到PDU的Type是0x01,是A-ASSOCIATE-req类型的PDU;SCU的AE Title是WLY(占用16个字节),SCP的AE Title是CONQUESTSRV1(占用16个字节);之后有32个字节的保留区域不存放任何信息;
![](https://img-blog.csdnimg.cn/20210704215953863.png)
具体的字节占位,请看下图中所示:
![](https://img-blog.csdnimg.cn/20210704220052853.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.1.1 应用上下文
应用上下文,大家可以不必关注,这个只是标识DICOM通讯类型的标识,所有通讯都是一致的;下图是应用上下文的二进制的占位
![](https://img-blog.csdnimg.cn/20210704220233924.png)
具体的二级制流如下
![](https://img-blog.csdnimg.cn/20210704220326539.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.1.2 表示上下文
![](https://img-blog.csdnimg.cn/2021070422043751.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210704220513868.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.1.3 User Info
![](https://img-blog.csdnimg.cn/20210704220554700.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
通过对request的分析后,后续的PDU将只针对内部关键的信息进行说明。
2.2 A-ASSOCIATE-ac
![](https://img-blog.csdnimg.cn/20210704220658931.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.3 P-DATA-TF PDU (C-FIND-RQ)
SCU发送端WLY向SCP服务端CONQUESTSRV1发送C-FIND的DIMSE消息,服务端解析当前的PDU,发现其类型是0x04。那么,后续的解析工作,就将PDU的头信息去掉后,交给DIMSE层来进行处理,详细的解释见下图,其中,橘黄色2位置,表示当前的PDV是一个命令集。在命令集中,请求的Message ID是1,注意,服务方要对当前的请求进行应答,必须也要携带此Message ID,来表示应答信息是对此请求进行的响应。
![](https://img-blog.csdnimg.cn/20210704221039760.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.4 P-DATA-TF PDU (C-FIND-RSP)
![](https://img-blog.csdnimg.cn/20210704222304709.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
服务端接收到C-FIND-RQ后,将回复请求端信息。在回复命令信息中,Status是一个重要的概念,如果是Pending,表示对应客户端请求(回复数据流的Message ID Being Responsed To的值和请求端的Message ID的值相同)的回复数据流还未结束。具体的含义,可以在第4章中进行查询。下边给出Status的可能的值
![](https://img-blog.csdnimg.cn/20210704222709386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.5 P-DATA-TF PDU 服务端返回相关查询信息
![](https://img-blog.csdnimg.cn/20210704222933653.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.6 P-DATA-TF PDU ,PDV是命令集,标识对应MessageID=1的查询已结束
![](https://img-blog.csdnimg.cn/2021070422311188.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)
2.7 A-RELEASE request和 A-RELEASE response
![](https://img-blog.csdnimg.cn/20210704223226502.png)
![](https://img-blog.csdnimg.cn/20210704223308523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JlbmRhd2VpNjM2,size_16,color_FFFFFF,t_70)