• 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算法的话,则可能做不到这一点。

  • 相关阅读:
    信息安全系统设计基础第二周学习总结
    java实验报告五
    java实验报告三
    java实验报告二
    java实验报告一
    mysql
    C语言理论知识
    数据存储与输出输入
    软件开发概述 编程语言概述
    C语言 常用单词
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6490743.html
Copyright © 2020-2023  润新知