TCP—Nagle算法

本系列文章是博主学习TCP协议以来的个人笔记。博主不能保证本文所述内容绝对正确,所

以请读者抱着怀疑的态度阅读本博客内的文字。如果读者因本博客内的文字造成损失,本人

无力负责。如果有任何谬误或者问题,希望读者不吝赐教。

 

Nagle算法的名字来源于其发明者 John Nagle,该算法主要用于避免过多小分节报文在网
络中传输,从而降低网络容量利用率。比如一个20字节的TCP首部+20字节的IP首部+1个
字节的数据组成的TCP数据报,有效传输通道利用率只有将近1 /40。如果网络充斥着这样
的小分组数据,则网络资源的利用率是相当低下的。

Nagle算法用伪代码的形式可以表示如下:

if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if
Nagle算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的
确认到达之前不能发送其他的小分组。相反TCP收集这些小分组,并在确认到来时以一个
分组的方式发出去。

需要特别强调的是TCP不对ACK报文段进行确认,TCP只确认那些包含了数据的ACK报文
段。TCP/IP详解v1 P203 的例子对于"14,15"报文段与Nagle算法相违背的解释,个人认
为与TCP不回复ACK段有关。书上的解释可能是由于直译导致的错误。否则我真没看懂。-。-!

然而Nagle算法并不是所有场合都需要开启,对于一些需要快速响应,对延时敏感的应用,
比如窗口程序,鼠标响应,一般而言需要关闭Nagle。Socket API用户可以通过套接口
选项TCP_NODELAY来关闭该算法。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值