使命必达: 深入剖析WCF的可靠会话[概念篇]

在《实例篇》中,我通过可靠会话成功地进行了美女图片的传输,相信大家在保了眼福之余,会对WCF的可靠会话的功用具有一个深刻的认识。实际上,这涉及到WS中一个重要的概念——可靠消息传输(RM:Reliable Messaging)。如果想对可靠会话有一个深入的认识,对可靠消息传输的了解是必须的。

一、可靠消息传输(Reliable Messaging)

我们可以将一个通过WCF构建的分布式应用划分为两个部分,即客户端应用和服务端应用,它们之间的交互方式即采用某种MEP的消息交换。在这里,我们需要通过可靠消息传输机制确保从客户端应用(或者服务端应用)发送的消息能够成功地被服务端应用(或者客户端应用)接收。也就是说,可靠消息传输提供的是一种端到端的消息传输确保机制,而不管两个终端之间是否具有相应的中间结点(Intermediary),比如路由器、防火墙和代理之类。除了确保对消息的可靠交付,可靠消息传输还需要解决以下两个问题:

  • 重复消息(Duplicate Message):对于某一个客户端发出的消息,服务端接收到两个以上相同的副本。可靠消息传输机制需要具有对重复消息的识别能力;
  • 无序交付(Disordered Delivery):服务端接收到的消息序列与消息发送序列不一致。在某些情况下,我们要求WCF服务端框架严格按照消息在客户端应用中被发送的顺序交付给服务端应用,这需要消息传输机制提供有序消息交付(Ordered Message Delivery)的功能。

说道这里,可能有的读者对可靠消息传输机制有一种是曾相识之感,是不是觉得这个TCP协议对于TCP报文段(TCP Segment)的可靠交付机制有点类似。

二、TCP对报文段(Segment)的可靠交付机制

稍微有点网络知识的读者应该都知道,IP协议是TCP/IP协议簇中最为核心的协议。对于协议分层(链路层、网络层、传输层和应用层)体系中,属于网络层协议。所有的TCP、UPD、ICMP以及IGMP协议均是建立在IP协议之上。

IP协议传输的数据单位是数据报(Datagram),数据报的首部(一般20个字节)包含有源和目标的IP地址以及其他的相应的寻址和控制信息。IP协议具有以下两个显著的特点:

  • 不可靠(Unreliable): IP协议只能尽可能提供最好的传输服务,但不能保证数据报能够成功地抵达目的地。如果发生某种错误,它有一个简单的错误处理算法:丢弃数据报,然后发送通知信息给发送端;
  • 无连接(Connectionless):IP协议并不维护任何关于后续数据报的状态信息,每一个数据报都是被独立处理的。

而作为传输层的TCP协议,众所周知,这是一个可靠的、基于连接的协议。TCP协议传输的数据单位被称为报文段(Segment),可靠的TCP协议能够确保发出的报文段能够成功地抵达目的地。那么,建立在不可靠的IP协议上的TCP协议是如何实现报文段的可靠交付的呢?大体上说,下面两种机制取保了TCP协议对“使命必达”的承诺:

  • 消息确认(Message Acknowledgement):当接收端TCP成功接收到TCP报文段之后,会在一个短暂的时间间隔内(并不是在成功接收到报文的那一刻),向发送端发送一个表明该报文段已经被成功接收确认消息(Acknowledgement);
  • 超时重传:发送端具有一个存储报文段的缓冲区(Buffer),我们一般称为发送端窗口(Sender Window),用于存放已经发送但是尚未接受到确认的报文段。如果接收到确认,会将相应的报文段从发送端窗口中移除。如果在一定的超时时限内没有接收到确认消息,会认为相应的报文段发送失败,此时发送端TCP会从发送端窗口中提取相应的报文段进行重新发送。

对于上述的消息确认和超时重传的机制,细心的读者会发现这会出现两个问题:如果接收端TCP成功接收到某个报文段,并且成功发送了确认。但是,如果确认消息丢失,发送端TCP会对相应的报文段进行重传,就意味着接收端有可能接收到两份重复的报文段。很显然,接收端TCP不能将重复的报文段向上层交付,那么如何解决重复报文段的问题呢?

第二个问题,报文段在发送端TCP发送的节奏和在接收端TCP被接收的节奏是不同的,所以不可能保证报文段完全以发送的顺序被接收。但是,接收端TCP必须保证交付给上层的报文段的顺序必须是报文段被发送的顺序,这又是如何做到的呢?

要解决上述的两个问题,首先需要解决的是对报文段的识别机制。对于TCP协议来说,每一个报文段具有一个序号,一般代表报文段承载的数据在整个发送的数据块所处的位置(以字节为单位),通过这个序列号就可以确定报文段发送的顺序。此外,除了发送端TCP具有一个发送端窗口外,接收端TCP同样具有自己的接收端窗口,用于存放已经接收当时尚未交付的报文段如果说具有大序列号的报文段被先接收到,会先被置于接收端窗口中,只有等到前面的所有的报文段都抵达之后,接收端TCP才会按照序列号的顺序依次对报文段实施交付如果接收到的报文段的序列化小于或者等于接收端窗口的任一个报文段的序列化,接收端TCP会将其作为重复报文段而丢弃

从上面的介绍我们可以看出,TCP协议已经解决了我们之前提出关于可靠消息传输的三个难题:消息的可靠交付重复消息处理有序交付。实际上,WCF基于可靠会话机制的可靠消息传输的实现原理和TCP协议基本一致,如果硬是要找出不一致的地方,主要表现在以下四点:

  • WCF可靠消息传输是基于SOAP消息级别的,TCP则是基于报文段级别;
  • WCF可靠消息传输是与传输协议无关的,并不限于TCP协议;
  • WCF的可靠消息传输并没有具体传输会话(Transport Session)的限制,可以跨越多个传输连接或者会话;
  • TCP在当前TCP连接范围内提供端到端的可靠传输,而WCF的可靠消息传输在两个SOAP终结点之间提供可靠传输,并不受传输连接(Transport Connection)的限制

由于可靠消息传输对于SOA的重要性,在WS-*体系中具有专门的规范,即我们即将介绍的WS-Reliable Messaging,简称WS-RM。在《协议篇》中我将对WS-RM进行详细的介绍。

你可能感兴趣的:(使命必达: 深入剖析WCF的可靠会话[概念篇])