TCP带外数据学习总结(概念,发送接收过程,数据到达检测,代码实现)

最近在学习《Linux高性能服务器编程》 这本书,书中零零散散的讲了TCP带外数据的一些知识,在这里把这些知识总结以下,方便自己,也方便他人。

本文主要分为以下四个方面总结,分别为 TCP带外数据的概念,如何发送和接收带外数据,怎么检测带外数据的到达,最后介绍相关函数以及代码实现。

第一部分: TCP带外数据的概念

   有很多传输层此协议都具有带外数据(OUT Of Band) 的概念,其作用是迅速通告通信的另一方本段发生的重要事件。带外数据具有比普通数据更高的优先级,理论上应该被立即发送和立即接收。带外数据可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中。

   UDP并没有实现带外数据,TCP也没有真正的带外数据。

   TCP利用其头部中的紧急指针标志以及紧急指针字段,给应用程序提供里一种紧急方式。所以TCP是利用传输普通数据的连接来传输带外数据。

第二部分:TCP带外数据的发送和接收
1. TCP带外数据的发送过程:
假设一个进程已经往某个TCP连接的发送缓冲区写入里N字节的普通数据,并等待其发送。在数据发送前,该进程又向这个连接写入里3个字节的带外数据“abc”。 此时,待发送的TCP报文段头部将被蛇者URG标志,并且紧急指针指向带外数据的下一个字节
发送端一次发送的多字节带外数据只有最后一个字节被当作是带外数据, 其他数据还是被当作普通数据。
2. TCP带外数据的接收过程
TCP接收端只有在接收到具有紧急标志的TCP报文端时才检查紧急指针,然后根据紧急指针所指的位置确定带外数据的位置,并将其读入一个特殊的缓存中这个缓存只有一个字节,称为带外缓存

第三部分:内核如何通知应用程序带外数据的到来
主要有两种方法:
1. IO复用(select方式复用)系统的调用报告一个异常事件;
select系统调用的用途是:在指定的一段时间内,监听用户感兴趣的文件描述符上的可读、可写和异常事件。同样,select系统调用可以监听socket上的可读、可写和异常时间。在网络程序中,select能处理的异常情况只有一种:socket上接收到带外数据
其具体步骤是:首先设置select监听我们关心的socket描述符,当有事件发生时,判断时间类型,如果时间类型是socket异常时间,则表明有紧急数据到来,可以读取紧急数据里。
2. SIGURG信号
其实现方法是:在进程中注册SIGURG信号以及其信号处理函数,当进程接收到SIGURG信号时,在SIGURG的信号处理函数内接收紧急数据。此时信号的模式要为SA_RESTART,表示被信号中断的系统调用在信号返回时继续进行。

第四部分:相关函数及代码实现
1.相关函数
(1) 发送接收带外数据和发送接收普通数据一样,都可以使用send()和recv()函数。其区别在于函数的最后一个参数 int flags不同。

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd,void* buf,size_t len,int flags);
ssize_t send(int sockfd,const void* buf,size_t len,int flags);
//将fags 设置为 MSG_OOB 表示结束和发送带外数据。

(2) select 系统调用相关函数

#include <sys/select.h>
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);
//nfds参数表示监听的文件描述符总数,一般取监听的最大文件描述符 + 1。
//readfds指向需要监听可读事件的描述符集合,writefds指向需要监听可写事件的描述符集合,exceptfds指向需要监听异常//的描述符集合
//
FD_ZERO(fd_set* fdset);//清除描述符集fdset中的所有描述符
FD_SET(int fd,fd_set* fdset);//向描述符集fdset添加描述符fd
FD_CLR(int fd,fd_set* fdset);//在描述符集fdset中清除描述符fd
int FD_ISSET(int fd,fd_set* fdset);//测试描述符集fdset中描述符fd是否被置位

(3) SIGUSR 信号处理相关函数

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值