现代网络环境下TCP的缺陷

 

前言

在现代网络通信中,TCP 和 UDP 已经成为事实上的标准协议。绝大多数情况下,TCP 被认为是默认的传输协议,尤其是对可靠性要求较高的应用,比如文件下载和网页加载。然而,随着互联网应用的快速发展,TCP 协议在某些场景下逐渐暴露出性能问题,特别是在对低延迟和高实时性要求极高的场景(如视频聊天和在线游戏)中,TCP甚至出现整体不可用的情况。

尽管 TCP 的设计初衷是为了保证可靠传输,但其顺序传输、拥塞控制和丢包重传机制在这些场景下可能成为瓶颈。因此,越来越多的解决方案选择基于 UDP 实现应用层协议,以满足这些特定场景的需求。

为什么 TCP 会有性能问题?

传输延迟累积

TCP 以可靠性为核心,其可靠传输特性依赖以下机制:

  1. 顺序传输:TCP 确保数据包按照发送顺序到达接收端。如果某一个数据包丢失,TCP 会暂停后续数据包的交付,直到丢失的数据包重传成功。
  2. 丢包重传:一旦检测到数据丢失,TCP 会重发丢失的数据包,但这需要额外的时间。
  3. 拥塞控制:TCP 会根据网络状况调整传输速度,以避免网络过载,但在网络波动较大的情况下,这种机制会显著降低传输速度。

现在我们以视频聊天这个场景为例,在视频聊天中,用户往往更关心当前的、最新的传输数据,而视频数据的特点是丢失了部分数据包并不影响整体数据的可读性。

使用TCP

如果使用TCP进行通讯,当出现数据包丢失,TCP 的阻塞特性会阻塞后续的数据传输,无法满足尽可能快的传输最新的数据流需求,且失去时效性的数据已经没有传输价值了,但是TCP仍然会将这些数据进行顺序的传输。

图1: TCP下的视频数据流传输

如上图所示,数据流的传输会滞后,且这个滞后延时会不断出现累计、消除,无法带来稳定的体验。

使用UDP

相比之下,基于 UDP 的协议通过放弃内置的重传和顺序控制机制,将这些逻辑交给应用层处理:

  • 不阻塞后续数据传输:即使某些数据包丢失,后续的数据包仍然可以继续传输,保持实时性。
  • 自定义丢包处理:应用可以根据需求决定是否重传关键数据,或者通过插值算法平滑丢失数据的影响。
  • 避免拥塞控制限制:UDP 没有内置的拥塞控制,传输速度不会因为网络波动而受限。
图2: UDP下的视频数据流传输

在自定义的UDP传输协议下,数据包之间的传输是独立的,我们可以尽可能的以时效性为主去完成这个传输,忽略部分数据包的丢失。

NAT穿透

在之前的文章中,我们说过NAT(网络地址转换)是为了解决IPv4地址枯竭而引入的机制,它通过将局域网设备的私有地址映射为公网地址,实现多设备共享一个公网 IP。

然而,NAT 的存在限制了外部设备直接与局域网设备的通信,因为NAT默认只允许内部设备发起的连接通过。换言之,一台在NAT子网下的设备,通常是不能被外部主动通过TCP协议访问的。

相比之下,UDP 的无连接特性使其更容易穿透NAT:

  • UDP 无需建立连接:它可以直接发送数据包,而无需像 TCP 那样进行三次握手。
  • NAT 映射规则:当局域网设备通过 UDP 向外发送数据包时,NAT 会为该设备临时打开端口映射,允许外部设备的返回数据通过。
  • UDP 打洞(Hole Punching):通过中继服务器(如 STUN),局域网设备可以获知对方的公网地址,并直接发送数据实现 P2P 通信。

总结

随着互联网应用的不断演进,传统的 TCP 协议虽然在可靠性方面表现卓越,但其延迟累积、NAT 穿透难度高等问题使其在某些场景下显得力不从心。相比之下,基于 UDP 的自定义协议在低延迟、高实时性需求下展现出了巨大优势。

无论是视频聊天还是实时对战游戏,UDP 的高效性和灵活性已经成为这些场景的首选解决方案。未来,随着网络技术的发展,我们或许会看到更多基于 UDP 的创新协议,为实时通信提供更强大的支持。