Nagle和Cork

我觉得这篇讲的不错。

http://blog.csdn.net/c_cyoxi/article/details/8673645

Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段

关闭:通过加TCP_NODELAY选项。

TCP_CORK 选项:

所谓的CORK就是塞子的意思,形象地理解就是用CORK将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去。设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据(不可能让数据一直等待吧)。

Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):

(1)如果包长度达到MSS,则允许发送;

(2)如果该包含有FIN,则允许发送;

(3)设置了TCP_NODELAY选项,则允许发送;

(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;

(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

Nagle算法和CORK算法非常类似,但是它们的着眼点不一样,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。

在用户控制的层面上,Nagle算法完全不受用户socket的控制,你只能简单的设置TCP_NODELAY而禁用它,CORK算法同样也是通过设置或者清除TCP_CORK使能或者禁用之,然而Nagle算法关心的是网络拥塞问题,只要所有的ACK回来则发包,而CORK算法却可以关心内容,在前后数据包发送间隔很短的前提下(很重要,否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。

时间: 2024-10-06 13:38:38

Nagle和Cork的相关文章

TCP

一.简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 二.协议格式 http://toutiao.com/i6312177684323500546/   三.相关技术 1)网络拥塞:慢启动 当一个连接连接上网络的时候,并不应该一次向网络中就发送大量的数据包,否则的话,如果网络链路状况不是很好的情况,这些网络包可能会加重网络拥堵的情况.所以最初TCP连接建立之后,发送网络包的大小是逐渐增长的,最开始是1个

TCP的阻塞和重传

TCP的阻塞和重传 TCP的阻塞和重传机制 网络拥堵 现在网络上大部分的网络请求都是以TCP的方式进行传输的了.网络链路是固定的,各种链路情况也是不一样的.网络拥堵一直是TCP协议设计和使用的时候尽力要避免的.比如,从TCP协议的网络包协议设计来看,TCP使用一发一答的ACK的网络包确认方式,而不是使用NAK这种会增加确认包的方式来做确认机制.这个就是在尽力降低网络上的包传递数量,避免网络拥堵. 还有哪些控制网络拥堵的方式呢? 慢启动 当一个连接连接上网络的时候,并不应该一次向网络中就发送大量的

关于TCP Zero Window Update感知的非常棒的优化

本文从"然而有一种丢包..."开始步入正题.此前的胡扯可以直接跳过.这个周末是搬入新家的第二个周末,感觉整个人比在罗湖时状态更加好了.也许这个房子的色调跟我上海的家更像吧...不管怎么说,这是我到深圳以后第一个感到振作的地方,以前曾经好几次都想离开了,但是这个家让我决定可以继续坚持.说实话我并不喜欢深圳,虽然我比较喜欢下雨,但是喜欢的是那种持续不断的雨,而不是亚热带雨林式的十分钟暴雨十分钟烈日那种.我喜欢的城市是那种纵深的,30公里回家路可以看完一本书的那种...本来嘛,今天想好好睡一

TCP_NODELAY和TCP_CORK nagle算法和cork算法

TCP_NODELAY 默认情况下,发送数据采用Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagle 算法. 此时,应用程序向内核递交的每个数据包都会立即发送出去.需要注意的是,虽然禁止了Nagle 算法,但网络的传输仍然受到TCP确认延迟机制的影响. TCP_CORK 所谓的CORK就是塞子的意思,形象地理解就是用CORK将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去.设置该选项后,内

Nagle算法

用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率 优 点 减少拥塞控制 用 于 自动连接许多的小缓冲器消息 简介 Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率.Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这使福特经营的最早的专用TCP/IP网络减少拥塞控制,从那以后这一方法得

关于TCP CORK的一个细节

国庆长假第二天,研究拥塞控制的绝佳时机.我暂时没钱去非洲观测角马斑马在狮子和鳄鱼虎视眈眈的注目下迁徙,但我可以在家门口观测更壮观的-好久没有写点TCP的东西了,只是看着国庆大堵车,喝着啤酒,就想起了TCP,无假期,不TCP,那就整点儿呗- 很多人都知道TCP的Nagle算法,但知道TCP_CORK的就相对比较少了,一句话,TCP_CORK可以认为是Nagle的增强.和Nagle隐式地不发小包不同,TCP_CORK是显式地阻止小包发送,这个从其名字上也能看得出来,只要用户态没有显式地拔掉塞子,最后

socket.setNoDelay([noDelay]) 用的是Nagle算法

Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息:这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率.Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这是福特经营的最早的专用TCP/IP 网络减少拥塞控制,从那以后这一方法得到了广泛应用.Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指的是应用程序一次产生一字节数据, 这样会导致网络由于太多的包而过载(一个常见的情况是发送端的"愚蠢

delayed ack与nagle's算法

delayed ack和nagles算法都能减少tcp传输过程中的小数据包的问题 tcpip卷二25章中提到tcp为每个连接建立7个定时器: 1.connection established 2.restransmission 3.delayed ack(https://en.wikipedia.org/wiki/TCP_delayed_acknowledgment) 4.persist 5.keepalive 6.fin_wait_2 7.time_wait 下面是wikipedia对nagl

TCP之Nagle算法&&延迟ACK

1. Nagle算法: 是为了减少广域网的小分组数目,从而减小网络拥塞的出现: 该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去:其中小分组的定义是小于MSS的任何分组: 该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发哦送的越快:而在希望减少微小分组数目的低速广域网上,则会发送更少的分组: 2. 延迟ACK: 如果tcp对每个数据包都发送一个ack确认