降低TCP连接传输延时(TCP/IP超时重传)

提起TCP协议,大多数开发者会想起的有TCP的各种状态以及之间的转换过程,对于TCP相关的系统调用也能如数家珍。但是如果说TCP网络传输究竟有多快,相当一部分开发者就没有概念了。

当前绝大部分网络应用程序都是使用操作系统内核提供的网络协议栈进行通信,因为它足够稳定而高效。但是如果因此就不去了解网络协议栈的设计和实现,那也不能称得上是一个优秀的开发人员。

就Linux而言,内核提供了完整的TCP/IP网络协议栈。它的表现形式为:

1. 使用内核提供的socket API来进行网络通信相关的各种操作,与网络通信相关的各个特性由内核实现,开发者作为用户只需关心各个接口的作用;

2. 内核来完成各种复杂的处理,最后把用户的数据发送给对方,把接收到的对方的数据传递给用户;

3. 内核提供了一系列配置文件,可以通过调整网络相关的多种配置;

4. 网络的稳定性、高效率由内核来负责等等。

剩下来的,对于开发者来说,就是知道内核提供了哪些功能,以及如何使用这些功能。使用TCP连接进行通信是绝大多数网络应用程序的实现方式,但是由于IP报文在网络上传输可能会丢失,超时,TCP/IP协议为TCP连接设置了超时重传机制。

具体来说,当内核网络协议栈,对于一条TCP连接上发送的push包,在很久之后都没有收到对方的确认时,多久之后会重发这个push包呢?

对于Linux来说,Linux遵循着TCP协议的RFC规范,但是这里并不想去探讨Linux如何确定超时重传的间隔时长,也不探讨背后的依据。这里只关心本文的目标:如何降低TCP通信延时。

笔者不喜欢卖圈子,在这里直接说方法:

1. Linux提供了一个内核参数,把文件/proc/sys/net/ipv4/tcp_low_latency里面的数值改为1(当你查看这个文件目录时你也许会惊讶,Linux内核提供了这么多参数,但是自己知道的却寥寥无几,惭愧不?);

echo "1" >/proc/sys/net/ipv4/tcp_low_latency

2. 使用ip-route命令,把rto_min修改掉(Linux内核协议栈会检查ip-route配置项,如果没有配置就使用内核源码中的数值即200ms),命令是:

ip route replace 0.0.0.0/0 via  172.31.223.253 rto_min 30

其中0.0.0.0/0是目标机器(这里即任何机器),172.31.223.253是默认网关,30就是30ms.

你可能感兴趣的:(降低TCP连接传输延时(TCP/IP超时重传))