《网络编程》带外数据

带外数据在TCP中是一种紧急数据传递机制,常用于快速通告重要事件。虽然TCP没有真正的带外数据,但通过紧急模式和紧急指针实现类似功能。发送端通过设置MSG_OOB标志进入紧急模式,接收端可以通过异常事件或SIGURG信号得知带外数据的到来。带外数据的接收可能被放入特殊缓存或与普通数据一起存储,取决于SO_OOBINLINE选项的设置。处理带外数据时,sockatmark函数用于检查带外标记的位置。
摘要由CSDN通过智能技术生成

带外数据

        有些传输层协议具有带外(Out Of Band,OOB)数据的概念,用于迅速通告对端本端所发生的重要事件。因此,带外数据比普通数据(也称为带内数据)有更高的优先级,它应该总是立即被发送,而不论发送缓冲区中是否有排队等待发送的普通数据或因流量控制而导致发送端的通告窗口大小为 0(即停止发送数据) 。带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中。

        UDP 没有实现带外数据传输,TCP 也没有真正的带外数据。只不过 TCP 利用其首部中的 紧急指针标志 和 紧急指针 两个字段,给应用程序提供了一种紧急方式。TCP 的紧急方式利用传输普通数据的连接来传输紧急数据。实际应用中,带外数据的使用很少见,它一般总是被映射到传输普通数据的连接中,例如 telnet,rlogin,ftp 等远程程序会使用带外数据。前两个程序会将中止字符作为紧急数据 发送到远程端,这允许远程端冲洗所有未处理的输入,并且丢弃所有未发送的终端输出。ftp 命令使用带外数据来中断一个文件的传输。注意:紧急数据并不是带外数据,它只是带外数据的一种体现。

        首先介绍 TCP 发送带外数据的过程。假设一个进程已经往某个 TCP 连接的发送缓冲区中写入了 N 字节的普通数据,并等待其发送。在数据被发送前,该进程又向这个连接写入了 3 字节的带外数据 “abc”。此时,待发送的 TCP 报文段的首部将被设置 URG 标志,并且紧急指针被设置为指向最后一个带外数据的下一字节(进一步减去当前 TCP 报文段的序号值得到其首部中的紧急偏移值),如图 1 所示。


        由图 1 可见,发送端一次发送的多字节的带外数据中只有最后一字节被当作带外数据(字母c),而其他数据(字母a和b)被当成了普通数据。如果 TCP 模块以多个 TCP 报文段来发送图 1 所示 TCP 发送缓冲区中的内容,则每个 TCP 报文段都将设置 URG 标志,并且它们的紧急指针指向同一个位置(数据流中带外数据的下一个位置),但只有一个 TCP 报文段真正携带带外数据。

        现在考虑 TCP 接收带外数据的过程。TCP 接收端只有在接收到紧急指针标志时才检查紧急指针,然后根据紧急指针所指的位置确定带外数据的位置,并将它读入一个特殊的缓存中。这个缓存只有1字节,称为带外缓存。如果上层应用程序没有及时将带外数据从带外缓存中读出,则后续的带外数据(如果有的话)将覆盖它。

        前面讨论的带外数据的接收过程是 TCP 模块接收带外数据的默认方式。如果我们给 TCP 连接设置了 SO_OOBINLINE 选项,则带外数据将和普通数据一样被 TCP 模块存放在 TCP 接收缓冲区中。此时应用程序需要像读取普通数据一样来读取带外数据。这种情况下,使用紧急指针来区分普通数据和带外数据,紧急指针可以用来指出带外数据的位置, socket 编程接口也提供了系统调用来识别带外数据。

带外标记

        在 Linux 系统中,内核检查到 TCP 紧急标志时,将通知应用程序带外数据需要接收。内核通知应用程序带外数据到达有两种常见的方式:I/O 复用产生的异常事件 和  SIGURG 信号。但是,即使应用程序得到了有带外数据需要接收通知,还必须直到带外数据在数据流中的具体位置,这样才能准确接收带外数据。这点可通过系统调用 sockatmark 函数实现。

/* 函数功能:确认套接字是否处于带外标记;
 * 返回值:若处于带外标记则返回1,若不处于带外标记则返回0,若出错则返回-1;
 * 函数原型:
 */
#include <sys/socket.h>
int sockatmark(int sockfd);


处理带外数据


利用 SIGURG 信号处理带外数据
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值