zoukankan      html  css  js  c++  java
  • 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算法的话,则可能做不到这一点。

  • 相关阅读:
    Lucene.NET中Field.Index 和 Field.Store的几种属性的用法
    WP7学习笔记(三)
    sql注入
    JSP数据库开发实例
    oracle命令大全(转)
    .net个人涉及
    JavaScript的错误处理之onerror事件的使用方法
    脚本问题。调试
    做到了,你就成熟
    ea8.0
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6490743.html
Copyright © 2011-2022 走看看