TCP_NODELAY & Nagle 算法
- Get link
- X
- Other Apps
如何用TCP_NODELAY、Nagle算法、QUICKACK和更多设置来优化TCP,以获得更好的TC......。
如果你想真正了解TCP优化技术,如何决定使用哪些技术,以及如何实施这些技术,你就来对地方了。这篇文章太长太丰富了,我们决定把它分成几个部分,并给它一个目录。请欣赏!
1. TCP背景信息,为什么要实施Nagle算法和延迟ACK,以及它们如何相互作用
今天的互联网是一个大型的全球性TCP/IP网络,它可以远距离地发送网页和各种类型的巨大文件。自互联网建立之初,小型学术和政府网络主要使用Telnet和网络控制程序(NCP)协议以来,发生了很多变化。互联网自成立以来已经成倍增长,随着更多类型的流量、设备和协议的上线,有效管理这些流量的重要性也随之增加。
当TCP/IP协议栈在20世纪80年代初成为主导协议时,将Telnet留给了更专业的用途,终于有了优化流量、避免拥堵和数据丢失的设置。不过,即使是现在,要知道何时和如何使用这些设置也是很困难的。本文将明确常见TCP优化设置和技术的一些最佳使用情况,特别是Nagle算法、TCP_NODELAY、延迟ACK和TCP_QUICKACK。
以其创造者John Nagle命名的Nagle算法,是通过减少网络上发送的小数据包数量来提高TCP效率的一种机制。其目的是在应用程序向套接字提供数据相当缓慢的情况下,防止一个节点传输许多小包。如果一个进程导致许多小数据包被传送,它可能会造成不适当的网络拥堵。如果一个数据包的有效载荷比TCP头数据小,这一点尤其正确。
你不会为了搬一个梳妆台而租一整辆搬家车。为什么要在一个40字节的TCP数据包中发送一个1字节的Telnet指令?
这就好比把一个梳妆台装进一辆巨大的搬家卡车,然后开到整个城市。除非这个梳妆台需要立即到达那里,否则你还不如等待,把卡车装满。这就是Nagle算法的作用。Nagle算法是用来优化数据传输的,它将多个小的请求字节合并到一个TCP段中,这样头数据和有效载荷的比例就更有效率。TCP头占用了40个字节,有很多应用程序可以发出一个字节的有效载荷。如果你的环境被配置为立即发送数据,你最终可能会发送一个41字节的数据包,其中只有一个字节的实际有效载荷。
TCP延迟确认或延迟ACK是TCP的一些实现所使用的另一种技术,目的是为了提高网络性能和减少拥堵。延迟ACK的发明是为了减少确认分段所需的ACK数量,并减少协议的开销。延迟ACK是指目的地为延迟ACK计时器的值保留ACK段,大约为200-500ms。延迟ACK意味着TCP不会立即确认每一个收到的TCP段。几个ACK响应可以合并为一个响应,减少协议开销。延迟ACK基本上是由目的地押注200-500毫秒,新的数据包将在延迟ACK定时器到期前到达。虽然在某些情况下,该技术会导致应用性能的降低。
当你决定实施哪种TCP优化方法时,了解其对你的应用的性能影响是很重要的。
Nagle's Algorithm和Delayed ACK是在同一时间创建的,但由于创建者之间缺乏合作,他们提供了一个不完整的、有时是相互冲突的解决方案。John Nagle本人在Hacker News的一个主题中对这种情况表示沮丧,他说。
"这仍然让我恼火。真正的问题不是tinygram的预防。它是ACK延迟,以及那个愚蠢的固定计时器。它们都是在同一时间进入TCP的,但都是独立的。我做了tinygram预防(Nagle算法),伯克利做了延迟ACK,都是在1980年代早期。两者的结合是可怕的。"
2. Nagle算法和延迟ACK在TCP/IP网络中不能很好地配合使用
默认情况下,Nagle算法和延迟ACK在整个网络中被广泛实施,包括互联网。Nagle's算法在任何时候都只允许一个数据包在网络上积极传输,由于Nagle's算法和延迟ACK之间的相互作用,这往往会阻碍流量。因此,Nagle的算法在高度互动的环境中是不可取的。
比如说。如果可以的话,延迟ACK会试图在每个网段中发送更多的数据。但Nagle算法的一部分依赖于ACK来发送数据。Nagle的算法和延迟ACK一起造成了一个问题,因为延迟ACK在等待发送ACK,而Nagle的算法则在等待接收ACK!这就造成了200-300个随机停顿。这就造成了200-500ms的随机停顿,而这些段本来是可以立即发送并交付给接收方栈和上面的应用程序的。
在你需要你的数据立即被传送并且单向延迟很重要的情况下,例如当使用Telnet将用户交互(如按键或鼠标移动)从客户端传送到中央服务器时,关闭Nagle算法可以带来更好的用户体验。但是,对于几乎所有其他的事情,只有往返的时间是重要的,而不是单向的,那么关闭Nagle算法可能没有帮助。
延迟ACK在某些情况下是有帮助的,比如在Telnet中使用字符回波选项时。如果ACK很小,而且不使用很多带宽,那么延迟ACK就没有什么帮助。这些错综复杂的问题使得我们很难判断何时使用Nagle算法、延迟ACK和其他TCP优化选项。
TCP中没有任何东西可以自动关闭Nagle's algorithm或Delayed ACK,所以你必须充分了解你的网络,选择能够提供最佳性能的选项。
3. 什么是TCP_NODELAY和TCP_QUICKACK,它们是做什么的?
了解Nagle算法和延迟ACK之间的相互作用是非常重要的。TCP_NODELAY套接字选项允许你的网络通过禁用Nagle算法绕过Nagle延迟,并在数据可用时立即发送。启用TCP_NODELAY迫使套接字发送其缓冲区内的数据,无论数据包大小如何。要禁用Nagle的缓冲算法,请使用TCP_NODELAY socket选项。要禁用延迟ACK,请使用TCP_QUICKACK套接字选项。
启用TCP_NODELAY选项可以关闭Nagle的算法。如果是交互式应用或有大量握手的聊天协议,如SSL、Citrix和Telnet,Nagle算法会导致性能下降,而启用TCP_NODELAY可以提高性能。
在任何请求-响应应用协议中,请求数据可能大于一个数据包,这可能会人为地在请求者和响应者之间造成几百毫秒的延迟,即使请求者已经适当缓冲了请求数据。在这种情况下,请求者应通过启用TCP_NODELAY来禁用Nagle的算法。如果响应数据可能大于一个数据包,响应者也应该通过启用TCP_NODELAY来禁用Nagle算法,以便请求者能够及时收到整个响应。
4. 关于Nagle延迟、延迟ACK、Tinygrams和傻子窗口综合症的更多资源
- To Nagle or Not to Nagle, That is the Question
- Nagle delays explained
- What Is a Tinygram?
- Tinygrams explained
- What is Silly Window Syndrome
- TCP profile setting for the BIG-IP
5. 我应该启用TCP_NODELAY吗?
6. 如何计算出我是否应该启用TCP_NODELAY?
7. 我如何知道TCP_NODELAY是否有帮助?
8. 如何解决Nagle算法和Delayed ACKs引起的问题?
- Get link
- X
- Other Apps
Comments
Post a Comment