网络学习笔记

2017/04/08 diary

网络

Nagle算法

简单的说是把较小的包组装为更大的包延迟发送

Nagle’s Algorithm 是为了提高带宽利用率设计的算法,其做法是合并小的TCP 包为一个,避免了过多的小报文的 TCP 头所浪费的带宽。如果开启了这个算法 (默认),则协议栈会累积数据直到以下两个条件之一满足的时候才真正发送出去:

  • 积累的数据量到达最大的 TCP Segment Size
  • 收到了一个 Ack

Nagle算法的初衷:避免发送大量的小包,防止小包泛滥于网络,理想情况下,对于一个TCP连接而言,网络上每次只能一个小包存在。

ACK延迟确认

延迟 Ack 包的发送,使得协议栈有机会合并多个 Ack,提高网络性能。

如果一个 TCP 连接的一端启用了 Nagle‘s Algorithm,而另一端启用了 TCP Delayed Ack,而发送的数据包又比较小,则可能会出现这样的情况:发送端在等待接收端对上一个packet的 Ack 才发送当前的 packet,而接收端则正好延迟了此 Ack 的发送,那么这个正要被发送的 packet 就会同样被延迟。当然 Delayed Ack 是有个超时机制的,而默认的超时是 40ms

现代的 TCP/IP 协议栈实现,默认几乎都启用了这两个功能,协议的交互是发送端连续发送两个 packet,然后立刻 read 的时候会出现上面问题。

TCP_NODELAY

通过设置套接字的TCP_NODELAY选项禁用Nagle算法,立即发送

参考:http://www.secbox.cn/hacker/5998.html

TCP_CORK

CORK算法的初衷:提高网络利用率,理想情况下,完全避免发送小包,仅仅发送满包以及不得不发的小包

CORK选项提高了网络的利用率,因为它直接禁止了小包的发送(强调一下,Nagle算法没有禁止小包发送,只是禁止了大量小包的发送)

HTTP长连接/短连接/pipeline连接

Search

    Table of Contents