Nagle算法

2023-11-11

   说明:本文是最近项目上使用tcp时遇到的问题找到的原因,参考了网络上的几篇文章整理出来,如有版权问题,请留言。

   Nagle算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用程序系统的效率。

1. Nagle算法的规则

  (可参考tcp_output.c文件里tcp_nagle_check函数注释):
1)如果包长度达到MSS(MSS是最大分段大小Maxitum Segment Size ,MTU是最大传输单元Maxitum Transmission Unit),则允许发送;
2)如果该包含有FIN,则允许发送;
3)设置了TCP_NODELAY选项,则允许发送;
4)未设置TCP_CORK选项时,若所有发出去的包均被确认,或所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送。
   对于规则4),就是说一个TCP连接上最多只能有一个未被确认的小数据包,在该分组的确认到达之前,不能发送其他的小数据包。如果某个小分组的确认被延迟了,那么后续小分组的发送就会相应的延迟。也就是说延迟确认影响的并不只是被延迟确认的那个数据包,而是后续所有的应答包。

2. Nagle算法的门槛

   实际上Nagle算法并不是很复杂,他的主要职责是数据的累积,实际上有个门槛:

1)缓冲区中的字节数达到了一定量

2)等待了一定的时间(一般的Nagle算法都是等待200ms);

3)紧急数据发送

   个门槛的任何一个达到都必须发送数据了。一般情况下,如果数据流量很大,第二个条件是永远不会起作用的,但当发送小的数据包时,第二个门槛就发挥作用了,防止数据被无限的缓存在缓冲区不是好事情哦。 

3. Nagle算法的选项配置

   TCP_NODELAY和TCP_CORK都是禁用Nagle算法,只不过NODELAY完全关闭而TCP_CORK完全由自己决定发送时机。Linux文档上说两者不要同时设置

3.1 TCP_NODELAY 选项

设置该选项: setsockopt(s,IPPRO_TCP,TCP_NODELAY,(const char*)&on,sizeof(int));
读取该选项: getsockopt(s,IPPRO_TCP,TCP_NODELAY,(char*)&on,&optlen);  

  

   默认情况下, 发送数据采用Nagle 算法. Nagle 算法是指发送方发送的数据不会立即发出,而是先放在缓冲区, 等缓存区满了再发出. 发送完一批数据后, 会等待接收方对这批数据的回应,然后再发送下一批数据 

   Nagle 算法适用于发送方需要发送大批量数据, 并且接收方会及时作出回应的场合, 这种算法通过减少传输数据的次数来提高通信效率

   如果发送方持续地发送小批量的数据, 并且接收方不一定会立即发送响应数据, 那么Nagle算法会使发送方运行很慢

3.2 TCP_CORK选项

   TCP链接的过程中,默认开启Nagle算法,进行小包发送的优化。优化网络传输,兼顾网络延时和网络拥塞。这个时候可以置位TCP_NODELAY关闭Nagle算法,有数据包的话直接发送保证网络时效性。

   在进行大量数据发送的时候可以置位TCP_CORK关闭Nagle算法保证网络利用性。尽可能的进行数据的组包,以最大mtu传输,如果发送的数据包大小过小则如果在0.6~0.8S范围内都没能组装成一个MTU时,直接发送。如果发送的数据包大小足够间隔在0.45内时,每次组装一个MTU进行发送。如果间隔大于0.4~0.8S则,每过来一个数据包就直接发送。

   Nagle组织包的长度是由系统决定的,有时候我们知道我们会每个1分钟产生1字节,共1000字节。如果完全由Nagle算法来发送的话,可能还是会1字节1字节发送[这是一种极端情况,假设返回ACK时间不是很长]。这个时候首先设置TCP_CORK能够阻塞住TCP[尽量阻塞住],等我们write完1000字节之后,取消TCP_CORK,这个时候就能够将1000字节一次发出

总结:

   TCP_CORK选项与TCP_NODELAY一样,是控制Nagle化的。      

1)打开TCP_NODELAY选项,则意味着无论数据包是多么的小,都立即发送(不考虑拥塞窗口)。
2)如果将TCP连接比喻为一个管道,那TCP_CORK选项的作用就像一个塞子。            

   设置TCP_CORK选项,就是用塞子塞住管道,而取消TCP_CORK选项,就是将塞子拔掉。            

   当TCP_CORK选项被设置时,TCP链接不会发送任何的小包,即只有当数据量达到MSS时,才会被发送

   一般当数据传输完成时,通常需要取消该选项,以防被塞住,这样才可以让不够MSS大小的包能及时发出去。

例如下面这段代码:

  1:  int on = 1;

  2:  setsockopt(sockfd, SOL_TCP, TCP_CORK, &on, sizeof(on)); //set TCP_CORK

  3:  write(sockfd, ...);    //e.g., http header

  4:  sendfile(sockfd, ...); //e.g., http body

  5:  on = 0;

  6:  setsockopt(sockfd, SOL_TCP, TCP_CORK, &on, sizeof(on)); //unset TCP_CORK

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nagle算法 的相关文章

  • socket error总结

    Socket error 0 Directly send error Socket error 10004 Interrupted function call Socket error 10013 Permission denied Soc
  • could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the n

    如果你在创建自定义网络时 docker network create driver bridge my net出现下面的提示 Error response from daemon could not find an available no
  • 分析我关于路由协议的一些技术感想

    1 OSPF是在IP包里的 五种不同类型的OSPF包 Hello LSR LSU LSAck DD 又是由再进一层的ospf packetheader进行区分的 ABR一般都会有一个接口在Area0中 且对于不同的Area有不同的LSDB
  • 获取网卡名称存入数组 对网卡执行相关操作

    背景 由于服务器网卡获取ip异常 需要对做bond网卡进行相关网络操作 bond网卡操作 正常执行nmlic命令 环境问题对要执行的网卡本身只有四行命令 为了防止出现多业务网卡和vlan主网卡的情况 这里选择自动获取bond网卡执行相关操作
  • Ubuntu9.04双网卡配置

    新手没怎么用过Ubuntu 所以走了不少弯路 网上找了很多方法 大都没对我起到帮助作用 所以把自己的配置方法写一写 环境 VPC2007SP1 Ubuntu9 04 Ubuntu上连了两块网卡 eth0为外网的eth1为内网的 VPC的特点
  • Socket错误代码对应表(转)

    提示 在命令提示符下输入 net helpmsg 1xxxx就能够得到Windows系统提供的错误提示的详细解释 出现网络联机错误Socket error 11001 表示您的计算机无法连上服务器 请检查您的Proxy设定以及Proxy相关
  • DNS基本指南,域名解析,A记录,MX,CNAME,URL Redirect(301),URL frame,ns,TXT Record

    DNS 基本指南 DNS DNS 是 Domain Name System 域名系统 的缩写 此系统用于管理和识别域名 DNS 的最基本功能是为域的一个或多个 IP 地址提供名称 例如 可以将域名 wolf example com转换为 1
  • openssl生成椭圆曲线的私钥是如何做到每次不同的?

    目录 例子 排查 随机算法 小结 例子 生成一个私钥只需要3步 1 获得指定曲线的group 如比特币的secp256k1 2 group和key绑定 3 用key来生成私钥 先上一段代码例子 key1 EC KEY new if key1
  • TCP/IP详解学习笔记

    TCP IP详解学习笔记 http blog csdn net goodboy1881 category 204448 aspx PageNumber 2 TCP IP详解学习笔记 3 IP协议 ARP协议 RARP协议 摘要 TCP IP
  • RHEL 6.1 KVM虚拟机桥接物理机网络

    RHEL6 1 KVM虚拟机桥接物理机网络 一 KVM默认网络配置 1 kvm上网有两种配置 a NAT 支持主机与虚拟机的互访 也支持虚拟机访问互联网 但不支持外界访问虚拟机 b bridge 桥接 可以使用虚拟机成为网络中具有独立IP的
  • socket包长度问题: send recieve(转载)

    一个包没有固定长度 以太网限制在46 1500字节 1500就是以太网的MTU 超过这个量 TCP会为IP数据报设置偏移量进行分片传输 现在一般可允许应用层设置8k NTFS系 的缓冲区 8k的数据由底层分片 而应用看来只是一次发送 win
  • IP数据包长度问题总结

    首先要看TCP IP协议 涉及到四层 链路层 网络层 传输层 应用层 其中以太网 Ethernet 的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据 Data 在应用层 它们的关系是 数据帧 IP包 TCP
  • RHEL/CentOS 7中的网络暨network.service与NetworkManager.service详解

    在RHEL CentOS 6及以前的版本中 网络功能是通过一系列网络相关的脚本文件实现 如 etc init d network文件 及如下 sbin if 文件等 root myserver ll sbin if rwxr xr x 1
  • TCP/IP校验和计算算法

    ICMP IP UDP TCP报头部分都有checksum 检验和 字段 ICMP和IP报头校验和的计算都很简单 过程如下 1 把校验和字段置为0 2 对IP头部中的每16bit进行二进制求和 3 如果和的高16bit不为0 则将和的高16
  • TCP协议如何保证可靠传输

    TCP的功能是交付数据 所以TCP的可靠就是保证每次数据按序 按时 不丢数据 顺利的交付给对端 可靠不等于安全 TCP尽最大可能的保证数据可靠性 但是没有任何措施保证数据的安全性 所谓安全就是你的数据不会被别人看到或者窃取到 TCP上的数据
  • URL 地址栏锚点 window location hash 使用方法

    location是javascript里边管理地址栏的内置对象 比如location href就管理页面的url 用location href url就可以直接将页面重定向url 本文转自米扑博客 URL 地址栏锚点 window loca
  • 计算机网络——拥塞控制(1)

    1 拥塞 congestion 当过多的包在网络缓冲区中竞争某个相同链路时 队列会溢出丢包 当这种丢包成为普通事件时 则称网络发生拥塞 简单概述就是对聚合带宽的需求超过了链路的可用容量 1 1 产生原因 宏观原因 网络资源分布不均匀 流量分
  • OSI七层模型与TCP/IP五层模型

    一 OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识 OSI参考模型 1 OSI的来源 OSI Open System Interconnect 即开放式系统互联 一般都叫OSI参考模型 是ISO 国际标准化组织 组织在1985
  • SO_RCVTIMEO超时errno

    首先打印一次recv调用失败的errno值和各个宏的值 由上可知 EAGIN和EWOULDBLOCK的值都是11 其实EAGIN是在setsockopt设置SO RCVTIMEO或SO SNDTIMEO后 recv或者send系列函数超时等
  • chrome浏览器network报错:ERR_CERT_AUTHORITY_INVALID

    转载请注明作者 独孤尚良dugushangliang 出处 https blog csdn net dugushangliang article details 85275319 在访问局域网的某网址时 提示 您的连接不是私密连接 错误代码

随机推荐

  • Linux系统基础命令

    Linux系统常用基本命令 ls 查看当前目录下所有文件 注 蓝色 文件夹 白色 普通文件 绿色 拥有执行权限的文件 红色 压缩文件 touch 示例 touch filename txt 在当前目录下创建一个文件 注 文件名区分大小写 文
  • 【LeetCode】83. 删除排序链表中的重复元素

    83 删除排序链表中的重复元素 简单 方法 一次遍历 思路 由于给定的链表是排好序的 因此重复的元素在链表中出现的位置是连续的 因此我们只需要对链表进行一次遍历 就可以删除重复的元素 从指针 cur 指向链表的头节点 随后开始对链表进行遍历
  • 【时间序列数据挖掘】ARIMA模型

    目录 0 前言 一 移动平均模型MA 二 自回归模型AR 三 自回归移动平均模型ARMA 四 自回归移动平均模型ARIMA 总结 0 前言 传统时间序列分析模型 ARIMA模型是一个非常灵活的模型 对于时间序列的好多特征都能够进行描述 比如
  • MYSQL数据库测评及整改

    1 查询数据库版本 select version 2 查询已安装的插件 show plugins 3 查询插件安装的位置 show variables like plugin dir 4 查询用户 选择数据库 select host use
  • 阿里云OCR图片识别

    阿里云OCR图片识别 请求参数 Body 请求示例 java 正常返回示例 错误码定义 阿里云OCR图片识别 单字识别 表格识别 旋转功能 准备条件 阿里云OCR图片识别API购买 初次购买1分钱500次接口调用 请求参数 Body 图像数
  • Java多线程——为什么弃用stop、suspend、resume方法

    初始的Java版本定义了一个stop方法用来终止一个线程 以及一个suspend方法用来阻塞一个线程直至另一个线程调用resume stop和suspend方法有一些共同点 都试图控制一个给定线程的行为 stop suspend和resum
  • 利用Python写Api

    初学者 仅作笔记参考 因为没使用web框架 采用的原生sql进行数据查询有点呆板 from mysql Database import Demo from utils tools import Tools import flask json
  • 运行快捷指令_iOS 13 快捷指令无法运行的解决办法

    升级 iOS13 以后 快捷指令 App 也迎来全新版本 新设计的快捷指令 App 有诸多不同 尤其在权限控制上更为严格 这导致部分快捷指令打开时报错的问题 首次添加快捷指令规则后 运行时提示 无法打开 XXX 这个问题其实很容易解决 方法
  • linux 下 redis 设置密码

    在服务器上 这里以linux服务器为例 为redis配置密码 1 第一种方式 当前这种linux配置redis密码的方法是一种临时的 如果redis重启之后密码就会失效 1 首先进入redis 如果没有开启redis则需要先开启 root
  • matlab函数结果,从Matlab函数返回多个输出变量

    一些选择 添加一个参数以指定控制台的详细输出 但默认情况下将其设置为false function A B C test x y z verbose if nargin 3 verbose false end A 2 x B 2 y C 2
  • JavaScript基础--es6新增的数组方法

    今天给大家介绍一些es6新增的常用数组方法 1 映射数组 map 方法 目的 为了操作原数组 但不改变原数组的值 作用 map 方法返回一个新数组 数组中的元素为原始数组元素调用函数处理后的值 不会对空数组进行检测 返回值 新数组 一定和原
  • 欧拉角的理解

    1 欧拉角概念 百度百科 欧拉角 用来确定定点转动刚体位置的3个一组独立角参量 欧拉角由章动角 旋进角 即进动角 和自转角 组成 欧拉角为欧拉首先提出而得名 维基百科 Euler angles 莱昂哈德 欧拉用欧拉角来描述刚体在三维欧几里得
  • 【100%通过率 】【华为OD机试真题 c++/java】关联端口组合并【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 有M 1 lt M lt 10 个端口组 每个端口组是长度为N 1 lt N lt 100 的整数数组 如果端口组间存在2个及以上不同端口相同
  • pycharm 退出scientific mode科学模式

    之前工作需要进入scientific mode将pycharm调成科学模式 后来使用bert模型发现一直报错 也没改动代码 困惑了大半天 偶然的机会 退出scientific mode发现不报错了 这里记录一下 我用的是pycharm社区版
  • 理解LSTM网络(翻译)

    Translated on December 19 2015 本文为博客 Understanding LSTM Networks 的翻译文章 原文链接 http colah github io posts 2015 08 Understan
  • MySQL数据库TDSQL架构分析及采用策略扩容流程

    MySQL数据库TDSQL架构分析及采用策略扩容流程 2016 10 14 22 16 401人阅读 评论 0 收藏 编辑 删除 分类 mysql 105 随着业务的发展 基于内存的NoSQL解决方案HOLD平台在高峰期一天支撑3000亿读
  • 太强大了!Packet Tracer抓包功能

    首先 咱们开启Cisco Packet Tracer软件 我这用的是5 3版 英文实在不好的可以将软件汉化 推荐使用英文版 对学习有好处 开启软件后 正常模式是实模式 如图 点击右下角的模式切换咱们切换到 模拟模式 界面如下 好 咱们先关掉
  • CSS3弹性盒子(Flex Box)

    CSS3弹性盒子 Flex Box 一 容器的属性 flex directionflex wrapflex flowjustify contentalign itemsalign content 1 flex direction属性决定主轴
  • Qt基础知识-创建Qt程序,Qt Creater常用快捷键,创建组件,对象树

    1 简介 Qt是一个跨平台的图形引擎 1991年由奇趣科技开发 优点 跨平台 接口简单易于上手 一定程度上简化了垃圾回收机制 2 创建Qt程序 名称 不能有空格 不能有中文 路径 不能有中文 创建cpp文件时选择继承的3个类 Qwidget
  • Nagle算法

    说明 本文是最近项目上使用tcp时遇到的问题找到的原因 参考了网络上的几篇文章整理出来 如有版权问题 请留言 Nagle算法用于对缓冲区内的一定数量的消息进行自动连接 该处理过程 称为Nagling 通过减少必须发送的封包的数量 提高了网络