您的位置:首页 > 理论基础 > 计算机网络

TCP

2015-08-23 11:21 459 查看

前言

近几年来,WPO(Web Performance Optimization,Web 性能优化)产业从无到有, 快速增长,充分说明用户越来越重视速度方面的用户体验。网站的速度越快,用户的黏度,忠诚度以及转化率也会相应的提高。而延迟和带宽是对速度有决定性影响的两个因素。

• 延迟: 分组从信息源发送到目的地所需的时间。

• 带宽: 逻辑或物理通信路径最大的吞吐量。

带宽可以很容易增加,而减少延迟时间则要困难得多。

延迟的组成:

-传播延迟:消息从发送端到接收端需要的时间,是信号传播距离和速度的函数。

-传输延迟:把消息中的所有比特转移到链路中需要的时间,是消息长度和链路速率的函数。

-处理延迟:处理分组首部,检查位错误以及确定分组目标所需的时间。

-排队延迟:到来的分组排队等待处理的时间。

目标:高带宽和低延迟

TCP

因特网有两个核心协议:TCP和IP。TCP负责在不可靠的传输信道上提供可靠的抽象层;IP负责联网主机间的路由选择与寻址。

TCP 负责在不可靠的传输信道之上提供可靠的抽象层,向应用层隐藏了大多数网络 通信的复杂细节,比如丢包重发、按序发送、拥塞控制及避免、数据完整,等等。 采用 TCP 数据流可以确保发送的所有字节能够完整地被接收到,而且到达客户端的 顺序也一样。也就是说,TCP 专门为精确传送做了优化,但并未过多顾及时间。

三次握手

所有TCP连接一开始都要经过三次握手。客户端与服务器端在开始交换数据之前,必须就起始分组序列号(出于安 全考虑,序列号由两端随机生成),以及一些其他相关细节达成一致。

示意图:



SYN:客户端随机选择一个序列号x,并发送一个SYN分组,其中还可能包含其他TCP标志和选项。

SYN ACK:SYN ACK

服务器给 x 加 1,并选择自己的一个随机序列号 y,追加自己的标志和选项,然 后返回响应。

ACK:客户端给 x 和 y 加 1 并发送握手期间的最后一个 ACK 分组。

三次握手之后便可以开始传输数据了。客户端可以在发送 ACK 分 组之后立即发送数据,而服务器必须等接收到 ACK 分组之后才能发送数据。

每次往返都要消耗大量时间,所以三次握手带来的延迟使得每创建一个新 TCP 连接都要付出很大代价。这也决定了提高TCP应用性能的关键在于想办法重用连接。

拥塞预防及控制

流量控制

流量控制是一种预防发送端过多向接收端发送数据的机制。否则,接收端可能因为 忙碌、负载重或缓冲区既定而无法处理。为实现流量控制,TCP 连接的每一方都要 通告自己的接收窗口(rwnd),其中包含能够保存数据的缓冲区空间大小 信息。

第一次建立连接时,两端都会使用自身系统的默认设置来发送 rwnd。

如果客户端和服务器端中其中一端跟不上数据传输,那它可以向发送端通告一个较小的窗口。 假如窗口为零,则意味着必须由应用层先清空缓冲区,才能再接收剩余数据。这个过 程贯穿于每个 TCP 连接的整个生命周期:每个 ACK 分组都会携带相应的最新 rwnd 值,以便两端动态调整数据流速,使之适应发送端和接收端的容量及处理能力。

慢启动

尽管 TCP 有了流量控制机制,但网络拥塞崩溃仍然在 1980 年代中后期浮出水面。 流量控制确实可以防止发送端向接收端过多发送数据,但却没有机制预防任何一端 向潜在网络过多发送数据。换句话说,发送端和接收端在连接建立之初,谁也不知 道可用带宽是多少,因此需要一个估算机制,然后还要根据网络中不断变化的条件 而动态改变速度。

• 拥塞窗口大小(cwnd) 发送端对从客户端接收确认(ACK)之前可以发送数据量的限制。发送端不会通告 cwnd 变量,即发送端和接收端不会交换这个值。







为减少增长到拥塞窗口的时间,可以减少客户端与服务器之间的往返时间。比如, 把服务器部署到地理上靠近客户端的地方。要么,就把初始拥塞窗口大小增加到 RFC 9828 规定的 10 段。

拥塞预防

慢启动以保守的窗口初始化连接,随后的 每次往返都会成倍提高传输的数据量,直到超过接收端的流量控制窗口,即系统 配置的拥塞阈值(ssthresh)窗口,或者有分组丢失为止,此时拥塞预防算法介入。

拥塞预防算法把丢包作为网络拥塞的标志,即路径中某个连接或路由器已经拥堵了, 以至于必须采取删包措施。因此,必须调整窗口大小,以避免造成更多的包丢失, 从而保证网络畅通。

发送端和接收端之间在途未确认的最大数据量,取决于拥塞窗 口(cwnd)和接收窗口(rwnd)的最小值。接收窗口会随每次 ACK 一起发送,而 拥塞窗口则由发送端根据拥塞控制和预防算法动态调整。

无论发送端发送的数据还是接收端接收的数据超过了未确认的最大数据量,都必须停 下来等待另一方 ACK 确认某些分组才能继续。要等待多长时间呢?取决于往返时间!

带宽延迟积

BDP(Bandwidth-delay product,带宽延迟积) :数据链路的容量与其端到端延迟的乘积。这个结果就是任意时刻处于在途未确认 状态的最大数据量。

队首阻塞

虽然 TCP 很流行,但它并不是唯一的选择,而且在某些情况下也不是最佳的选择。 特别是按序交付和可靠交付有时候并不必要,反而会导致额外的延迟,对性能造成 负面影响。

要理解为什么,可以想一想,每个 TCP 分组都会带着一个唯一的序列号被发出,而 所有分组必须按顺序传送到接收端。如果中途有一个分组没能到达接收 端,那么后续分组必须保存在接收端的 TCP 缓冲区,等待丢失的分组重发并到达接 收端。这一切都发生在 TCP 层,应用程序对 TCP 重发和缓冲区中排队的分组一无所 知,必须等待分组全部到达才能访问数据。在此之前,应用程序只能在通过套接字 读数据时感觉到延迟交付。这种效应称为 TCP 的队首(HOL,Head of Line)阻塞。

针对TCP的优化建议

TCP三次握手增加了正正一次往返时间

TCP慢启动将被运用到每个新连接

TCP流量及拥塞控制会影响所有连接的吞吐量

TCP吞吐量由当前拥塞窗口大小控制

服务器性能调优

把主机操作系统升到最新

应用程序调优

能少发就不发

缩短传输距离

重用TCP连接

性能检查清单

把服务器内核升级到最新

确保cwnd大小为10

禁用空闲后的慢启动

确保启动窗口缩放

减少传输冗余数据

压缩要传输的数据

把服务器放到离用户近的地方,以减少往返时间

尽最大可能重用TCP连接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: