UNIX网络编程——带外数据小结
TCP没有真正的带外数据,不过提供紧急模式和紧急指针。一旦发送端进入紧急模式,紧急指针就出现在发送到对端的分节中的TCP首部中。连接的对端收取该指针是在告知接收进程发送端已经进入紧急模式,而且该指针指向紧急数据的最后一个字节。然而所有数据的发送仍然受TCP正常的流量控制支配。
套接字API把TCP的紧急模式映射成所谓的带外数据。发送进程通过指定MSG_OOB标志调用send让发送端进入紧急模式。该调用中的最后一个字节的数据被认为是带外字节。接收端TCP收到新的紧急指针后,或者通过发送SIGURG信号,或者通过由select返回套接字有异常条件待处理的指示,让接收进程得以通知。默认情况下,接收端TCP把带外字节从普通数据流中取出存放到自己的单字节带外缓冲区,供接收进程通过指定MSG_OOB标志调用recv读取。接收进程也可以开启SO_OOBINLINE套接字选项,这种情况下,带外字节被留在普通数据流中。不管接收进程使用哪种方法读取带外字节,套接字层都在数据流中维护一个带外标记,并且不允许单个输入操作读过这个标记。接收进程通过调用sockatmark函数确定它是否已经到达该标记。
带外数据未被广泛的使用。telnet和rlogin使用它,FTP也使用它,他们使用带外数据时为了通知远端有异常情况(如客户中断)发生,而且服务器丢弃带外标记前接收的所有输入。