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算法 的相关文章

  • 虚拟机连不上网解决办法,以及出现Ubuntu connect: Network is unreachable

    虚拟机连不上网解决办法 xff0c 以及出现Ubuntu connect Network is unreachable 问题来源具体过程 问题来源 出现了Ubuntu connect Network is unreachable这个问题 x
  • [History]W. Richard Stevens

    读过 Advanced Programming in the UNIX Enviroment 读过 TCP IP Illustrated 读过 UNIX Network Programming 直到今天才直到她们的作值是同一个人 W Ric
  • centos 网络连接设置

    这里使用虚拟机 VirtualBox 来安装CentOS 6 3 32bit服务器版本 没有安装桌面 作为演示 所以全是命令操作 如何安装CentOS操作系统就不用我说的 虚拟机网络设置为桥接模式 Bridge 单独分配ip 不共享主机ip
  • Linux 虚拟化网络技术 — 虚拟网线(Veth-pair)

    虚拟网线 Veth pair Veth pair 不是一个设备 而是一对设备 作为虚拟网线用于连接两个虚拟网络设备 veth pair 是根据数据链路层的 MAC 地址对网络数据包进行转发的过程来实现的 本质是反转通讯数据的方向 需要发送的
  • 分析我关于路由协议的一些技术感想

    1 OSPF是在IP包里的 五种不同类型的OSPF包 Hello LSR LSU LSAck DD 又是由再进一层的ospf packetheader进行区分的 ABR一般都会有一个接口在Area0中 且对于不同的Area有不同的LSDB
  • 使用路由器DDNS功能+动态公网IP实现外网访问(花生壳)

    找电信开通了动态公网IP 理由是为了更流畅看家里的监控 动态公网IP一直变 所以就用DDNS tp link路由器中设置花生壳的DDNS 登录成功了 域名有一个是注册花生壳后送给你的一个免费壳域名 打开花生壳客户端 首先要删掉内网穿透的全部
  • Failed to restart network.service: Unit network.service not found

    在配置完网络设置时重启时会出现这个问题 原因是和NetworkManager 服务有冲突 解决办法就是关闭NetworkManager然后重启一下Network服务 service NetworkManager stop 关闭Network
  • TCP三次握手,两次可以吗?

    这个问题网络上的回答超级多 众说纷纭 以 RFC 793 来回答这个问题可能更加准确 Reliability The TCP must recover from data that is damaged lost duplicated or
  • 用QT实现同步调用WebService

    QT提供了QNetworkAccessManager来访问 QT帮助文档里有这么一段 QNetworkAccessManager manager new QNetworkAccessManager this connect manager
  • Wireshark的两种过滤器与BPF过滤规则

    Wirshark使用的关键就在于过滤出想要的数据包 下面介绍怎么过滤 抓包过滤器 Wirshark有两种过滤器 一个是抓包过滤器 一个是显示过滤器 他们之间的区别在于抓包过滤器只抓取你设置的规则 同时丢弃其他信息 显示过滤器并不会丢弃信息
  • RHEL 6.1 KVM虚拟机桥接物理机网络

    RHEL6 1 KVM虚拟机桥接物理机网络 一 KVM默认网络配置 1 kvm上网有两种配置 a NAT 支持主机与虚拟机的互访 也支持虚拟机访问互联网 但不支持外界访问虚拟机 b bridge 桥接 可以使用虚拟机成为网络中具有独立IP的
  • 计算机网络——拥塞控制(1)

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

    注 所有标题带h的博客不保证准确性和正确性 写这篇博客原因是因为网络知识学了又忘 忘又学 翻来覆去 所以做个笔记 正如上文注明 此篇博客所写内容不够准确和专业 甚至不正确 只是为了便于理解记忆 概念 以太网 ethernet 双绞线 同轴线
  • 计算机网络(4.8)网络层- IP层转发分组的流程

    假设 有四个A类网络通过三个路由器连接在一起 每一个网络上都可能有成千上万个主机 可以想像 若按目的主机号来制作路由表 每一 路由表就有4万个项目 即4万行 每一行对应于 一台主机 则所得出的路由表就会过于庞大 但若按主机所在的网络地址来制
  • MySQL 字段约束 null, not null, default, auto_increment

    转载自 http www xiaoxiaozi com 2009 07 09 1111 没有规矩 不成方圆 任何事物都是如此 在 MySQL 中 每个字段定义都包含附加约束或者修饰符 这些可以用来增加对所输入数据的约束 今天我们就来看一下
  • VLAN划分及配置注意事项

    VLAN Virtual Local Area Network 即虚拟局域网 是将一个物理的LAN在逻辑上划分成多个广播域的通信技术 VLAN内的主机间可以直接通信 而VLAN间不能直接通信 从而将广播报文限制在一个VLAN内 VLAN之间
  • linux下libpcap抓包分析

    linux下libpcap抓包分析 一 首先下载libpcap包http www tcpdump org latest release 然后安装 安装完成后进入安装根目录的tests文件夹 编译运行findalldevstest c 编译时
  • linux下TUN或TAP虚拟网卡的使用

    tun tap 驱动程序实现了虚拟网卡的功能 tun表示虚拟的是点对点设备 tap表示虚拟的是以太网设备 这两种设备针对网络包实施不同的封装 利用tun tap 驱动 可以将tcp ip协议栈处理好的网络分包传给任何一个使用tun tap驱
  • Android 网络管理

    系统中对网络的判断和选在是在Connectivityervice这个服务中来处理的 在系统启动的时候会启动这个系统服务 系统启动完毕后 ConnectivityService在系统启动的时候就启动了 在android内部 用framewor
  • 网络基础面试题(二)

    11 什么是网桥 防火墙的端口防护是指什么 网桥是一种网络设备 用于连接两个或多个局域网 LAN 并转发数据包 它能够根据MAC地址来识别和转发数据 提高网络的传输效率和安全性 防火墙的端口防护是指对防火墙上的各个端口进行保护和限制 只允许

随机推荐

  • 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 通过减少必须发送的封包的数量 提高了网络