Nagle算法TCP_NODELAY和TCP_CORK

Nagle算法原理与实现详解 这意味着,在发送完一个小分组后,需要一直等待该分组的确认ACK到达,否则不会发送其他的分组。当确认到达之后,TCP会收集已经准备好的小分组,并将它们合并成一个大的分组发送出去,从而减少了。模式对服务器而言也会造成类似的延迟问题,例如在需要发送两个报文 A、B的情况下,使用此模式时发送 A 报文后,服务器会等待客户端发送 A 报文的ACK,但如果客户端延迟响应,导致过了一段时间才发送ACK,才会发送 B 报文。在发送出去的报文中,必须要等待对方发送ACK之后,服务端才会发送一个新的报文。 阅读详情

      坐公交车,最近在看《网络游戏Server编程》,里面提到了Nagle算法和socket的TCP_NODELAY选项,不是很了解,所以百度了一下,查到以下资料,并收藏。

 

下面摘自:http://hi.baidu.com/zzcqh/blog/item/15f78c363985fd390a55a933.html

Nagle算法 TCP_NODELAY和TCP_CORK

Nagle算法
根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程

(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。Nagle算法

,由Ford Aerospace And Communications Corporation Congestion Control in IP/TCP

internetworks(IETF RFC 896)(1984)定义,最初是用于缓冲Ford的私有TCP/IP网络拥塞情况,不

过被广泛传播开来。

 

Nagle的文档定义了一种他称之为小封包问题的解决方法。当某个应用程序每次只产生一字节的数

据,就会导致网络由于这样的小封包而过载(该情况通 常被称为“发送端SB窗口并发症”),从

而产生该问题。一个源自键盘的单一字符-1字节的数据-可能导致一个41字节的封包被传送,该

封包包含了1字节的 有用数据和40字节的头部数据。这种4000%过载的情况,在像APRANET这样只有

很轻负载的网络中是可以接受的,但在像Ford这样的负载很重的网 络中,可能强制重传,导致封

包丢失,并且通过过度拥挤交换节点和网关降低了传播速度。更进一步,当连接被丢弃时,吞吐量

可能被降低。Nagle算法-通常 的实现方法是在一个TCP程序中插入两行代码-在发送方,对标识

为没有回应的数据进行缓冲(存储)(这句怪怪的,其实应该是对未发送数据按顺序进行缓冲,在

发送时进行拼接)。顺序发送的数据将被保持到接收到被标识数据的回应或者一整包有价值的数据

需要被发送。

 

虽然Nagle算法用于解决Ford网络内产生的问题,但同样的问题也出现在APRANet。通过网络,

Nagling被广泛实现,包括 internet,并且产生了巨大的效用-虽然某些时候在高交互性环境如一

些C/S情况下不希望进行该处理。在这种情况下,可以通过 TCP_NODELAY套接字选项关闭Nagling。

注:Nagle虽然解决了小封包问题,但也导致了较高的不可预测的延迟,同时降低了吞吐量。


实际上这就的你动手来自己实现以下Nagle算法了。实际上Nagle算法并不是很复杂,他的主要职责

是数据的累积,实际上有两个门槛:一个就是缓 冲区中的字节数达到了一定量,另一个就是等待

了一定的时间(一般的Nagle算法都是等待200ms);这两个门槛的任何一个达到都必须发送数据了

。一般 情况下,如果数据流量很大,第二个条件是永远不会起作用的,但当发送小的数据包时,

第二个门槛就发挥作用了,防止数据被无限的缓存在缓冲区不是好事情哦。 了解了TCP的Nagle算

法的原理之后我们可以自己动手来实现一个类似的算法了,在动手之前我们还要记住一个重要的事

情,也是我们动手实现Nagle算 法的主要动机就是我想要紧急发送数据的时候就要发送了,所以对

于上面的两个门槛之外还的增加一个门槛就是紧急数据发送。现在可以开始工作了,我们这里主要

给出思路:

首先我们必须在SOCKET之上再建立一层,来定义我们的自己的传输控制,我们的Nagle算法也是在

这层里面实现的。
Disable哪个TCP的Nagle算法,都自己动手写了,要它干吗
使 用Select函数来查看是否可以发送数据,当然我们实质是否可写的fd_set的时候需要加入我们

的三个门槛,首先是按照字节和紧急数据来检查,一般情 况下这两个条件就搞定了,然后再按照

时间来决定。我们可是使用一个累积字节记数器和一个等待时间计时器。累积字节记数器在每次添

加数据到我们的控制层的时 候就累加一下,发送完毕的时候减去响应的字节数;而计时器在第一

次将数据提交给控制层的时候启动(可以使用Windows的GetTickcount来得 到当前的时间),然后

在每次发送数据完毕的时候重新复位一下。
实际上这样就已经实现了Nagle算法,而且不需要经常调用GetTickCount而降低了系统的性能。

TCP_CORK

TCP链接的过程中,默认开启Nagle算法,进行小包发送的优化。优化网络传输,兼顾网络延时和网

络拥塞。这个时候可以置位TCP_NODELAY关闭Nagle算法,有数据包的话直接发送保证网络时效性。

在进行大量数据发送的时候可以置位TCP_CORK关闭Nagle算法保证网络利用性。尽可能的进行数据

的组包,以最大mtu传输,如果发送的数据包大小过小则如果在0.6~0.8S范围内都没能组装成一个

MTU时,直接发送。如果发送的数据包大小足够间隔在0.45内时,每次组装一个MTU进行发送。如果

间隔大于0.4~0.8S则,每过来一个数据包就直接发送。


下面摘自:http://blog.youkuaiyun.com/lin49940/archive/2009/07/26/4382303.aspx
TCP_NODELAY 选项

设置该选项: public void setTcpNoDelay(boolean on) throws SocketException
读取该选项: public boolean getTcpNoDelay() throws SocketException
     默认情况下, 发送数据采用Negale 算法. Negale 算法是指发送方发送的数据不会立即发出,

而是先放在缓冲区, 等缓存区满了再发出. 发送完一批数据后, 会等待接收方对这批数据的回应,

然后再发送下一批数据. Negale 算法适用于发送方需要发送大批量数据, 并且接收方会及时作出

回应的场合, 这种算法通过减少传输数据的次数来提高通信效率.

     如果发送方持续地发送小批量的数据, 并且接收方不一定会立即发送响应数据, 那么Negale

算法会使发送方运行很慢. 对于GUI 程序, 如网络游戏程序(服务器需要实时跟踪客户端鼠标的移

动), 这个问题尤其突出. 客户端鼠标位置改动的信息需要实时发送到服务器上, 由于Negale 算法

采用缓冲, 大大减低了实时响应速度, 导致客户程序运行很慢.


下面摘自http://hi.baidu.com/dirlt/blog/item/5ea4be1795d30b03c83d6d7f.html

TCP_NODELAY和TCP_CORK

这里了解一下问题的背景就好理解了[不考虑滑动窗口加入,只是说packet的组织]
1.历史上TCP是每发送一次包等待一个ACK然后下一个

2.但是在一些交互式应用下比如Telnet,结果就是我们每按一次键就会发送一个packet.每一个字

符配一个TCP头效率不高,那个Nagle算法出来了。发送方法送数据A时然后再等待接受方的ACK时,

积累本地收集到的所有TCP数据包然后一次性发送。但是很明显Nagle算法不利于交互式情景

3.但是现代应用下面还是存在交互式应用的,所以有时候我们需要关闭Nagle那么可以设置

TCP_NODELAY

4.但是Nagle组织包的长度是由系统决定的,有时候我们知道我们会每个1分钟产生1字节,共1000

字节。如果完全由Nagle算法来发送的话,可能还是会1字节1字节发送[这是一种极端情况,假设返

回ACK时间不是很长]。这个时候首先设置TCP_CORK能够阻塞住TCP[尽量阻塞住],等我们write完

1000字节之后,取消TCP_CORK,这个时候就能够将1000字节一次发出
TCP_NODELAY和TCP_CORK都是禁用Nagle算法,只不过NODELAY完全关闭而TCP_CORK完全由自己决定

发送时机。Linux文档上说两者不要同时设置。
 

Nagle 算法:优化 TCP 网络中小数据包的传输 在网络通信中,TCP(传输控制协议)是最常用的协议之一,广泛应用于各种网络应用,如网页浏览、文件传输和在线游戏等。然而,随着互联网的普及,小数据包的频繁传输成为一个不容忽视的问题。为了解决这一问题,Nagle 算法应运而生。Nagle 算法由约翰·纳格尔(John Nagle)提出,其主要目的是通过减少网络中的小数据包数量来提高整体网络效率。它通过将小数据包进行聚合,从而降低网络拥塞和提高吞吐量。Nagle 算法在优化 TCP 网络中小数据包的传输方面发挥了重要作用。 阅读详情

相关推荐

网络编程之nagle算法和TCP_NODELAY

<br />之前写过一篇blog ,描述了用mina的时候写socket发现的一个诡异现象,当时将多个小数据写操作合并成一个写操作,问题就没了。Chenshuo同学还建议我设置TCP_NODELAY,只是后来因为事情忙,也就没有再深究下去。<br /><br /> 现在大概明白,是由于nagle算法在捣乱。<br /> TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一

智障大师 的专栏 2万+

Nagle算法

概述 在网络拥塞控制领域,有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题(RFC 896)。 该问题的具体描述是:如果我们的应用程序一次产生1个字节的数据,而这个1个字节数据又以网络数据包的形式发送到远端服务器,那么就很容易导致网络由于...

xupeng1644的博客 8294

TCP Nagle算法

在网络传输中,有时候会遇到这样一种场景:网络中传输了大量的小数据块,浪费资源。有时候传输数据本身的大小比头部还小,一个常见的情况是发送端的"糊涂窗口综合症(Silly Window Syndrome)"。 而Nagle的出现就是为了解决这样的问题的。 Nagle规定任何时候网络中只能存在一个未被确认(未发ACK)的小段(小于MSS)。 Nagle算法的规则 /* Return false, if ...

LU_ZHAO的博客 625

TCP-IP详解:Nagle算法

Small Packet Problem 在使用一些协议通讯的时候,比如Telnet,会有一个字节字节的发送的情景,每次发送一个字节的有用数据,就会产生41个字节长的分组,20个字节的IP Header 和 20个字节的TCP Header,这就导致了1个字节的有用信息要浪费掉40个字节的头部信息,这是一笔巨大的字节开销,而且这种Small packet在广域网上会增加拥塞的出现。

深邃 精致 内涵 坚持 4万+

TPAMI 2025新作LRFormer复现笔记:我的Windows 11 + RTX 4090配置全流程

本文详细记录了在Windows 11系统下使用RTX 4090显卡复现TPAMI 2025顶会论文LRTransformer的完整流程,包括硬件配置、系统优化、Python环境搭建及模型训练中的常见问题解决方案。特别针对Windows平台特有的路径管理、CUDA版本冲突和显存优化等关键技术细节提供了实用指南,帮助开发者高效完成环境搭建和模型训练。

weixin_29094301的博客 414

激光定位算法竞技场:hdl_localization与Cartographer/AMCL的横向技术解剖

本文深入对比了hdl_localization、Cartographer和AMCL三种激光定位算法的技术原理与性能表现。通过UKF-NDT融合、图优化和粒子滤波等核心技术,分析了各算法在结构化环境、动态环境和大尺度场景下的适应性。实验数据表明,Cartographer在全局一致性上表现最优,而AMCL在动态环境中更具鲁棒性。文章还提供了算法选型指南和参数调优技巧,为工程实践提供参考。

weixin_29062865的博客 367

TCP_NODELAY和TCP_CORK nagle算法和cork算法

TCP_NODELAY 默认情况下,发送数据採用Nagle 算法。这样尽管提高了网络吞吐量,可是实时性却减少了,在一些交互性非常强的应用程序来说是不同意的。使用TCP_NODELAY选项能够禁止Nagle 算法。 此时,应用程序向内核递交的每一个数据包都会马上发送出去。须要注意的是,尽管禁止了Nagle 算法,但网络的传输仍然受到TCP确认延迟机制的影响。 TC...

aodiyi6351的博客 198

ESP32Servo库驱动SG90舵机:从入门到精准控制

本文详细介绍了如何使用ESP32Servo库驱动SG90舵机,从硬件连接到软件环境搭建,再到编写示例程序实现精准控制。内容涵盖库安装、基础驱动代码解析、舵机校准方法以及平滑运动控制,帮助开发者快速掌握ESP32控制舵机的核心技能,并提供了电源管理、信号抗干扰等实用避坑指南。

ik678901的博客 900

Nagle算法 TCP_NODELAY和TCP_CORK

Nagle算法 TCP_NODELAY和TCP_CORK Nagle算法 根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。Nagle算法,由Ford Aerospace And Communications Corporation Congestion Cont

petershina的专栏 627

【硬件相关】IB网与以太网核心技术解析及高性能网络部署指南

本文深入解析了IB网与以太网的核心技术差异,包括协议栈、流量控制机制及硬件架构,并提供了高性能网络部署的实战指南。通过对比测试和调优案例,展示了IB网在低延迟和高负载下的优势,以及混合组网中的创新应用,助力超算集群和高效网络部署。

weixin_29311017的博客 101

使用基于物质点法(MPM)的Anura3D模拟沙柱坍塌

本博客使用开源软件Anura3D软件模拟了一个沙柱坍塌的过程,这个软件是基于基于物质点法(MPM)设计的

weixin_59902634的博客 4049

Nagle算法与TCP_NODELAY和TCP_CORK

原文地址:http://blog.youkuaiyun.com/shellching/article/details/5592511 下面摘自:http://hi.baidu.com/zzcqh/blog/item/15f78c363985fd390a55a933.html Nagle算法 TCP_NODELAY和TCP_CORK Nagle算法 根据创建者John N

u010246947的专栏 1169

【UE4】Hierarchical Instanced Static Mesh——一种速度优于Spawn的实例化物体组件

最近需要在场景中实例出很多个相同的模型,位置也很有规律,并且要对它的位置信息进行更新。 但是一个个拖进去实在太麻烦,就发现了Spawn Actor这个蓝图方法,可以实例一个蓝图类在场景中。 但是由于数量较大,实例化的速度太慢,这时发现了一个神奇的组件——Hierarchical Instanced Static Mesh。 新建一个蓝图类,添加该组件,在细节里添加你要实例化的模型对象。 ...

ColorGalaxy 1万+

TCP_CORK配置选项和TCP_NODELAY Nagle算法的异同

TCP_CORK, TCP_NODELAY, TCP Nagle算法

meihualing的专栏 970

华为OD技术面八股文_C++_02

汇总华为OD面试C++方面计数八股文真题,提供详细解答。

qq_45776114的博客 767

YOLOv11 改进 - 特征融合 | 替换 C3k2 涨点:GELAN 融合 CSP+ELAN 提精度

本文介绍了可编程梯度信息(PGI)和广义高效层聚合网络(GELAN)与 YOLOv11 的结合,以解决深度网络数据传输时的信息丢失问题。PGI 能为目标任务提供完整输入信息,计算目标函数以更新网络权重。GELAN 作为轻量级网络架构,由 SPPELAN、ELAN1、RepNCSPELAN4 等模块组成。我们将 GELAN 代码集成进 YOLOv11, 实验脚本显示,结合 GELAN 的 YOLOv11 在 MS COCO 数据集目标检测任务中或有良好表现。

魔改工程师的博客 1243

Nagle算法TCP_NODELAY和TCP_CORK CP_NODELAY

坐公交车,最近在看《网络游戏Server编程》,里面提到了Nagle算法和socket的TCP_NODELAY选项,不是很了解,所以百度了一下,查到以下资料,并收藏。   下面摘自:http://hi.baidu.com/zzcqh/blog/item/15f78c36398

ysdaniel的专栏 1134

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TCP_NODELAY 和 TCP_CORK

TCP nagle 和 cork机制和代码解读

already_skb的专栏 1947

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

TCP选项:TCP_NODELAY和TCP_CORK

Nagle算法 TCP_NODELAY和TCP_CORK Nagle算法 根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程 (称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。Nagle算法 ,由Ford Aerospace And Communications Corporation Conge

学习笔记 952

网络性能优化参数关系解读 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK

……

u013669912的博客 1836

UDP CORK TCP CORK以及TCP NODELAY

UDP CORK TCP CORK以及TCP NODELAY

gdfhhj的博客 360
上一篇: 异常
下一篇: 一对MS内存泄漏查找工具(Leakdiag和LDGrapher)和STL类跨DLL调用引起内存泄漏
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值