代码之家  ›  专栏  ›  技术社区  ›  Canopus

对Winsock内核缓冲区和Nagle算法的质疑

  •  3
  • Canopus  · 技术社区  · 17 年前

    读书时 this 文章,我有一个疑问。

    我知道,在传输小数据时,默认情况下会启用合并小数据包的Nagle算法。这会导致在传输之前缓存一些数据。我相信Winsock内核缓冲区是缓存发生的地方。如果我错了,请纠正我。

    3 回复  |  直到 17 年前
        1
  •  5
  •   Community Mohan Dere    6 年前

    你提到的知识库文章以这种方式给出了你的答案。。。

    为了优化应用层的性能, Winsock将数据缓冲区从应用程序发送调用复制到Winsock内核缓冲区 . 然后,堆栈使用自己的启发式算法(如Nagle算法)来确定何时实际将数据包放到线路上。

    并且,设置TCP_NODELAY或SO_SNDBUF=0将禁用Nagle算法,如下所示:,

    这个 TCP_节点延迟套接字选项用于禁用Nagle算法

    .


    阅读下面的评论,我意识到您可能会感到困惑,因为设置TCP_NODELAY或设置SO_SNDBUF=0似乎在做相同的事情。如果是这样,请注意 Nagle仅适用于TCP流

    将SO_SNDBUF设置为零会显式停止所有输出缓冲,并尝试对套接字上的每个“写入”立即分派(至少在正常套接字实现中是这样)。

        2
  •  0
  •   a_mole    16 年前

    因此,设置为0的_SNDBUF不会强制在线路上立即发送。

        3
  •  0
  •   Matt.J    16 年前

    隐式禁用nagle;WSK维护的nagle状态独立于缓冲区的位置。它是 你的 负责保持您发布的缓冲区的有效性,直到传输消耗它。