前情提要
本文章来源于动物书《Web性能》一书中第二章——TCP的构成,仅作为本书的相关知识点摘要,不包括TCP的所有内容。
因特网有两个核心协议,分别是TCP和IP,其中
- IP:位于网络层,是一个无连接的协议。它负责将数据包从源地址传输到目标地址,但不保证传输的可靠性,也不负责数据包的顺序。IP协议主要解决如何将数据从一个主机传输到另一个主机的问题。
- TCP:位于传输层,是一个面向连接的协议。TCP提供可靠的通信服务,它通过建立连接、数据包的确认、重传机制和流量控制等功能,确保数据能够完整且有序地传输到目的地。
三次握手
- SYN——握手信号
- ACK——确认字符
SYN为客户端向服务端发送的信息,而ACK就是服务端向客户端发送的收到信号。
三次握手是TCP协议中用于建立可靠连接的过程,确保通信双方都准备好发送和接收数据。其步骤如下:
-
第一次握手(SYN): 客户端向服务器发送一个SYN(同步序列号)请求报文,表示请求建立连接,并同步序列号。此时,客户端进入“SYN_SENT”状态。
-
第二次握手(SYN-ACK): 服务器收到客户端的SYN报文后,回应一个SYN-ACK报文,表示同意建立连接并同步序列号,同时确认客户端的SYN报文。此时,服务器进入“SYN_RCVD”状态。
-
第三次握手(ACK): 客户端收到服务器的SYN-ACK报文后,发送一个ACK报文,确认已经收到服务器的响应。此时,客户端和服务器都进入“ESTABLISHED”状态,连接建立完成,双方可以开始传输数据。
三次握手的主要目的是保证通信双方的同步性,确认双方的发送和接收能力都正常。
拥塞预防及控制
在进行通信的时候,每个节点(服务器)的缓冲区大小都是一定的,当我们遇到客户端不断地向服务端进行连接,或者是节点之间的带宽不均衡导致传输阻塞,这就需要通过算法或者是规则来避免或改善这种情况。
流量控制
这是一种预防发送端过多向接收端发送数据的机制。TCP连接的每一方都要通告自己的接收窗口(rwnd),其中包含能够 保存数据 的缓冲区空间大小信息。简单来说,就是告诉大家,自己还能装下多少信息,以便发送方和接收方能够进行调整。rwnd贯穿了整个TCP链接生命周期,并且每个ACK分组都会携带相应的最新rwnd值。
窗口缩放
窗口缩放(Window Scaling)是TCP协议中的一个扩展选项,用于在高带宽和高延迟的网络环境中提高数据传输效率。由于TCP窗口大小决定了发送方在未接收到接收方确认之前可以发送的最大数据量,标准的TCP窗口大小被限制在65,535字节(16位字段),在现代高速网络中可能不够用,导致无法充分利用带宽。因此,TCP引入了窗口缩放机制。
窗口缩放的工作原理
窗口缩放因子: 窗口缩放通过在三次握手过程中协商一个缩放因子(Scaling Factor),这个因子可以将窗口大小扩大至最大2^30字节。缩放因子是一个值的指数,窗口大小被计算为基础窗口大小乘以2的缩放因子次方。
三次握手中的协商: 在三次握手的SYN报文中,通信双方可以选择携带窗口缩放选项(TCP option),用于协商窗口缩放因子。如果双方都支持窗口缩放,则在接下来的数据传输过程中将使用协商好的缩放因子。
实际使用中的窗口大小: 一旦协商完成,窗口大小就不再是简单的16位字段所表示的大小,而是该字段值与2的缩放因子次方的乘积。因此,实际的窗口大小可以显著增加,从而在高带宽-延迟产品(Bandwidth-Delay Product,BDP)较大的网络中维持较高的传输速度。
窗口缩放的优点
提升传输效率:在高带宽、高延迟的网络中,使用窗口缩放可以避免窗口大小过小导致的带宽利用率低下问题。
灵活性:允许根据实际网络条件调整窗口大小,适应各种网络环境。
窗口缩放的缺点
实现复杂性:由于窗口缩放涉及到对标准窗口大小的调整和动态计算,需要更复杂的实现和管理。
不向后兼容:如果一方不支持窗口缩放,通信只能回退到不使用窗口缩放的模式,受限于原始的16位窗口大小。
慢启动
发送端和接收端在建立连接之初,谁也不知道带宽是多少,这就需要一个估算机制,并且在后续网络变化中动态改变速度。简单来说,就是将发送端和接收端建立连接之初的速度确定为一个小的数值,然后在后续传输中进行加倍(乘2),只到传输速度达到带宽。
在这里,两端在建立连接的小的数值我们成为拥塞窗口(cwnd)大小。
cwnd的作用:
流量控制
cwnd限制了发送方在没有收到确认(ACK)之前可以发送的数据量。这意味着发送方不能一次性发送大量数据,而是根据网络状况逐步增加发送的数据量。
拥塞避免
通过调整cwnd的大小,TCP能够响应网络的拥塞情况。当网络出现拥塞时,cwnd会减小,从而减少网络负载;当网络状况良好时,cwnd会逐渐增大,以提高传输效率。
工作机制:
慢启动(Slow Start)
当一个TCP连接刚开始时,cwnd的初始值通常较小,每当接收到一个ACK时,cwnd会呈指数增长。这种增长方式会持续到网络中的第一个丢包或达到慢启动门限(ssthresh)。
拥塞避免(Congestion Avoidance)
一旦达到ssthresh,cwnd的增长速度将从指数增长转为线性增长,以避免过快地增加网络负载。
快速重传与快速恢复:当检测到数据包丢失(例如通过接收到重复的ACK),TCP会迅速减少cwnd,并进入拥塞避免阶段,以快速恢复网络的传输能力。
拥塞预防
拥塞预防以丢包为网络拥塞的标志。可以理解为,慢启动是增加速度,而拥塞预防就是减低速度。
一旦网络中的丢包或延迟显现,慢启动结束,进入拥塞避免阶段。在拥塞避免阶段,TCP连接的拥塞窗口(cwnd)不再指数增长,而是缓慢、线性地增加,以减少网络出现拥塞的可能性。
检测拥塞
拥塞避免的核心在于尽早检测到网络出现拥塞的迹象:
当发送方收到三个重复的ACK信号(表示可能有数据包丢失)或超时(表示网络阻塞),表明网络可能发生了拥塞。
一旦检测到拥塞,TCP将缩小cwnd的大小,并进入“拥塞控制”阶段,减少发送速率以缓解网络压力。
带宽延迟积
带宽延迟积(Bandwidth-Delay Product,简称BDP)是网络性能中的一个关键概念,表示在给定带宽和延迟条件下,网络中可以“容纳”的数据量。它反映了网络的吞吐能力与时延的关系,通常用于优化网络传输性能。带宽延迟积是衡量网络传输能力的一个重要指标,它在优化TCP窗口大小、设计网络缓冲区和提高传输效率方面具有广泛的应用。在高延迟高带宽的网络环境中,合理计算和应用BDP,可以显著提升数据传输性能。
队首阻塞
在TCP连接中,如果中途有一个分组没能到达接收端,那么后续分组必须保存在接收端的TCP缓冲区,等待丢失的分组重发并到达接收端。那么这个等待的过程,就是队首阻塞。在TCP连接中,所有分组都必须按顺序交付,这样避免不了因为队首阻塞导致的延迟。如果对延迟要求很高,可以选择UDP协议。