在开始本篇文章之前,试想一个现实问题,如果公交车看见一个人就直接发车,且中途不停车,不停的往返之间,等到把所有人都送到目的地,那车子是不是要冒烟了?
在 TCP 当中也是如此,如果发送端不停地接收发送端发送很小的包,一个本该可以一次完成的事情却被分成了上 N 次。这种频繁的发送是存在问题的,不光是传输的时延消耗,发送和确认本身也是需要耗时的,频繁的发送带来了巨大的时延。
Nagle 算法
TCP 中为了提高网络的利用率,经常使用一个叫作 Nagle 算法,该算法是指发送端即使还有他应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。具体来说,就是仅在下列任意一种条件下才能发送数据,这也是 Nagle 算法的实现规则:
- 如果包长度达到
MSS,则允许发送; - 如果该包含有
FIN字段,则允许发送; - 设置了
TOP_NODEELAY选项,则允许发送; - 为设置
TOP_CORK选项时,若所有出去的小数据包(包长度小于MSS)均被确认,则允许发送; - 上述条件都为满足,但发生了超时,则立即发送;
根据这个算法虽然网络利用率可以提高,但是可能会发生某种程度的延迟,为此,在窗口系统以及机械控制等领域中使用 TCP 时,往往会关闭对该算法的启用。
延迟确认应答
接收数据的主机如果每次都立刻回复确认应答的话,可能会返回一个较小的窗口,那是因为刚接收完数据,缓冲区已满。
当某个接收端收到这个小窗口的通知以后,会以他为上限发送数据,从而降低了网络的利用率。为此引入了一个方法,那就是收到数据以后并立即返回确认应答,而是延迟一段时间的机制:
- 在没有收到
2x最大段长度的数据为止不做确认应答; - 其他情况下,最大延迟
0.5秒或0.2秒;
事实上,大可不必为每一个数据段都进行一次确认应答,TCP 采用滑动窗口的控制机制,因此通常确认应答少一些也无妨,TCP 文件传输中,绝大多数是每两个数据段返回一次确认应答。
携带应答
根据应用层协议,发送出去的消息到达对端,对端进行处理以后,会返回一个回执,例如远程登录中针对输入的字符进行 回送校验 也是对发送消息的一种回执。
回送校验是指在远程登陆中,从键盘中输入的字符到达服务器以后再返回来显示给客户端的意思。
在此类通信当中,TCP 的确认应答和回执数据可以通过一个包发送,这种方式叫作 携带应答,通过这种机制,可以使收发的数据量减少。
携带应答就是你去饭堂打包饭时,顺便在裤带子里面装一份菜,就是顺带,捎带的意思。
另外接收数据以后如果立即返回确认应答,就无法实现捎带应答,而是将所接收的数据与应用处理生成返回数据以后再进行发送请求位置,必须一直等待确认应答的发送。
也就是说没如果没有启用延迟确认应答就无法实现捎带应答,延迟确认应答是能够提高网络利用率而从而降低计算机处理负荷的一种较优的处理机制。
捎带应答是指在同一个 TCP 包中既发送数据又发送确认应答的一种机制。由此网络的利用率会提高,计算机的负荷也会减轻。不过,确认应答必须得等到应用处理完数据并作为回执的数据返回为止,才能进行捎带应答。
参考文献
- 书籍:
图解 TCP;