UDP可靠传输(KCP))

12 篇文章 0 订阅
9 篇文章 0 订阅


在阅读本文之前,可以先阅读一下之前的 文章,了解tcp是如何保证可靠传输的

本文主要以KCP协议展开讲解,KCP是UDP可靠传输协议

分片

  链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。
  以上为分片百度百科的部分解释,我个人理解就是,用户的数据和MTU之前的关系,数据包每次传输的数据小于等于MTU,那么当用户有一个完整的数据(大于MTU或者数据包剩余大小比这个数据小)时就要分片,分片后,每个分片中的头中有信息用来表示他们属于同一个数据。
  可以参考下面的KCP发送逻辑图,其中图片数据大于MTU,然后分成了两个片,放到两个数据包中,有着相同的头(实际上最后一个头有一个bit不一样,用于区别是否为最后一个分片)

KCP与TCP的区别

1、RTO选择
TCP:每一次超时重传,RTO *= 2(如第一次重传RTO设置为200ms,第二次超时重传就变成400ms,第三次就是800ms)
KCP:每一次超时重传,RTO *= 3

2、重传机制
TCP:回退N帧重传
KCP:选择重传

3、KCP拥有快速重传(跳过多少个包马上重传)(如果使用了快速重传,可以不考虑RTO)
如:发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。 fastresend=2

4、应答机制
TCP:发好几个包应答一次,如果中间有一个包丢了,后序的包都要重传
KCP:每一个包都应答一次

5、UNA与UNA+ACK
TCP:接收方发送UNA=2(代表0,1包收到),发送方可以释放0,1包
KCP:接收方发送UNA=2,发送方释放0,1包,接收方发送ACK0,ACK1,ACK3,ACK4(代表0,1,3,4包收到),接收方释放3,4包,重发2包(窗口大小为5)

6、非退让流控:
KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。

KCP源码流程图

在这里插入图片描述
kcp_updata是定时循环调用的。

KCP发送与接收

发送

在这里插入图片描述
1、调用ikcp_send,将数据放在snd_queue中
2、当snd_buf要发送数据时,会从snd_queue中取数据,snd_queue中的数据被取出来后就释放了
3、当收到应答,snd_buf中对应的数据才会被释放
注意:所有发送数据都是在ikcp_update()中完成

接收

在这里插入图片描述
1、解析到序列号为10和11的包,发现10号包已经收到过了,就丢弃
2、将recv_buf中的分片按顺序插入recv_queue,如上图收到10,11,13号包,但是12号包还没来,就先不把13号包放到recv_queue中,等收到12号包,再顺序放入recv_queue中

发送和接收窗口

1、发送窗口最大值默认是32个包 IKCPSEG(数据包中可能有一个或多个segment(分片))
2、发送窗口是变动的,比如发送窗口为10个包,那此时snd_buf最多缓存10个包

应答列表acklist

1、接收到包后,将序号、时间戳存储到应答表列表。
在ikcp_input函数调用ikcp_ack_push存储应答包。

ickp_ack_push(kcp,sn,ts);// 对报文的确认ACK报文放入ACK列表中

2、发送应答包
在ikcp_flush函数发送应答包
3、应答包解析
在ikcp_input函数进行解析,判断IKCP_CMD_ACK

探测对方接受窗口

ikcp_flush发送探测函数IKCP_CMD_WASK

QUIC

QUIC是在用户态基于udp实现的传输层,它也是实现UDP可靠传输

为什么不在内核中实现

1、quic还是草案,还在不断更新,放入内核中十分复杂
2、放到内核中,就必须要升级系统才能支持,路由器、很多中间设备和防火墙等也要改动

技术参考

视频技术参考:https://ke.qq.com/course/417774?flowToken=1041651

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值