关于OOB模式的一些解释
日期:2011-08-01 阅读:78 分类:综合信息
传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道.linux系统的套接字机制支持低层协议发送和接受带外数据.但是TCP协议没有真正意义上的带外数据.为了发送重要协议,TCP提供了一种称为紧急模式(urgent
mode)的机制.TCP协议在数据段中设置URG位,表示进入紧急模式.接收方可以对紧急模式采取特殊的处理.很容易看出来,这种方式数据不容易被阻塞,可以通过在我们的服务器端程序里面捕捉SIGURG信号来及时接受数据或者使用带OOB标志的recv函数来接受.
1.OOB的术语说明
OOB有几个重要的术语:
紧急模式:TCP协议使用紧急模式来实现带外数据通道,进入紧急模式后,TCP发送的每个数据包都包含URG标志和16位URG指针。
带外字节-由紧急指针-1说明序号所代表的字节,它指明了带外数据的最后一个字节
带外标记-是指为实现紧急模式,TCP需要根据数据包起始序号和紧急指针计算紧急数据的最后一个字节的序号,称为带外标记。需要说明的是,如果接收端TCP 在收到一个新的带外标记后,会覆盖旧的带外标记。如果设置了OOBINLINE选项,该标记的数据并不会被覆盖掉,会被当作normal数据提交给用户。
2.OOB数据的发送
用户使用发送函数将紧急数据发送到发送缓冲中,这时TCP进入紧急模式,它发送的每个数据包都包含URG标志和16位URG指针,直到把这个紧急数据发送出去。
发送时需要记录发送带外数据的范围,两次相邻的带外数据发送将会被合并为一次发送。
3.OOB数据的接收
接收端TCP在接收到URG标志和不为零的URG指针,并确认是新的紧急指针后,进入紧急模式,直到跨过带外标记为止。进入紧急模式后,需要计算带外标记,然后通知用户,现在进入紧急模式,用户可以去读取带外数据。虽然现在用户并不一定能够读取到带外数据,但是它的主要作用是通知用户现在进入紧急模式。
(1) 如果没有设置OOBINLINE选项(缺省模式),带外字节使用自己的一字节缓冲存储带外字节。用户必须调用recv函数并指明MSG_OOB标志来接收这个带外字节。对于winsock,必须使用两个read操作来读取数据,第一个操作返回带外标记之前的数据,第二个操作返回带外标记之后的数据。
(2) 如果设置了OOBINLINE选项,带外字节被当作是normal数据,如果使用指明了MSG_OOB标志的recv函数来接收OOB数据,会返回 WSAEINVAL错误。读操作要根据依据带外标记进行。每个读操作都不能把normal数据和紧急数据混合提交给用户,所以需要使用三个read操作来越过带外标记:第一个read操作把带外标记前的数据返回给用户,第二个read操作把带外字节返回给用户,第三个read操作返回带外字节后面的字节给用户,TCP进入正常模式。
4.OOB数据的用户通知方式
(1)如果socket没有设置OOBINLINE选项,只要OOB数据没有被用户获取,那么在用户调用select系统调用的时候,该socket句柄都会出现在except集合中,通知用户使用带有MSG_OOB标志的recv函数接收OOB数据。
(2) 如果socket设置OOBINLINE选项,这时的OOB数据被当作normal数据,用户调用select函数,该socket句柄会出现在read 集合中,通知用户使用没有MSG_OOB标志的recv调用进行读取。如果用户强制使用带MSG_OOB标志的recv读取,会返回WSAEINVAL的错误。要想判断何时读取带外字节需要调用ioctlsocket函数,该函数的SIOCATMARK命令,在没有带外数据可以读取的情况下返回真,否则返回假。
5.OOB数据的使用
OOB数据的用处取决于应用程序使用它的目的。如果目的是告诉对方忽略直到标记的普通数据,那么丢失一个中间的带外字节和相应的标记就不太重要。但是如果不丢失带外数据很重要,那么数据就必须在线接收,而且作为带外数据发送的数据字节应该于普通数据不同,因为中间的标记会被新到的标记覆盖,将带外数据和普通数据混在一起。
6.工程实践
通过对winsock的试验,发现下面的OOB传输规则,他们是对协议的一种实现方法。
(1)如果待发送数据可以与紧跟着的OOB数据合并为小于一个segment的包,那么可以把他们作为一个包一起发送
(2)如果两个OOB数据相邻,那么通常他们都合并发送,如果合并后超过一个包的大小,那么把他们分成两个包发送
(3)OOB数据不可分割,只可能出现normal数据块+OOB数据块(整个数据块可以作为多个包发送,但也只能是normal+OOB+OOB+...),不可能出现OOB+normal的情况
1.OOB的术语说明
OOB有几个重要的术语:
紧急模式:TCP协议使用紧急模式来实现带外数据通道,进入紧急模式后,TCP发送的每个数据包都包含URG标志和16位URG指针。
带外字节-由紧急指针-1说明序号所代表的字节,它指明了带外数据的最后一个字节
带外标记-是指为实现紧急模式,TCP需要根据数据包起始序号和紧急指针计算紧急数据的最后一个字节的序号,称为带外标记。需要说明的是,如果接收端TCP 在收到一个新的带外标记后,会覆盖旧的带外标记。如果设置了OOBINLINE选项,该标记的数据并不会被覆盖掉,会被当作normal数据提交给用户。
2.OOB数据的发送
用户使用发送函数将紧急数据发送到发送缓冲中,这时TCP进入紧急模式,它发送的每个数据包都包含URG标志和16位URG指针,直到把这个紧急数据发送出去。
发送时需要记录发送带外数据的范围,两次相邻的带外数据发送将会被合并为一次发送。
3.OOB数据的接收
接收端TCP在接收到URG标志和不为零的URG指针,并确认是新的紧急指针后,进入紧急模式,直到跨过带外标记为止。进入紧急模式后,需要计算带外标记,然后通知用户,现在进入紧急模式,用户可以去读取带外数据。虽然现在用户并不一定能够读取到带外数据,但是它的主要作用是通知用户现在进入紧急模式。
(1) 如果没有设置OOBINLINE选项(缺省模式),带外字节使用自己的一字节缓冲存储带外字节。用户必须调用recv函数并指明MSG_OOB标志来接收这个带外字节。对于winsock,必须使用两个read操作来读取数据,第一个操作返回带外标记之前的数据,第二个操作返回带外标记之后的数据。
(2) 如果设置了OOBINLINE选项,带外字节被当作是normal数据,如果使用指明了MSG_OOB标志的recv函数来接收OOB数据,会返回 WSAEINVAL错误。读操作要根据依据带外标记进行。每个读操作都不能把normal数据和紧急数据混合提交给用户,所以需要使用三个read操作来越过带外标记:第一个read操作把带外标记前的数据返回给用户,第二个read操作把带外字节返回给用户,第三个read操作返回带外字节后面的字节给用户,TCP进入正常模式。
4.OOB数据的用户通知方式
(1)如果socket没有设置OOBINLINE选项,只要OOB数据没有被用户获取,那么在用户调用select系统调用的时候,该socket句柄都会出现在except集合中,通知用户使用带有MSG_OOB标志的recv函数接收OOB数据。
(2) 如果socket设置OOBINLINE选项,这时的OOB数据被当作normal数据,用户调用select函数,该socket句柄会出现在read 集合中,通知用户使用没有MSG_OOB标志的recv调用进行读取。如果用户强制使用带MSG_OOB标志的recv读取,会返回WSAEINVAL的错误。要想判断何时读取带外字节需要调用ioctlsocket函数,该函数的SIOCATMARK命令,在没有带外数据可以读取的情况下返回真,否则返回假。
5.OOB数据的使用
OOB数据的用处取决于应用程序使用它的目的。如果目的是告诉对方忽略直到标记的普通数据,那么丢失一个中间的带外字节和相应的标记就不太重要。但是如果不丢失带外数据很重要,那么数据就必须在线接收,而且作为带外数据发送的数据字节应该于普通数据不同,因为中间的标记会被新到的标记覆盖,将带外数据和普通数据混在一起。
6.工程实践
通过对winsock的试验,发现下面的OOB传输规则,他们是对协议的一种实现方法。
(1)如果待发送数据可以与紧跟着的OOB数据合并为小于一个segment的包,那么可以把他们作为一个包一起发送
(2)如果两个OOB数据相邻,那么通常他们都合并发送,如果合并后超过一个包的大小,那么把他们分成两个包发送
(3)OOB数据不可分割,只可能出现normal数据块+OOB数据块(整个数据块可以作为多个包发送,但也只能是normal+OOB+OOB+...),不可能出现OOB+normal的情况
相关文章
- 用户的偏好:B/S模式 2008-07-28
- ThinkPad E30,E40将功能键切换到传统模式 2011-10-13
- 使用win7兼容性模式(虚拟xp模式) 2011-10-13
- 几种常用设计模式介绍 2011-07-16
- 浏览器的两种模式quirks 和strict 2009-02-03