网络编程中Nagle算法和Delayed ACK的测试
我们是网络编程的时候,要不要禁止nagle算法呢,下面是一个结论,大家可以参考。再付一个C#可考虑提高网络访问效率的设置:
//是否使用 Nagle 不使用 提高效率
hwr.ServicePoint.Expect100Continue = false;
hwr.ServicePoint.UseNagleAlgorithm = false;
//最大连接数 个人测试感觉不是很明显,可能和自己的代码有关。也可以加这句 ServicePointManager.DefaultConnectionLimit = 50,我就是加这句的。
//hwr.ServicePoint.ConnectionLimit = int.MaxValue;
//数据是否缓冲 false 提高效率 如果涉及到用户登陆的话,还是不要加这一句。我就里就不加了。
//hwr.AllowWriteStreamBuffering = false;
大家还有提高网络访问的方法,欢迎交流一下哦。QQ:1508496092.
结果跟禁用nagle算法的效果类似。既然这样,我们还有什么理由一定要禁用nagle算法呢?通过我在xmemcached的压测中的测试,启用nagle算法在小数据的存取上甚至有一定的效率优势,memcached协议本身就是个连续的请求应答的模型。上面的测试如果在windows上跑,会发现RTT最大会在200ms以上,可见winsock的delayed ack超时是200ms。
最后一个问题,什么情况下才应该禁用nagle算法?当你的应用不是这种连续的请求——应答模型,而是需要实时地单向发送很多小数据的时候或者请求是有间隔的,则应该禁用nagle算法来提高响应性。一个最明显是例子是telnet应用,你总是希望敲入一行数据后能立即发送给服务器,然后马上看到应答,而不是说我要连续敲入很多命令或者等待200ms才能看到应答。
上面是我对nagle算法和delayed ack的理解和测试,有错误的地方请不吝赐教。
最后一个问题,什么情况下才应该禁用nagle算法?当你的应用不是这种连续的请求——应答模型,而是需要实时地单向发送很多小数据的时候或者请求是有间隔的,则应该禁用nagle算法来提高响应性。一个最明显是例子是telnet应用,你总是希望敲入一行数据后能立即发送给服务器,然后马上看到应答,而不是说我要连续敲入很多命令或者等待200ms才能看到应答。
上面是我对nagle算法和delayed ack的理解和测试,有错误的地方请不吝赐教。