Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455962
  • 博文数量: 120
  • 博客积分: 3370
  • 博客等级: 中校
  • 技术积分: 1331
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 19:41
个人简介

Just a blog

文章分类

全部博文(120)

文章存档

2017年(1)

2015年(1)

2014年(7)

2013年(12)

2012年(21)

2011年(57)

2010年(21)

分类: 网络与安全

2014-05-26 18:20:27

Nagle算法:只允许一个未被ACK的包存在于网络,它并不管包的大小,因此它事实上就是一个扩展的基于包停-等的协议,而不是基于字节停-等的。Nagle算法完全由TCP协议的ACK机制决定,这会带来一些问题,比如如果对端ACK回复很快的话,Nagle事实上不会拼接太多的数据包,虽然避免了网络拥塞,网络总体的利用。

CORK算法:CORK(塞子),设置TCP_CORK 选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据。
  

  Nagle算法和CORK算法非常类似,但是它们的着眼点不一样,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。如此看来这二者在避免发送小包上是一致的,在用户控制的层面上,Nagle算法完全不受用户socket的控制,你只能简单的设置TCP_NODELAY而禁用它,CORK算法同样也是通过设置或者清除TCP_CORK使能或者禁用之,然而Nagle算法关心的是网络拥塞问题,只要所有的ACK回来则发包,而CORK算法却可以关心内容,在前后数据包发送间隔很短的前提下(很重要,否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。
---from Nagle算法<百度百科>
阅读(1011) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~