`
lovecontry
  • 浏览: 1035598 次
文章分类
社区版块
存档分类
最新评论

网络编程之nagle算法和TCP_NODELAY

 
阅读更多

之前写过一篇blog ,描述了用mina的时候写socket发现的一个诡异现象,当时将多个小数据写操作合并成一个写操作,问题就没了。Chenshuo同学还建议我设置TCP_NODELAY,只是后来因为事情忙,也就没有再深究下去。


现在大概明白,是由于nagle算法在捣乱。
TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。
Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。

举个例子,比如之前的blog中的实验,一开始client端调用socket的write操作将一个int型数据(称为A块)写入到网络中,由于此时连接是空闲的(也就是说还没有未被确认的小段),因此这个int型数据会被马上发送到server端,接着,client端又调用write操作写入‘/r/n’(简称B块),这个时候,A块的ACK没有返回,所以可以认为已经存在了一个未被确认的小段,所以B块没有立即被发送,一直等待A块的ACK收到(大概40ms之后),B块才被发送。整个过程如图所示:

这里还隐藏了一个问题,就是A块数据的ACK为什么40ms之后才收到?这是因为TCP/IP中不仅仅有nagle算法,还有一个ACK延迟机制 。当Server端收到数据之后,它并不会马上向client端发送ACK,而是会将ACK的发送延迟一段时间(假设为t),它希望在t时间内server端会向client端发送应答数据,这样ACK就能够和应答数据一起发送,就像是应答数据捎带着ACK过去。在我之前的时间中,t大概就是40ms。这就解释了为什么'/r/n'(B块)总是在A块之后40ms才发出。

如果你觉着nagle算法太捣乱了,那么可以通过设置TCP_NODELAY将其禁用 。当然,更合理的方案还是应该使用一次大数据的写操作,而不是多次小数据的写操作。

分享到:
评论

相关推荐

    tcp/ip协议之 Nagle算法 TCP_NODELAY和TCP_CORK.zip

    Nagle算法 TCP_NODELAY和TCP_CORK.zip

    tcp-Nagle算法讲解

    Nagle算法规定,一个tcp链接上最多只能有一个未被确认的小分组。 如果ack响应到达前,tcp暂时收集待发数据,等到响应ack到达后使用一个分组将待发数据发送出去。 Nagle算法启动的条件,...Tcp提供TCP_NODELAY关闭nag

    Linux关闭Nagle算法,实习Tcp每40ms发一帧

    Linux关闭Nagle算法,实习Tcp每40ms发一帧。

    socket tcp TCP_CORK禁用Nagle实现文件传输速度优化,加速tcp传输速度.zip

    TCP_CORK禁用Nagle实现文件传输速度优化,加速tcp传输速度.zip

    大讲解!一种基于Nagle算法的嵌入式TCP协议.docx

    大讲解!一种基于Nagle算法的嵌入式TCP协议.docx

    TCP_IP详解卷1

    作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 本书适合作为计算机专业学生学习网络的教材和教师参考书。也...

    TCP/IP -- 探寻影响业务性能的隐形杀手

    从iplog参数分析,使用TCP/IP协议来分析问题,如何解决大量数据包重传的问题。

    TCP_IP协议详解卷一

    12.4.3 FDDI和令牌环网络中的多播 134 12.5 小结 134 第13章 IGMP:Internet组管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 加入一个多播组 136 13.3.2 IGMP报告和查询 137 13.3.3 实现...

    基于Nagle算法的嵌入式TCP协议

    随着嵌入式系统的发展,在嵌入式系统中实现网络连接已成为研究热点,广泛使用的廉价8/ 16 位嵌入式处理器的性能不足与... 因此在简化的TCP 协议中引入Nagle 算法,大幅度减少了嵌入式网络中发送的小数据包个数,提高了吞

    嵌入式系统/ARM技术中的基于Nagle算法的嵌入式TCP协议

    随着嵌入式系统的发展,在嵌入式系统中实现网络连接已成为研究热点,广泛使用的廉价8/ 16 位嵌入式处理器的性能不足与网络... 因此在简化的TCP 协议中引入Nagle 算法,大幅度减少了嵌入式网络中发送的小数据包个数,提高

    最新C++网络编程实践视频教程 陈硕

    延迟测量与禁用Nagle_s算法.mkv43.最大容量及伸缩性测试.mkv44.延迟分布于请求数及并发模型的关系.mkv45.过载保护.mkv46.负载均衡.mkv47.负载均衡实例.mkv48.如何进一步适应生产环境.mkv49.代码阅读1:客户端.mkv50....

    TCPIP高效编程:改善网络程序的44个技巧 PDF中文版带书签-目录

    《TCP/IP高效编程:改善网络程序的44个技巧》是TCP/IP 领域历久弥新的经典著作,网络编程人员必备,对TCP/IP 网络编程中存在的各种问题进行了全面解析,旨在帮助读者深入透彻地理解TCP/IP 网络编程。本书组织方式比较...

    TCPIP详解--共三卷

    12.4.3 FDDI和令牌环网络中的多播 134 12.5 小结 134 第13章 IGMP:Internet组管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 加入一个多播组 136 13.3.2 IGMP报告和查询 137 13.3.3 实现...

    TCP/IP详解part_2

    作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 本书适合作为计算机专业学生学习网络的教材和教师参考书。也...

    Redis 客户端连接

    然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送 最大连接数 在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中...

    TCP-IP Winsock编程要点

    Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法。

    基于Nagle算法的嵌入式TCP协议 (2006年)

    嵌入式网络中大量使用长度很小的数据帧,使得网络带宽利用率极低,为此在协议中应用了Na-gl。算法。减少了协议所需带宽,提高了协议的吞吐率。采用NS-2(NetworkSimulator-2)进行的仿真结果表明:该方案是有效的。...

    提高51单片机TCP通信效率的软件方法

    即修改上位机Nagle算法的延时确认时间,以及修改下位机TCP协议程序,实验结果表明:在相同的数据量(4MB)下,经过修改的嵌入式TCP层通信速率在局域网中可以达到40~50 kB·s负一次方,是未修改前的10倍。

    TCP-IP详解卷1:协议

    12.4.3 FDDI和令牌环网络中的多播 134 12.5 小结 134 第13章 IGMP:Internet组管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 加入一个多播组 136 13.3.2 IGMP报告和查询 137 13.3.3 实现...

Global site tag (gtag.js) - Google Analytics