TCP并未提供真正意义上的带外数据,而是紧急模式。TCP并未建立新的连接,或者使用独立的逻辑通道,而只是通过紧急模式的机制,在已有的TCP连接上传输带外数据。
发送端
TCP协议栈会为每个套接字维护一个发送端紧急模式标志和一个发送端紧急指针。一旦调用send(MSG_OOB)后,则TCP发送端进入紧急模式。此后,协议栈中的每个TCP输出操作都会为数据分段设置URG标志和紧急偏移。也即紧急模式的发送不受流量控制机制的影响。
紧急数据只有一个字节,也即send(MSG_OOB)的最后一个字节,它混在普通数据中(也即发送缓冲区),这个字节由紧急指针(大多数实现需要减1)指示。紧急数据的发送与普通数据没有任何区别,同样受流量控制的影响。只有当紧急数据真正发送出去,TCP发送端才解除紧急模式。
接收端
TCP协议栈也会为每个套接字维护一个接收端紧急模式标志和一个接收端紧急指针。一旦接收到一个URG标志的数据分段,则TCP接收端会开启此接收端紧急模式标志,并保存接收端紧急指针,并且此刻,其将通知接收进程(发送信号SIGURG,或者给阻塞的