性能问题:流量控制和阻塞控制

目录

流量控制

窗口缩放

阻塞控制

慢启动

拥塞避免

慢启动重启


        说到网络性能问题,影响的因素有很多,以前上课时老师讲的主要有时延和带宽两个,时延简单来说就是一条消息从一端发送到另一端接收的时间,长短也有很多方面决定,例如从物理层开始,网络数据在光纤等不同设备上的传输时间不同,网络层上消息会经过路由转发,在路由器上会因为等待发送而产生延迟,一般来说经过的路由器越多,产生的延迟就越大。还有一个重要因素是带宽,网络带宽指的是信道单位时间内可以传输的数据量,把网络带宽比喻成车道来理解就很容易了,带宽越大,单位时间内传输的数据量就越多,就像双车道,三车道,车道数量越多,单位时间内可通过的车辆就越多,交通状况越流畅。这篇日志前半部分大致总结下以前上课的知识,接收窗口和拥塞窗口,当作为后面慢启动和队首阻塞问题的铺垫,还有后面想写的关于HTTP/2的问题。

        想要优化网络性能,通常就是从这两方面入手,现在带宽越来越大,能提升的方面不多,着重是降低延迟。无论是HTTP还是HTTPS,使用的都是TCP传输控制协议,工作方式是使用三次握手协议建立连接,待客户端和服务器端成功建立连接后,才能开始传输数据。我不详细重复三次握手的过程,三次握手需要1.5次RTT(往返时间),RTT往返时间的长短取决于延迟,在这里我想表达的是,如果不使用长连接或重用连接的方式,建立一次连接是相对来说较耗时的,所以这篇日志在如何降低延迟方面,总结了两部分优化,慢启动和队首阻塞问题。

 

流量控制

        说慢启动前,先讲一讲生活中的一个场景,大家有没有发现,下载文件时,无论你家的宽带多高,下载速度总是从几百KB到1M开始,慢慢升上去,当然起始值可能有的更高,在客户端和服务器端三次握手建立连接完成后,假设客户端不断给服务器端发送数据,由于中间会经过很多的光纤电缆,路由转发,尤其是数据到达中间路由时,会被缓存在路由器中,如果服务器端,或者说是接收端的带宽没那么高,而客户端的带宽较高,会出现的问题就是发送端发送的快,接收端接受得慢,越来越多的分组报文被缓存在中间路由里,慢慢的一些路由器缓存被耗尽,降低了网络的性能,甚至阻塞整个网络。为了解决上面这些问题,TCP在接收端采用的方式是流量控制。

窗口缩放

        相信大家都知道,接收方每次发送ACK包时都会带上自己的接收窗口的大小,告诉发送方接下来允许发送的数据范围和字节序列,发送方接收到ACK包后,根据接收窗口rwnd的大小选择发送的数据和数据量,如果发送方发现接收方的接收窗口比较小时,就会选择发送少量的数据,或者暂停发送,以缓解网络的负担。在HTTP和HTTPS网站中,窗口缩放都应该要开启:

例如在Ubuntu下可以使用命令来打开窗口缩放:

sysctl –w net.ipv4.tcp_window_scaling=1

然后查看是否启用了窗口缩放:

sysctl net.ipv4.tcp_window_scaling

        接收窗口的方式是在接收端进行流量控制,由于TCP传输控制协议是全双工的,也就是一个会话中,发送方和接收方可以同时进行接收和发送数据,这个大家都了解,在发送端,为了防止发送过多的分组,导致这些分组在中间路由里缓存,可能导致网络瘫痪的问题,在每个TCP连接初始化时,发送端会设置拥塞窗口cwnd来控制发送的数据包。

 

阻塞控制

       一般来说发生阻塞的原因带宽资源不足,中间路由缓存满,物理链路过载等,防止过多的数据一下子涌入到网络中。和流量控制有点不同,上面的接收窗口方式主要是保护两端的主机,是端对端的保护,防止数据量太大处理不过来而瘫痪,阻塞控制能保护到主机,路由和物理链路各个部分,更加“全面”。

慢启动

        在阻塞控制方面,TCP使用的是拥塞窗口cwnd机制,正如上面所说,每个TCP连接初始化时都会设置拥塞窗口,大小是动态变化的,取决于当前的网络状况,默认的大小是十个MSS(max segment size),一个MSS表示的是一个TCP包的最大传输大小。

        发送方第一次发送的数据量是拥塞窗口的大小,发送完后,等待接收方发来的ACK包和接收窗口,如果网络状况好,接收没问题,那么发送方就会根据算法慢慢增大拥塞窗口的大小,发送更大的数据量,这样一步一步递增,最后达到一个峰值,这个峰值通常就是接收方所能接受的最大的数据量,这种拥塞窗口的处理机制就是慢启动,上面说到的那个情景,为什么我们平时下载资源时,速度总是一步一步提升上去的原因,处于一种对网络的保护,防止一下子大量数据涌入网络,因为物理链路过载,中间路由缓存满问题导致的网络阻塞,甚至瘫痪。

拥塞避免

        虽然慢启动可以让拥塞窗口从一个很低的值慢慢上升,但是通常cwnd的值都是加倍地增长的,目的是为了最大化利用网络带宽的资源,如果网络的带宽很高,但由于慢启动的限制,网络上传输的数据量不多,就没有充分地利用宽带的资源了。当然,拥塞窗口的增长速度过快,也会导致大量数据涌入网络,导致拥塞,所以在启用了慢启动的基础上,如果发送方发现网络拥塞了,那么就要启用拥塞避免算法。判断网络出现拥塞的方法就是当发送方发送报文数据后,如果没有在规定时间间隔内收到接收方的确认报文,那么就可以认为出现了网络拥塞,为了防止拥塞窗口cwnd因增长速度过快导致的网络拥塞,TCP设置了一个ssthresh变量,标识当前应该使用的网络策略。

      当拥塞窗口的值小于ssthresh时,使用慢启动算法,拥塞窗口慢慢增长,通常是加倍增长;当拥塞窗口的值大于ssthresh时,使用拥塞控制算法,停用慢启动算法。拥塞控制算法就是当发送方判断出当前网络出现拥塞后,将ssthresh的值设置成发送窗口的1/2,并将拥塞窗口cwnd的值重置为1,再重启慢启动算法,逐步增加拥塞窗口的值,这样做能够进一步缓解网络的压力,让中间路由有时间处理掉自己缓存队列中的分组数据。

慢启动重启

        在慢启动中还有一个机制用来保护网络资源,就是慢启动重启,当通信双方建立连接后,长时间没有进行数据的发送,那么TCP就会重置拥塞窗口到初始值,防止突然大量数据的发送,这就是慢启动重启机制。当然慢启动重启还是有不足的地方,如果HTTP和HTTPS网站支持长连接的话,使用慢启动重启,发送的数据量又从小慢慢递增,会降低网络的性能,不能充分利用带宽资源,所以通常慢启动重启是不开启的:

使用sysclt –w net.ipv4.tcp_slow_start_after_idle=1命令关闭慢启动重启,然后sysclt net.ipv4.tcp_slow_start_after_idle命令查看慢启动重启的开启状态。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章