TCP连接优化

有了最新的内核,我们推荐你遵循如下最佳实践来配置自己的服务器。
• 增大TCP的初始拥塞窗口
加大起始拥塞窗口可以让 TCP 在第一次往返就传输较多数据,而随后的速度提 升也会很明显。对于突发性的短暂连接,这也是特别关键的一个优化。
• 慢启动重启
在连接空闲时禁用慢启动可以改善瞬时发送数据的长 TCP 连接的性能。
• 窗口缩放(RFC 1323) 启用窗口缩放可以增大最大接收窗口大小,可以让高延迟的连接达到更好吞 吐量。
• TCP快速打开
在某些条件下,允许在第一个 SYN 分组中发送应用程序数据。TFO(TCP Fast Open,TCP 快速打开)是一种新的优化选项,需要客户端和服务器共同支持。 为此,首先要搞清楚你的应用程序是否可以利用这个特性。

优化 TCP 性能的回报是丰厚的,无论什么应用,性能提升可以在与服务器的每个连
接中体现出来。下面几条请大家务必记在自己的日程表里:
• 把服务器内核升级到最新版本(Linux:3.2+);
• 确保 cwnd 大小为 10;
• 禁用空闲后的慢启动;
• 确保启动窗口缩放;
• 减少传输冗余数据;
• 压缩要传输的数据;
• 把服务器放到离用户近的地方以减少往返时间;
• 尽最大可能重用已经建立的 TCP 连接。

TCP规范中四种算法

1、慢启动
慢启动重启
除了调节新连接的传输速度,TCP 还实现了 SSR(Slow-Start Restart,慢启动重 启)机制。这种机制会在连接空闲一定时间后重置连接的拥塞窗口。道理很简单, 在连接空闲的同时,网络状况也可能发生了变化,为了避免拥塞,理应将拥塞窗 口重置回“安全的”默认值。
毫无疑问,SSR 对于那些会出现突发空闲的长周期 TCP 连接(比如 HTTP 的 keep-alive 连接)有很大的影响。因此,我们建议在服务器上禁用 SSR。在 Linux 平台,可以通过如下命令来检查和禁用 SSR:
• $> sysctl net.ipv4.tcp_slow_start_after_idle
• $> sysctl -w net.ipv4.tcp_slow_start_after_idle=0

2、拥塞预防
a)流量控制窗口(rwnd)和拥塞控制窗口(cwnd)的值多大合适呢?实际上,计 算过程很简单。首先,假设 cwnd 和 rwnd 的最小值为 16 KB,往返时间为 100 ms:
16 KB=(16×1024×8)
131 072 bit 0.1 s
1 310 720 bit/s = 1 310 720 1 000 000
= 131072 bit
= 1 310 720 bit/s
= 1.31 Mbit/s
不管发送端和接收端的实际带宽多大,这个 TCP 连接的数据传输速率不会超过 1.31 Mbit/s !想提高吞吐量,要么增大最小窗口值,要么减少往返时间。
b)窗口大小的协商与调节由网络栈自动控制,应该会自动调整。但尽管如此,窗 口大小有时候仍然是 TCP 性能的限制因素。如果你怎么也想不通在高速连接的客户 端与服务器之间,实际传输速度只有可用带宽的几分之一,那窗口大小很可能就是 罪魁祸首。要么因为某一饱和端通告的接收窗口很小,要么因为网络拥堵和丢包导 致拥塞窗口重置,更可能因为流量增长过快导致对连接吞吐量施加了限制。

3、快速重发
快速恢复

TCP RWND/CWND

rwnd:对端通告的接收窗口(rwnd)用于流量控制
窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段,显然窗口越大那么数据发送的速度也就越快,但是也有越可能使得网络出现拥塞,如果窗口值为1,那么就简化为一个停等协议,每发送一个数据,都要等到对方的确认才能发送第二个数据包,显然数据传输效率低下。
cwnd:TCP的拥塞控制算法就是要在这两者之间权衡,选取最好的cwnd值,从而使得网络吞吐量最大化且不产生拥塞

慢启动
虽然流量控制可以避免发送方过载接收方,但是却无法避免过载网络,这是因为接收窗口「rwnd」只反映了服务器个体的情况,却无法反映网络整体的情况。
为了避免过载网络的问题,慢启动引入了拥塞窗口「cwnd」的概念,用来表示发送方在得到接收方确认前,最大允许传输的未经确认的数据。「cwnd」同「rwnd」相比不同的是:它只是发送方的一个内部参数,无需通知给接收方,其初始值往往比较小,然后随着数据包被接收方确认,窗口成倍扩大,有点类似于拳击比赛,开始时不了解敌情,往往是次拳试探,慢慢心里有底了,开始逐渐加大重拳进攻的力度。
在慢启动的过程中,随着「cwnd」的增加,可能会出现网络过载,其外在表现就是丢包,一旦出现此类问题,「cwnd」的大小会迅速衰减,以便网络能够缓过来。

实际上接收窗口「rwnd」的合理值取决于BDP的大小,也就是带宽和延迟的乘积。假设带宽是 100Mbps,延迟是 100ms,那么计算过程如下:
BDP = 100Mbps * 100ms = (100 / 8) * (100 / 1000) = 1.25MB
具体可以参考:https://blog.csdn.net/lishanmin11/article/details/77165077

网络工具

1.traceroute 是一个简单的网络诊断工具,可以列出分组经过的路由节点,以及它在 IP 网络中每一跳的延迟。为找到每一跳的节点,它会向目标发送一系列分组,每 次发送时的“跳数限制”都会递增(1、2、3,等等)。在达到跳数限制时,中间 的节点会返回 ICMP Time Exceeded 消息,traceroute 根据这个消息可以计算出每 一跳的延迟。
在 Unix 平台上,可以在命令行运行 traceroute。而在 Windows 平台中,相应的 命令叫 tracert。
2. http://speedtest.net, 可以测试客户端到某个本地服务器的上传和下载速度