套接字的多种可选项(修改IO缓冲区大小及TCP_NODELAY)

2024-01-28 13:52

本文主要是介绍套接字的多种可选项(修改IO缓冲区大小及TCP_NODELAY),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题套接字的多种可选项

我们进行套接字编程时往往只关注数据通信,而忽略了套接字具有的不同特性。但是,理解这些特性并根据实际需要进行更改也十分重要。
在这里插入图片描述
从上表可以看出,套接字可选项是分层的。IPPROTOIP层可选项是IP协议相关事项,IPPROTO_TCP层可选项是TCP协议相关的事项,SOL_SOCKET层是套接字相关的通用可选项。

我们几乎可以针对上表中的所有可选项进行读取(Get)和设置(Set)(当然,有些可选项只能进行一种操作)。可选项的读取和设置通过如下2个函数完成。

#include<sys/socket.h>
#include<sys/socket.h>int getsockopt(int sock, int level,int optname, void *optval, socklen_t *optlen);int setsockopt(int sock, int level, int optname, const void*optval, socklen_t optlen);

查看设置I/O缓冲大小以及查看SO_TYPE

void demo() {int tcp_sock, udp_sock;int optval = 0;socklen_t len = sizeof(optval);tcp_sock = socket(PF_INET, SOCK_STREAM, 0);udp_sock = socket(PF_INET, SOCK_DGRAM, 0);std::cout << "tcp_sock:" << SOCK_STREAM << std::endl;std::cout << "udp_sock:" << SOCK_DGRAM << std::endl;// 查看SO_TYPEgetsockopt(tcp_sock, SOL_SOCKET, SO_TYPE, (void*)&optval, &len);std::cout << "tcp_sock type:" << optval << std::endl;optval = 0;getsockopt(udp_sock, SOL_SOCKET, SO_TYPE, (void*)&optval, &len);std::cout << "udp_sock type:" << optval << std::endl;//查看\设置缓冲区getsockopt(tcp_sock, SOL_SOCKET, SO_SNDBUF, (void*)&optval, &len);std::cout << "tcp_sock buffer:" << optval << std::endl;optval = 1024 * 1024;setsockopt(tcp_sock, SOL_SOCKET, SO_SNDBUF, (void*)&optval, len);getsockopt(tcp_sock, SOL_SOCKET, SO_SNDBUF, (void*)&optval, &len);std::cout << "after set tcp_sock buffer:" << optval << std::endl;close(udp_sock);close(tcp_sock);
}

TCP_NODELAY

“什么是Nagle算法?使用该算法能够获得哪些数据通信特性?”

Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率。
在这里插入图片描述
从上图中可以得到如下结论:
“只有收到前一数据的ACK消息时,Nagle算法才发送下一数据。”

TCP套接字默认使用Nagle算法交换数据,因此最大限度地进行缓冲,直到收到ACK。上图左侧正是这种情况。为了发送字符串"Nagle",将其传递到输出缓冲。这时头字符"N"之前没有其他数据(没有需接收的ACK),因此立即传输。之后开始等待字符"N"的ACK消息,等待过程中,剩下的"agle"填入输出缓冲。接下来,收到字符"N"的ACK消息后,将输出缓冲的"agle"装入一个数据包发送。也就是说,共需传递4个数据包以传输1个字符串。

接下来分析未使用Nagle算法时发送字符串"Nagle"的过程。假设字符"N"到"e"依序传到输出缓冲。此时的发送过程与ACK接收与否无关,因此数据到达输出缓冲后将立即被发送出去。从上图右侧可以看到,发送字符串"Nagle"时共需10个数据包。由此可知,不使用Nagle算法将对网络流量产生负面影响。即使只传输1个字节的数据,其头信息都有可能是几十个字节。因此,为了提高网络传输效率,必须使用Nagle算法。

在程序中将字符串传给输出缓冲时并不是逐字传递的,故发送字符串"Nagle"的实际情况并非如上图 所示。但如果隔一段时间再把构成字符串的字符传到输出缓冲(如果存在此类数据传递)的话,则有可能产生类似上图的情况。上图中就是隔一段时间向输出缓冲传递待发送数据的。

但Nagle算法并不是什么时候都适用。根据传输数据的特性,网络流量未受太大影响时,不使用Nagle算法要比使用它时传输速度快。最典型的是"传输大文件数据"。将文件数据传入输出缓冲不会花太多时间,因此,即便不使用Nagle算法,也会在装满输出缓冲时传输数据包。这不仅不会增加数据包的数量,反而会在无需等待ACK的前提下连续传输,因此可以大大提高传输速度。
一般情况下,不适用Nagle算法可以提高传输速度。但如果无条件放弃使用Nagle算法,就会增加过多的网络流量,反而会影响传输。因此,未准确判断数据特性时不应禁用Nagle算法。

刚才说过的"大文件数据"应禁用Nagle算法。换言之,如果有必要,就应禁用Nagle算法。"Nagle算法使用与否在网络流量上差别不大,使用Nagle算法的传输速度更慢"禁用方法非常简单。
从下列代码也可看出,只需将套接字可选项TCP_NODELAY改为1(真)即可。

演示代码

int opt_val=1;
setsockopt(sock, IPPROTO_TCP,TCP_NODELAY,(void*)&opt_val, sizeof(opt_val));//可以通过TCP_NODELAY的值查看Nagle算法的设置状态。
int opt_val;socklen_t opt_len;
opt_len=sizeof(opt_val);
getsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(void*)&opt_val,&opt_len);

这篇关于套接字的多种可选项(修改IO缓冲区大小及TCP_NODELAY)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653816

相关文章

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

开启青龙 Ninja 扫码功能失效后修改成手动填写CK功能【修正Ninja拉库地址】

国内:进入容器docker exec -it qinglong bash #获取ninjagit clone -b main https://ghproxy.com/https://github.com/wjx0428/ninja.git /ql/ninja#安装cd /ql/ninja/backend && pnpm install cp .env.example .env

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。

关于文章“python+百度语音识别+星火大模型+讯飞语音合成的语音助手”报错的修改

前言 关于我的文章:python+百度语音识别+星火大模型+讯飞语音合成的语音助手,运行不起来的问题 文章地址: https://blog.csdn.net/Phillip_xian/article/details/138195725?spm=1001.2014.3001.5501 1.报错问题 如果运行中报错,且报错位置在Xufi_Voice.py文件中的pcm_2_wav,如下图所示

文件权限修改为777,php failed to open stream: Permission denied

记录一次在谷歌云上的异常诡异的事件: 环境 centos7.5 nginx php7.0 mysql 问题: 问题一 我用相同的nginx配置,只是修改了nginx root目录。 打开/var/www/html/ 这个目录就报 2018/06/22 04:35:03 [error] 15840#0: *438 FastCGI sent in stderr: “Primary scr

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存

Java NIO 创建/复制缓冲区

创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1、调用allocate方法 2、调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义; allocate方法创建缓冲区 调用allocate方法实际上会返回new HeapCharBuffer(capacity, capacity)对象; 缓存空间存储在CharBuffer类的成员属性char[] h

关于修改计算机的处理器数和最大内存数的问题

问题描述: 刚开始本来是想让计算机的运行速度运行的快点,于是在网上搜索如何让计算机的运行速度更快,找到了一种关于修改计算机内存数和计算机的处理核数可以让计算机运行的更快。 遇到问题: 当我通过命令msconfig →引导→高级选项→勾选了处理器数和最大内存数,然后重启,结构整个计算机都卡的要死,于是记录下来。网上的答案有时候真的是很不负责任,也有可能是自己技术不到位。 结果:取消处理器和内

解除浏览器打开主页被锁定,修改方法

打开360安全卫士--》系统修复: 具体看如下截图就清楚 <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"sh