当前位置: 首页 > news >正文

【网络编程】TCP、UDP、KCP、QUIC 全面解析

在网络编程和协议学习的过程中,我们经常听到 TCP、UDP、KCP、QUIC 这几个名字。TCP 和 UDP 大家比较熟悉,而 KCP 和 QUIC 则常常让人摸不着头脑:它们到底是什么?和 TCP/UDP 有什么关系?应用场景又在哪里?本文将系统梳理这几个协议,重点解释 KCP 和 QUIC 的原理与运行流程

一、TCP 与 UDP 回顾

1. TCP(Transmission Control Protocol)

特点:

  • 面向连接:通信前必须“三次握手”建立连接。

  • 可靠传输:通过 确认机制(ACK)重传机制 保证数据不会丢。

  • 有序性:接收端收到的数据严格按照发送顺序排列。

  • 字节流:应用层看到的是一条连续的字节流,而不是一段一段的消息。

核心机制:

  • 三次握手:确保双方收发能力正常,并同步初始序列号。

  • 滑动窗口:决定发送端可以连续发多少数据而不用等待确认。

  • 超时重传:一段时间没收到 ACK,就认为丢了,重新发。

  • 流量控制:根据接收方缓冲区大小,避免“塞爆”。

  • 拥塞控制:根据网络情况(丢包、延迟),动态调整发送速度(慢启动、拥塞避免、快速恢复等)。

应用场景:
网页浏览(HTTP/1.1、HTTP/2)、文件传输(FTP)、邮件(SMTP/IMAP)、数据库交互。

缺点:

  • 不保证可靠性,需要上层协议(比如 KCP、QUIC)自己补全。

  • 在复杂网络环境(丢包严重、延迟波动)下,应用必须实现一整套可靠机制。

👉 小结:UDP 就像“快递丢了不管”,快但不稳;适合追求低延迟、能容忍少量丢包的应用。

2. UDP(User Datagram Protocol)

特点:

  • 无连接:直接发,不需要握手。

  • 不可靠:不保证数据一定到达,不保证顺序。

  • 报文传输:一发一收,应用收到的数据就是一个完整报文,不会被拼接或拆分。

机制:

  • 没有流量控制、没有拥塞控制;

  • 丢包、乱序需要应用自己处理;

  • 头部开销小(只有 8 字节),更轻量。

应用场景:

  • 实时性要求高:语音通话(VoIP)、视频会议(Zoom、Teams)、在线游戏、直播。

  • 广播/多播:如 DHCP、组播视频流。

缺点:

  • 不保证可靠性,需要上层协议(比如 KCP、QUIC)自己补全。

  • 在复杂网络环境(丢包严重、延迟波动)下,应用必须实现一整套可靠机制。

👉 小结:UDP 就像“快递丢了不管”,快但不稳;适合追求低延迟、能容忍少量丢包的应用。

二、KCP 协议

1. KCP 是什么?

KCP 是一个 基于 UDP 的可靠传输协议库,由开源社区开发,目标是:

  • 在不改变 UDP 基础的前提下,提供类似 TCP 的可靠性

  • 并且比 TCP 更灵活,能调节“延迟 vs 吞吐”。

  • 用于需要低延迟、可控性强的场景,比如 内网穿透(frp)、游戏加速器、实时应用

一句话:KCP 就是“用 UDP 自己实现了一套 TCP,但更灵活可调”

2. KCP 的核心机制

  • 滑动窗口:和 TCP 类似,保证数据有序收发。

  • UNA(Unacknowledged Number)+ ACK:确认机制,告诉对方哪些包收到了,哪些还没到。

  • 快速重传:比 TCP 更激进,丢包时无需等超时,减少等待延迟。

  • 流模式/报文模式

    • 流模式:像 TCP 一样,数据看作连续字节流。

    • 报文模式:像 UDP 一样,保留消息边界,一次 send 对应一次 recv

3. KCP 的运行流程

  • kcp_create:创建一个会话,绑定到某个 UDP socket。

  • kcp_input:接收 UDP 收到的数据包,交给 KCP 协议层解析(分 ACK、DATA)。

  • kcp_update:定时调用,驱动协议逻辑(发送、重传、窗口滑动、超时检测)。

  • kcp_send:应用层发送数据,KCP 会负责分片、编号、缓存。

  • kcp_recv:应用层接收数据,KCP 会自动重组有序数据,交付给应用。

总结:KCP 就是“用 UDP 自己实现了一套 TCP,但更灵活可调”。

4. KCP 的详细逻辑

  • 发送端:应用层调用 kcp_send → 数据被拆分成片段 → 进入发送队列 → kcp_update 驱动发送 → 等待对方 ACK。

  • 接收端:UDP 收到数据 → kcp_input 解析 → 按序放入接收缓冲 → 有序数据进入接收队列 → 应用层 kcp_recv 拿到完整数据。

  • 重传机制:既有超时重传(RTO),也有快速重传(fastresend),保证低延迟场景下更快恢复。

  • 窗口管理:动态调节发送和接收窗口,避免对方来不及处理。

5. 总结

  • KCP 相当于 “用户态的 TCP”,但比 TCP 更灵活、更可调。

  • 它依赖应用层定时驱动(kcp_update),不像 TCP 那样完全交给内核。

  • 在低延迟、对网络质量敏感的场景(游戏、语音、远程访问)里,KCP 往往比 TCP 表现更好。

三、QUIC 协议

1. QUIC 是什么?

QUIC(Quick UDP Internet Connections)是 Google 提出的基于 UDP 的新一代传输协议,后来被 IETF 标准化为 RFC 9000

它的目标就是:

  • 保留 TCP 的可靠性(丢包重传、有序交付);

  • 结合 UDP 的灵活性(没有三次握手、内核限制少);

  • 直接集成了 TLS 加密(默认就是 HTTPS 的安全等级);

  • 针对现代网络(WiFi、4G/5G、移动切换)优化。

2. QUIC 的核心原理

要理解 QUIC,我们把它和 TCP 对比:

(1) 建立连接更快

  • TCP:需要三次握手 + TLS 握手 → 至少 2-3 个 RTT(往返时延)。

  • QUIC:握手时就内置 TLS,1 RTT 就能建立安全连接,有时甚至 0 RTT(之前有缓存时)。

👉举例:你点开一个 HTTPS 网站,用 TCP+TLS 可能要 100ms 才能真正开始传数据;用 QUIC 可能只要 30-50ms。

(2) 多路复用,避免队头阻塞

  • TCP:一个连接里只有一条数据流,如果一个包丢了,后面的数据都得等(队头阻塞)。

  • QUIC:一个连接里可以开很多条独立的流,某条流丢了包,不影响别的流继续传。

👉举例:你在看视频(流1),同时加载弹幕(流2),TCP 下弹幕丢了包,视频也得卡住;QUIC 下只影响弹幕,不影响视频。

(3) 内置加密

  • TCP:需要额外结合 TLS 才能安全。

  • QUIC:协议本身就强制加密(TLS 1.3),没有“明文 QUIC”。

(4) 支持快速切换网络

  • TCP:换 WiFi、切 4G → 连接断开,需要重建。

  • QUIC:连接 ID 跟 IP、端口解耦,切网络时还能继续用,不用重连。

👉举例:你在地铁上看视频,4G 信号掉了切到 WiFi,TCP 需要重新建立连接,QUIC 可以无感知继续播。

3. QUIC 的运行流程

  1. 握手

    • Client 发起连接,带上 TLS 初始握手数据。

    • Server 回复 TLS 数据,确认连接建立。

    • 1 RTT 完成加密建连,甚至 0 RTT 直接开始传数据。

  2. 数据传输

    • 基于 UDP 包,但 QUIC 内部有序列号、确认号,保证可靠性。

    • 每条流独立传输,不会因丢一个包阻塞整个连接。

  3. 重传与拥塞控制

    • 内置 TCP 类似的机制,但更灵活,能快速更新。

4. QUIC 的应用场景

  • HTTP/3:目前 Chrome、Safari、Firefox、YouTube、Facebook 都在用。

  • 实时通信:比如视频会议、在线游戏,比 TCP 延迟更低。

  • 弱网环境:移动网络频繁切换时,QUIC 比 TCP 更稳定。

0voice · GitHub


文章转载自:

http://WOdCbdCv.fbpdn.cn
http://zssPhaVL.fbpdn.cn
http://twYOEB14.fbpdn.cn
http://jnZSjHD5.fbpdn.cn
http://TCYIXiDx.fbpdn.cn
http://fztXNkKm.fbpdn.cn
http://EDpxYF9A.fbpdn.cn
http://5ELaAXKt.fbpdn.cn
http://J2o6riLZ.fbpdn.cn
http://h01S8NSq.fbpdn.cn
http://LtlCq9xX.fbpdn.cn
http://ECXVZIs6.fbpdn.cn
http://4caZwori.fbpdn.cn
http://Wbinrc4C.fbpdn.cn
http://CyXHIJqa.fbpdn.cn
http://3rYLAGEb.fbpdn.cn
http://uEKxo7MM.fbpdn.cn
http://W4yOniT5.fbpdn.cn
http://NSKpVf45.fbpdn.cn
http://F2uRLWXM.fbpdn.cn
http://38o10nK1.fbpdn.cn
http://oBo3z7J0.fbpdn.cn
http://vP9ziZrc.fbpdn.cn
http://GgDVxgV5.fbpdn.cn
http://Uop1bS9O.fbpdn.cn
http://3k95IMQO.fbpdn.cn
http://dc79RM2x.fbpdn.cn
http://k98IFdpI.fbpdn.cn
http://bjcN4Nqq.fbpdn.cn
http://yDKd1lh9.fbpdn.cn
http://www.dtcms.com/a/379093.html

相关文章:

  • 【1】占位符
  • A2A 中的内存共享方法
  • 力扣704. 二分查找
  • HttpServletRequest vs ServletContext 全面解析
  • 介绍keepalived和LVS
  • NAT技术:SNAT与DNAT区别详解
  • 设计模式-单例桥接命令职责链
  • 数据分析:合并
  • bug:uniCloud报Business Failed, 参数有误retry invoke error
  • 人工智能学习:Transformer结构中的子层连接(Sublayer Connection)
  • 阿里FunASR语音转文字模型搭建
  • Android8 binder源码学习分析笔记(三)
  • sizeof 和 strlen
  • 2025年度4款录音转文字工具横向对比
  • 教资科三【信息技术】— 学科知识(简答题)精简背诵版
  • 滚动列表展示跟随弹框效果
  • readelf 和 ldd 查看文件的依赖
  • 基于社交媒体数据的公众情绪指数构建与重大事件影响分析
  • Cosign 实战:构建可信容器镜像的签名与验证体系
  • 定时器实战:LED闪烁与呼吸灯调试
  • docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式
  • FairGuard aab包签名工具
  • 企业文件图纸全自动加密怎么设置?三步实现自动防护!
  • Redis C++ 实现笔记(I篇)
  • [css] 实现禁止文本被选中
  • MATLAB中进行视觉检测入门教程
  • 人工智能深度学习——多层感知器(人工神经网络)
  • 2025最新超详细FreeRTOS入门教程:第十二章 FreeRTOS调度器与时间片管理
  • 软考系统架构设计师之项目管理篇
  • OpenSTL PredRNNv2 模型复现与自定义数据集训练