在《实例篇》中,我通过可靠会话成功地进行了美女图片的传输,相信大家在保了眼福之余,会对WCF的可靠会话的功用具有一个深刻的认识。实际上,这涉及到WS中一个重要的概念——可靠消息传输(RM:Reliable Messaging)。如果想对可靠会话有一个深入的认识,对可靠消息传输的了解是必须的。
我们可以将一个通过WCF构建的分布式应用划分为两个部分,即客户端应用和服务端应用,它们之间的交互方式即采用某种MEP的消息交换。在这里,我们需要通过可靠消息传输机制确保从客户端应用(或者服务端应用)发送的消息能够成功地被服务端应用(或者客户端应用)接收。也就是说,可靠消息传输提供的是一种端到端的消息传输确保机制,而不管两个终端之间是否具有相应的中间结点(Intermediary),比如路由器、防火墙和代理之类。除了确保对消息的可靠交付,可靠消息传输还需要解决以下两个问题:
说道这里,可能有的读者对可靠消息传输机制有一种是曾相识之感,是不是觉得这个TCP协议对于TCP报文段(TCP Segment)的可靠交付机制有点类似。
稍微有点网络知识的读者应该都知道,IP协议是TCP/IP协议簇中最为核心的协议。对于协议分层(链路层、网络层、传输层和应用层)体系中,属于网络层协议。所有的TCP、UPD、ICMP以及IGMP协议均是建立在IP协议之上。
IP协议传输的数据单位是数据报(Datagram),数据报的首部(一般20个字节)包含有源和目标的IP地址以及其他的相应的寻址和控制信息。IP协议具有以下两个显著的特点:
而作为传输层的TCP协议,众所周知,这是一个可靠的、基于连接的协议。TCP协议传输的数据单位被称为报文段(Segment),可靠的TCP协议能够确保发出的报文段能够成功地抵达目的地。那么,建立在不可靠的IP协议上的TCP协议是如何实现报文段的可靠交付的呢?大体上说,下面两种机制取保了TCP协议对“使命必达”的承诺:
对于上述的消息确认和超时重传的机制,细心的读者会发现这会出现两个问题:如果接收端TCP成功接收到某个报文段,并且成功发送了确认。但是,如果确认消息丢失,发送端TCP会对相应的报文段进行重传,就意味着接收端有可能接收到两份重复的报文段。很显然,接收端TCP不能将重复的报文段向上层交付,那么如何解决重复报文段的问题呢?
第二个问题,报文段在发送端TCP发送的节奏和在接收端TCP被接收的节奏是不同的,所以不可能保证报文段完全以发送的顺序被接收。但是,接收端TCP必须保证交付给上层的报文段的顺序必须是报文段被发送的顺序,这又是如何做到的呢?
要解决上述的两个问题,首先需要解决的是对报文段的识别机制。对于TCP协议来说,每一个报文段具有一个序号,一般代表报文段承载的数据在整个发送的数据块所处的位置(以字节为单位),通过这个序列号就可以确定报文段发送的顺序。此外,除了发送端TCP具有一个发送端窗口外,接收端TCP同样具有自己的接收端窗口,用于存放已经接收当时尚未交付的报文段。如果说具有大序列号的报文段被先接收到,会先被置于接收端窗口中,只有等到前面的所有的报文段都抵达之后,接收端TCP才会按照序列号的顺序依次对报文段实施交付。如果接收到的报文段的序列化小于或者等于接收端窗口的任一个报文段的序列化,接收端TCP会将其作为重复报文段而丢弃。
从上面的介绍我们可以看出,TCP协议已经解决了我们之前提出关于可靠消息传输的三个难题:消息的可靠交付、重复消息处理和有序交付。实际上,WCF基于可靠会话机制的可靠消息传输的实现原理和TCP协议基本一致,如果硬是要找出不一致的地方,主要表现在以下四点:
由于可靠消息传输对于SOA的重要性,在WS-*体系中具有专门的规范,即我们即将介绍的WS-Reliable Messaging,简称WS-RM。在《协议篇》中我将对WS-RM进行详细的介绍。
热门源码