TCP 协议如何保证性能( 四 )


此时接收端收到数据包后,再次返回的数据包就是7001了,因为2001-7000 的数据之前已经收到,并且保存在操作系统内核的接受缓冲区中 。
答复过程中丢失:
对于这部分丢失的确认数据包,不会产生较大影响,因为还可以通过后续 ACK 确定对方收到了哪些数据包 。
从这里我们也就可以看出,窗口的移动以及 ACK 确认号总是根据最小的数据包序号确定,也就是说,即使收到 2001-7000 的数据,假如没有收到1001-2000的数据,那么接受端会一直返回1001提醒发送端,但是这部分数据会被保存在缓冲区中,无须重新发送 。
流量控制
虽然我们通过滑动窗口的方式提高了整体传输效率,但在不同网络环境下窗口大小如果一成不变,很有可能造成性能问题 。为了解决该问题,TCP 提供了根据接收端处理能力,动态改变窗口大小的机制,这个机制也叫流量控制 。
假设窗口大小固定不变:在网络环境较好的场景下,接收端处理无压力,而客户端由于窗口限制每次最多只能发送窗口大小的数据,这就导致整体效率低下,无法发证完整性能、在网络环境较差的场景下,接收端无法跟上客户端的发送效率,大量的数据被暂存在操作系统接收端缓存区中,一旦缓冲区存满后,后续所有客户端发送的数据包都会丢失并且重传,出现这种情况会严重影响效率 。
流量控制的实现非常简单:接受端将自己缓冲区大小放入 TCP 报文首部的窗口模块,通过 ACK 数据包告诉发送端 。该值越大说明网络吞吐量越大,当接收端缓冲区已满时,该值为0 。此时发送端不再发送数据,但定期发送窗口探测报文,通知接收端将新的窗口大小返回给发送端 。
拥塞控制
虽然经过滑动窗口和流量控制,TCP 整体传输效率已经得到了显著提高 。但如果刚建立连接就发送大量数据包的话,假如此时接收端网络传输非常拥堵,就很有可能适得其反,加重接收端的压力 。
为了避免上述问题,TCP 引用了慢启动的思想:建立连接后先发少量的数据探探底,评估一下网络状况,再根据探测结果决定传输量 。
慢启动引入了一个新的概念:拥塞窗口
以上过程属于慢启动阶段的快速增长阶段,拥塞窗口值每次都以指数倍速度提升 。为了使发送端的发送速率上升的不那么快,慢启动又引入了慢启动阈值这个概念,当慢启动的值达到阈值时,不再按指数倍上升,而是线性方式递增 。
拥塞控制的主要功能即找到适合当前网络传输的最大窗口大小,确保数据尽快传输完成,提高效率 。
延迟应答
如果接收端接收到发送端数据后立即返回 ACK,也有可能产生性能的消耗:
举个例子,接收端缓冲区大小为1M,此时它刚刚收到了 512K 的数据,如果立即返回 ACK,则窗口字段的值只能为 512K 。假如服务端本身处理速度较快,那么就可以先等待一段时间,先处理缓冲区中的数据,等待 200ms 之后再返回,之后返回的窗口大小就可能是 1M,因为缓冲区中的数据已经被处理了 。
上述示例中的思想就是延迟应答,更大的窗口值代表更高的吞吐量,间接提高了传输效率 。
一般情况下,延迟应答需要遵守以下两个原则:
一般情况下,N 取2,最大延迟时间取 200ms,根据不同的业务场景可以设置不同的值 。
捎带应答
一般情况下,客户端和服务端都采用一问一答的方式交互,所以我们在发送数据的时候,也可以把 ACK 顺带添加到发送数据的数据包上,这种交互方式也叫捎带应答
如上图所示,主机A 和 主机B 在互相发送数据,在发送数据的过程中将对方上次发送数据的ACK返回 。