当前位置: 首页 > news >正文

【网络编程】TCP带外数据总结

文章目录

  • 一、带外数据基本知识
  • 二、带外数据的读写
  • 三、检测带外数据是否到达
    • 3.1、select上的异常事件
    • 3.2、SIGURG信号
  • 四、带外标记


一、带外数据基本知识

  带外数据(Out Of Band,OOB),用于迅速通告对方本端发生的重要事件,所以它比一般数据具有更高的优先级,其传输既可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中。在实际的应用中,带外数据的使用比较少见,已知的仅有telnet、ftp等远程非活跃程序。
  虽然TCP和UDP中都没有真正的带外数据,但是TCP利用其头部中的紧急指针标志和紧急指针字段来传输紧急数据,给应用程序提供了一种传输紧急数据的方式,这种传输紧急数据的方式与带外数据类似,所以TCP紧急数据也就可以被称为带外数据。
  带外缓存,这个缓存只有1B,用来接收带外数据,根据紧急指针所指的位置确定带外数据的位置。如果上层应用程序没有及时将带外数据从带外缓存中读出,则后续数据将会覆盖它。

二、带外数据的读写

  TCP连接使用MSG_OOB参数在函数send以及recv中实现对带外数据的读写,由于带外缓存只有1B,所以在传输字符串的时候只有最后一个字节会被保存在带外缓存中进行传输。比如在以下程序的接收中,如果客户端依次传输“123”,“abc”,“123”这三次消息:

memset(buffer, '\0'. BUF_SIZE);
ret = recv(connfd, buffer, BUF_SIZE - 1, 0);
printf("got %d bytes of normal data '%s'\n", ret, buffer);
memset(buffer, '\0'. BUF_SIZE);
ret = recv(connfd, buffer, BUF_SIZE - 1, MSG_OOB);
printf("got %d bytes of oob data '%s'\n", ret, buffer);
memset(buffer, '\0'. BUF_SIZE);
ret = recv(connfd, buffer, BUF_SIZE - 1, 0);
printf("got %d bytes of normal data '%s'\n", ret, buffer);

  其结果为

got 5 bytes of normal data '123ab'
got 1 bytes of oob data 'c'
got 3 bytes of normal data '123'

  由此可见,使用MSG_OOB参数对带外数据进行传输,会迫使TCP连接切断数据流,以带外数据为分割点,正常数据’123ab‘和’123‘是不能一起被读出的。
(具体样例在《linux高性能服务器编程》P84-P85》

三、检测带外数据是否到达

3.1、select上的异常事件

  socket上面接收到正常数据和带外数据都将会使select返回,如果接收到正常数据socket将会处于可读状态,如果接受到带外数据,socket将会处于异常状态,通过判断socket的状态即可判断带外数据是否到达。

3.2、SIGURG信号

四、带外标记

  这里我们主要使用sockatmark函数来判断当前的socket是否处于带外标记,即下一个被读取到的数据是否是带外数据。

#include <sys/socket.h>
int sockatmark(int sockfd);

  如果下一个数据是带外数据的话,sockatmark返回1,不是的话返回0.

http://www.lryc.cn/news/109071.html

相关文章:

  • 高薪程序员面试题精讲系列133之微服务里的网关有哪些实现方案?你熟悉Gateway网关吗?
  • 计算机网络(4) --- 协议定制
  • 【Mybatis】Mybatis架构简介
  • 如何使用大模型处理生活繁琐的工作
  • RpcController作用浅析
  • Linux(三):Linux服务器下日常实操命令 (常年更新)
  • 强大的截图软件--Snipaste
  • LeetCode·每日一题·722. 删除注释·模拟
  • npm更新和管理已发布的包
  • 如何高效使用Gherkin
  • [CKA]考试之调度 pod 到指定节点
  • git 常用命令有哪些
  • 算法leetcode|66. 加一(rust重拳出击)
  • MySQL备份Shell脚本
  • Python批量查字典和爬取双语例句
  • uni-app、H5实现瀑布流效果封装,列可以自定义
  • vue echart3个饼图
  • LEARNING TO EXPLORE USING ACTIVE NEURAL SLAM 论文阅读
  • item_search-ks-根据关键词取商品列表
  • windows运行WPscan报错:无法打开库libcurl.dll
  • web前端框架Javascript之JavaScript 异步编程史
  • Java多线程(1)---多线程认识、四种创建方式以及线程状态
  • 搭建Django+pyhon+vue自动化测试平台
  • CASAIM自动化平面度检测设备3D扫描零部件形位公差尺寸测量
  • PostgreSql pg_ctl 命令
  • MySQL中的MVCC具体指的是什么?
  • Docker网络模型详解
  • 如何打造属于自己的个人IP?
  • 全网最全最细的jmeter接口测试教程以及接口测试流程详解
  • 【Linux命令200例】whereis用于搜索以及定位二进制文件