当前位置:嗨网首页>书籍在线阅读

22-带外数据

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

61.13.1 带外数据

带外数据是流式套接字的一种特性,允许发送端将传送的数据标记为高优先级。也就是说,接收端不需要读取字节流中所有的中间数据就能获得有可用的带外数据的通知。这个特性在许多程序中都有用到,比如telnet、rlogin以及ftp,它们利用该特性来终止之前传送的命令。带外数据的发送和接收需要在send()和recv()中指定MSG_OOB标记。当一个套接字接收到带外数据可用的通知时,内核为套接字的属主(通常是使用该套接字的进程)生成SIGURG信号,如同fcntl()的F_SETOWN操作一样。

当采用TCP套接字时,任意时刻最多只有1字节数据可被标记为带外数据。如果在接收端处理完前一个带外数据字节之前,发送端发送了额外的带外数据,那么之前对带外数据的通知就会丢失。

TCP将带外数据限制为一个字节,这实际上是在套接字API的通用型带外模型和采用TCP紧急模式的具体实现之间的不匹配造成的。我们在61.6.1节中介绍TCP报文的格式时就接触到了TCP的紧急模式。TCP通过在首部中设定URG标志位来表示有紧急(带外)数据存在,并将紧急指针字段指向了紧急数据。但是,TCP本身没有办法指明紧急数据序列的长度,因此就认为紧急数据只由一个字节组成。 更多关于TCP紧急数据的信息可以在RFC 793中找到。

在某些UNIX实现中,UNIX域流式套接字是支持带外数据的,而Linux不支持。

现如今是不提倡使用带外数据的,在某些情况下它可能是不可靠的(参见[Gont & Yourtchenko, 2009])。另外一种方法是维护两个流式套接字用作通信。其中一个用来做普通的通信,而另一个用来做高优先级通信。应用程序可以采用 63 章中描述过的其中一种技术来同时监视这两个通道。这种方法允许让多个字节的优先级数据得到传送。此外,这种技术可以用在任何通信域的流式套接字中(比如UNIX域套接字)。