带外数据

带外数据

使用与普通数据不同的通道独立传送给用户,是相连的每一对流套接口间一个逻辑上独立的传输通道。

简介

传输层协定使用带外数据(out-of-band,OOB)来传送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协定能够将这些数据快速地传送到对方。为了传送这些数据,协定一般不使用与普通数据相同的通道,而是使用另外的通道。linux系统的套接字机制支持低层协定传送和接受带外数据。但是TCP协定没有真正意义上的带外数据。为了传送重要协定,TCP提供了一种称为紧急模式(urgent mode)的机制。TCP协定在数据段中设定URG位,表示进入紧急模式。接收方可以对紧急模式採取特殊的处理。很容易看出来,这种方式数据不容易被阻塞,并且可以通过在我们的伺服器端程式里面捕捉SIGURG信号来及时接受数据。这正是我们所要求的效果。

由于TCP协定每次只能传送和接受带外数据一个位元组,所以,我们可以通过设定一个数组,利用传送数组下标的办法让伺服器程式能够知道自己要监听的连线埠以及要连线的伺服器IP/port。由于限定在1个位元组,所以我们最多只能控制255个port的连线,255个区域网路机器(不过同一子网的机器不会超过255J),同样也只能控制255个监听连线埠,不过这些已经足够了。

以下对于带外数据(也称为TCP紧急数据)的讨论,都是基于BSD模型而言的。用户和实现者必须注意,目前有两种互相矛盾的关于RFC 793的解释,也就是在这基础上,带外数据这一概念才被引入的。而且BSD对于带外数据的实现并没有符合RFC 1122定下的主机的要求,为了避免互操作时的问题,应用程式开发者最好不要使用带外数据,除非是与某一既成事实的服务互操作时所必须的。Windows Sockets提供者也必须提供他们的产品对于带外数据实现的语义的文档(採用BSD方式或者是RFC 1122方式)。规定一个特殊的带外数据语义集已经超出了Windows Sockets规範的讨论範围。

流套接口的抽象中包括了带外数据这一概念,带外数据是相连的每一对流套接口间一个逻辑上独立的传输通道。带外数据是独立于普通数据传送给用户的,这一抽象要求带外数据设备必须支持每一时刻至少一个带外数据讯息被可靠地传送。这一讯息可能包含至少一个位元组;并且在任何时刻仅有一个带外数据信息等候传送。对于仅支持带内数据的通讯协定来说(例如紧急数据是与普通数据在同一序列中传送的),系统通常把紧急数据从普通数据中分离出来单独存放。这就允许用户可以在顺序接收紧急数据和非顺序接收紧急数据之间作出选择(非顺序接收时可以省去快取重叠数据的麻烦)。在这种情况下,用户也可以“偷看一眼”紧急数据。

某一个应用程式也可能喜欢线内处理紧急数据,即把其作为普通数据流的一部分。这可以靠设定套接口选项中的SO_OOBINLINE来实现。在这种情况下,应用程式可能希望确定未读数据中的哪一些是“紧急”的(“紧急”这一术语通常套用于线内带外数据)。为了达到这个目的,在Windows Sockets的实现中就要在数据流保留一个逻辑记号来指出带外数据从哪一点开始传送,一个应用程式可以使用SIOCATMARK ioctlsocket()命令来确定在记号之前是否还有未读入的数据。应用程式可以使用这一记号与其对方进行重新同步。

(WSAAsyncSelect)函式可以用于处理对带外数据到来的通知。

相关词条

相关搜索

其它词条