把带外数据的例子对照着《Linux高性能服务器编程》实现了下子,顺带来总结下带外数据。
带外数据
传输层使用带外数据(OOB)
来发送一些重要的数据,用于迅速通告对方本段发生的重要事件.
- 带外数据比普通数据(也称为带内数据)有更高的优先级,它应该总是立即被发送的.
- 为了发送这些数据,协议一般不使用与普通数据相同的通道而是使用另外的通道.(可以使用一跳独立的传输层链接,也可以映射到传输普通数据的连接中)
- 实际应用中,带外数据的使用很少见,已知的仅有
telnet
,FTP
等远程非活跃程序.
UDP
没有实现带外数据传输,TCP
也没有实现真正的带外数据.
TCP
只是利用其头部中的紧急指针标志和紧急指针两个字段,给应用程序提供了一种紧急方式.
由上图可知,发送端一次发送的多字节的带外数据中只能有最后一个字节被当做带外数据(字母c)
,其他数据被当做普通数据.
TCP
接收端只有在接收到紧急指针标志时才检查紧急指针,然后根据紧急指针所指的位置确定带外数据的位置,并将它读入一个特殊的缓存中,这个缓存只有一个字节,成为带外缓存.如果上层应用没有及时将带外数据从带外缓存中独处,则后续的带外缓存将覆盖它.
带外缓存的发送
利用send()
最后一个参数flag
发送带外数据.
1 |
|
接受带外数据
利用recv
中的flag
参数来接收带外数据
1 |
|
客户端连接到服务器
服务器先启动,然后客户端才连接.