12 基于UDP实现可靠传输——KCP协议

先看这个:
https://blog.csdn.net/weixin_45842249/article/details/140153866

UDP对比于TCP的优缺点

​ UDP是用户数据报协议,它的传输是面向报文传输。TCP是传输控制协议,面向的是字节流。也就是说UDP的传输单位是整个报文,而TCP的传输最小单位是字节。他们都属于TCP/IP协议中的传输层协议,其都是由操作系统内核协议栈控制的。关于他们的控制逻辑,我们是没有办法轻易更改的。将二者进行对比,它主要由以下几点优缺点区别。

UDP的优点:

  1. 速度快:UDP协议无需建立连接,没有连接建立、维护和拆除的开销,因此数据传输速度快,吞吐效率高。
  2. 实时性好:由于UDP协议没有复杂的控制机制,因此在实时性要求较高的应用中具有显著优势,如在线游戏、视频流传输等。
  3. 适用于广播和多播:UDP协议支持一对多的通信方式,即广播和多播,可以方便地实现多个客户端同时接收数据。
  4. 安全性稍高:由于UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,因此较TCP被攻击者利用的漏洞就要少一些。

UDP的缺点:

  1. 可靠性较低:UDP协议不提供数据包的排序、错误检查和重传机制,因此无法确保数据的可靠传输。数据包可能会丢失、乱序或重复,这在一些对数据完整性要求较高的应用中是不利的。
  2. 无流量控制:UDP协议没有流量控制机制,发送端可能会以超过接收端处理能力的速度发送数据,导致数据丢失或网络拥塞。
  3. 安全性问题:由于UDP协议简单且缺乏安全性设计,它容易受到各种网络攻击,如拒绝服务攻击(DoS)等。

TCP的优点:

  1. 可靠性和顺序性:TCP协议通过三次握手建立连接,并在数据传递过程中有确认、窗口(流量控制)、(超时)重传、拥塞控制机制,确保了数据的可靠传输和顺序性。这使得 TCP适用于需要高可靠性的应用,如需要数据完整性保护的多媒体流或需要按顺序接收数据的实时应用。
  2. 安全性较高:由于TCP具有复杂的控制机制,它可以有效地防止各种网络攻击,如拒绝服务攻击(DoS)等。

TCP的缺点:

  1. 慢:TCP在传递数据之前要先建立连接,这会消耗时间。同时,在数据传递过程中基于TCP首部中信息进行的确认机制、重传机制、拥塞控制机制等都会消耗大量的时间。
  2. 效率低:TCP首部大小本身就比UDP首部大,而且在数据传递时还需要维护需要保持的传输连接,这会导致额外的开销和效率降低。
  3. 占用系统资源高:每个TCP连接都会占用系统的CPU、内存等硬件资源,因此在处理大量并发连接时可能会导致系统资源不足。

KCP和QUIC协议

​ 我们可以看到UDP的缺点是致命的,尽管我们可以知道,UDP传输速度快,但它确是不可靠的。假如我们发送了一段数据过去,如果不能保证对方能够准确收到怎么能行呢。基于这种情况,我们需要对UDP进行改造,那如何改造呢?因为UDP的控制和处理逻辑,是操作系统内核在维护的,我们是没有办法轻易去修改的。所以我们要在应用层,进行控制。也就是说,我们要基于UDP编写一个可靠且可控的传输层协议。基于这种情况,诞生了KCP和QUIC协议。

相似之处:

  1. 目标:两者都旨在提供比传统TCP更快速、更可靠的数据传输。
  2. 基于UDP:KCP和QUIC都基于UDP协议,因此都具有UDP的优点,如无连接、轻量级和快速响应。
  3. 低延迟:两者都通过优化传输策略来降低延迟,特别是在高延迟或高丢包率的网络环境中。

主要区别:

  • 实现方式
    • KCP是一个纯算法实现的协议,它并不直接处理底层UDP数据包的收发,而是需要用户自己定义下层数据包的发送方式,并以callback的方式提供给KCP。KCP内部没有系统调用,整个协议的实现只有ikcp.h和ikcp.c两个源文件,可以方便地集成到用户自己的协议栈中。
    • QUIC则是一个完整的传输层协议,它基于UDP,但同时兼具TCP、TLS和HTTP/2等协议的可靠性与安全性。QUIC在UDP之上实现了连接建立、可靠传输、流量控制、拥塞控制等功能。
  • 连接建立
    • KCP没有专门的连接建立过程,它依赖于用户自行实现底层UDP数据包的收发。
    • QUIC则实现了基于TLS的握手过程,可以实现0-RTT握手,从而加速连接建立和数据传输的过程。
  • 多路复用
    • KCP本身并不支持多路复用,每个KCP连接只能传输一个数据流。
    • QUIC支持在同一连接上同时传输多个数据流,这意味着它可以在一个连接上同时处理多个HTTP请求,从而避免了TCP上的队头阻塞问题,提高了网络利用率和性能。
  • 安全性
    • KCP本身不提供加密功能,但可以通过用户自定义的方式实现加密。
    • QUIC默认支持加密,所有数据在传输过程中都是加密的,提供更高的安全性和隐私保护。
  • 应用场景
    • KCP被广泛用于在线游戏、实时通信、视频直播、P2P通信等领域,特别在对传输稳定性和实时性要求较高的应用中有很好的表现。
    • QUIC则更多地被用于Web应用,如HTTP/3协议就基于QUIC。

相比于kcp来说quic协议更加复杂一些。我们下面只讨论KCP的相关内容。

kcp

KCP是什么

KCP是一个基于UDP实现的可靠传输协议,它在UDP的高效性基础上,通过引入类似于TCP的控制机制,如重传、拥塞控制、流量控制等,实现了数据的可靠传输。不同于TCP的是,KCP在设计时更加注重速度和实时性,使其在许多需要低延迟传输的场景中,比TCP表现更优。
主要特性

  • 快速重传: KCP支持快速重传机制,可以在检测到数据包丢失时立即进行重传,而不需要等待传统的超时重传机制触发,这显著减少了数据的传输延迟。
  • 拥塞控制: KCP实现了简化版的拥塞控制机制,它能够根据网络情况动态调整数据传输速率,减少数据包丢失的情况,保证网络的稳定性。
  • 流量控制: 通过控制发送方和接收方的数据流量,KCP能够避免因为接收方处理不过来而导致的数据溢出问题。
  • 可配置性: KCP允许开发者根据自己的应用场景调整协议的参数,如发送窗口大小、最大重传次数等,这提供了高度的灵活性来优化性能。

这些特性使KCP成为了一个在保持UDP高效性的同时,提供可靠数据传输的强有力工具,特别适合于对实时性要求极高的网络应用

3.1 kcp与TCP对比

关于KCP,我们可以把它理解为我们自定义了一个可靠的传输协议,它的底层协议采用的UDP,对于UDP我们可以理解成,操作系统的协议栈,给我们提供的最小的一个传输单元。我们可以根据业务需求,在此基础之上自定义我们的传输协议。KCP采用了以下手段来保证数据的传输效率和可靠性。

  • 数据包分片:当用户数据很大,大于一个UDP包能承担的范围时,KCP会将用户数据分片存储在多个KCP包中。
  • <

你可能感兴趣的:(C++后端开发,udp,网络协议,网络)