3、BDP(Bandwidth-delay product,带宽延迟积)
接收窗口(rwnd)会随每次 ACK 一起发送,而 拥塞窗口(cwnd)则由发送端根据拥塞控制和预防算法动态调整。
无论发送端发送的数据还是接收端接收的数据超过了未确认的最大数据量,都必须停 下来等待另一方 ACK 确认某些分组才能继续。
而 BDP(Bandwidth-delay product,带宽延迟积) 就是 任意时刻处于在途未确认状态的最大数据量。
BDP = 数据链路的容量 * 其端到端延迟
在高速连接的客户端与服务器之间,如果实际传输速度只有可用带宽的几分之一,那窗口大小很可能就是 罪魁祸首。要么因为某一饱和端通告的接收窗口很小,要么因为网络拥堵和丢包导致拥塞窗口重置,更可能因为流量增长过快导致对连接吞吐量施加了限制。
4、TCP 队首(HOL,Head of Line)阻塞
TCP 在不可靠的信道上实现了可靠的网络传输。基本的分组错误检测与纠正、按 序交付、丢包重发,以及保证网络最高效率的流量控制、拥塞控制和预防机制,让 TCP 成为大多数网络应用中最常见的传输协议。
但是,其中的按序交付和可靠交付有时候并不必要,反而会导致额外的延迟,对性能造成负面影响。例如:每个 TCP 分组都会带着一个唯一的序列号被发出,而 所有分组必须按顺序传送到接收端。如果中途有一个分组没能到达接收 端,那么后续分组必须保存在接收端的 TCP 缓冲区,等待丢失的分组重发并到达接 收端。这一切都发生在 TCP 层,应用程序对 TCP 重发和缓冲区中排队的分组一无所 知,必须等待分组全部到达才能访问数据。在此之前,应用程序只能在通过套接字 读数据时感觉到延迟交付。这种效应称为 TCP 的队首(HOL,Head of Line)阻塞。
队首阻塞使得分组到达时间会存在无法预知的延迟变化,而这个时间变化通常被称为抖动。
因此,对于无需按序交付数据或能够处理分组丢失的应用程序,以及对延迟或抖动要求很高的应用程序,最好选择 UDP 等协议。
丢包的反作用力
丢包是让 TCP 达到最佳性能的关键。被删除的包恰恰是一种反馈机制, 能够让接收端和发送端各自调整速度,以避免网络拥堵,同时保持延迟最短。
对与实时性比较强的音视频应用来说,就算有个包丢了,音频编解码器只要在音频中插入一个小小的间歇,就可以继续 处理后来的包。只要间歇够小,用户就注意不到,而等待丢失的包则可能导致音 频输出产生无法预料的暂停。相对来说,后者的用户体验更糟糕。
5、TCP 优化 Tips
1)、TCP 中的关键细节
- 1)、TCP 三次握手增加了整整一次往返时间;
- 2)、TCP 慢启动将被应用到每个新连接;
- 3)、TCP 流量及拥塞控制会影响所有连接的吞吐量;
- 4)、TCP 的吞吐量由当前拥塞窗口大小控制。
大多数情况下,TCP 的瓶颈都是延迟,而非带宽。
2)、服务端配置优化
1)、增大TCP的初始拥塞窗口
加大起始拥塞窗口可以让 TCP 在第一次往返就传输较多数据,而随后的速度提 升也会很明显。对于突发性的短暂连接,这也是特别关键的一个优化。
2)、慢启动重启
在连接空闲时禁用慢启动可以改善瞬时发送数据的长 TCP 连接的性能。
3)、窗口缩放(RFC 1323)
启用窗口缩放可以增大最大接收窗口大小,可以让高延迟的连接达到更好吞 吐量。
4)、TCP快速打开
在某些条件下,允许在第一个 SYN 分组中发送应用程序数据。TFO(TCP Fast Open,TCP 快速打开)是一种新的优化选项,注意,TFO 需要客户端和服务器共同支持。
3)、客户端优化
- 1)、少发或者不发网络情况(请求合并):消除不必要的数据传输本身就是很大的优化。比如,减少下载不必要的资源,或者通过压缩算法把要发送的比特数降到最低。
- 2)、使用 CDN,让通信距离更短:通过在不同的地区部署服务器,把数据放到接近客户端的地方,可以减少网络往返的延迟,从而显著提升 TCP 性能。
- 3)、重用 TCP 连接:把慢启动和其他拥塞控制机制的影响降到最低。
四、UDP 优化
数据报,即一个完整、独立的数据实体,携带着从源节点到目的地节点的足够信息,对这些 节点间之前的数据交换和传输网络没有任何依赖。
1、数据包和分组的区别
数据报(datagram)和分组(packet)是两个经常被人混用的词,实际上它们还是 有区别的。分组可以用来指代任何格式化的数据块,而数据报则通常只用来描述那 些通过不可靠的服务传输的分组,既不保证送达,也不发送失败通知。
IETF 和 W3C 工作组共同制定了一套新 API—— WebRTC(Web Real-Time Communication,Web 实时通信)
。WebRTC 着眼于在浏览器中通过 UDP 实现原生的语音和视频实时通信,以及其他形式的 P2P(Peer-to-Peer,端到端)通信。
2、无协议服务
众所周知,IP 层的主要任务就是按照地址从源主机向目标主机发送数据报。而 数据报 则暗示着:IP 层不保证消息可靠的交付,也不发送失败通知,实际上是把底层网络的不可靠性直接暴露给了上一层。如果某个路由节点因为网络拥塞、负载过高或其他原因而删除了 IP 分组,那么在必要的情况下,IP 的上一层协议要负责检测、恢复和重发数据。
UDP 数据报中的源端口和校验和字段都是可选的。IP 分组的首部也有校验和,应用程序可以忽略 UDP 校验和。因此,UDP 仅仅是在 IP 层之上通过嵌入应用程序的源端口和目标端口,提供了一个“应用程序多路复用”机制。
UDP 的无服务
- 1)、不保证消息交付:不确认,不重传,无超时。
- 2)、不保证交付顺序:不设置包序号,不重排,不会发生队首阻塞。
- 3)、不跟踪连接状态:不必建立连接或重启状态机。
- 4)、不需要拥塞控制:不内置客户端或网络反馈机制。
3、UDP 与网络地址转换器(NAT,Network Address Translator)
1)、连接状态超时
对于较长时间的 UDP 通信,有一个事实上的最佳做法,即引入一个双向 keep-alive
分组,周期性地重置传输路径上所有 NAT 设备中转换记录的计时器。
2)、NAT 穿透
NAT 导致了几个问题,如下所示:
- 1)、内部客户端不知道外网 IP 地址,只知道内网 IP 地址。
- 2)、任何到达 NAT 设备外网 IP 的分组还必须有一个目标端口,而且 NAT 转换表中也要有一个条目可以将其转换为内部主机的 IP 地址和端口号。如果没有这个条目(通常是从外网传数据进来),那到达的分组就会被删除。
为解决 UDP 与 NAT 的这种不搭配,人们发明了很多穿透技术(TURN、STUN、 ICE),用于在 UDP 主机之间建立端到端的连接。
3)、STUN(Session Traversal Utilities for NAT)协议(RFC 5389)
优势
- 1)、应用程序可以获得外网 IP 和端口,并利用这些信息与对端通信;
- 2)、发送到 STUN 服务器的出站绑定请求将在通信要经过的 NAT 中建立路由条目,
使得到达该 IP 和端口的入站分组可以找到内网中的应用程序;
<