udp可靠性传输

udp数据包传输快,但是相对于tcp来说不可靠;而tcp可靠,但是传输速度相比udp没有那么快。所以有些需求需要中和它们的优缺点来中和一下,就出现了一些中间件,比较有名的KCP和QUIC

1 kcp介绍

    KCP是一个快速可靠协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以callback的方式提供给KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。本文传输协议之考虑UDP的情况。
    TCP协议的可靠与无私让使用TCP开发更为简单,同时他的这种设计也导致慢的特点。UDP协议简单,所以它更快。但是,UDP毕竟不可靠的,应用层收到的数据可能是缺失,乱序的。KCP协议就是再保留UDP快的基础上,提供可靠的传输,应用层使用更加简单。
    其它差别,TCP是以字节流的形式,UDP以数据包的形式很多人以为,udp是不可靠的,所以sendto(1000),接受端recvfrom(1000),可能会收到900。这个是错误的。所谓数据报文,就是说UDP是有界的,sendto(300),sendto(500);接受到,recvfrom(1000),recvfrom(1000),那么可能会收到300,500或者其中一个或者都没有收到。
   UDP应用层发送的数据,再接受缓存足够的情况下,要么收到全的,要么收不到。
快速重传会统计之前被跳过包的次数,然后进行重传
TCP慢启动,使得带宽浪费

2 kcp使用方式

1. 创建 KCP 对象:
// 初始化 kcp 对象,conv 为一个表示会话编号的整数,和 tcp 的 conv 一样,通信双
// 方需保证 conv 相同,相互的数据包才能够被认可,user 是一个给回调函数的指针

ikcpcb *kcp = ikcp_create(conv, user);

2. 设置传输回调函数(如 UDP 的 send 函数):
// KCP 的下层协议输出函数,KCP 需要发送数据时会调用它
// buf/len 表示缓存和长度
// user 指针为 kcp 对象创建时传入的值,用于区别多个 KCP 对象

int udp_output(const char
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丰恒谷

你的鼓励是我最大创作动力!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值