kcp整理流程图
2024-10-15 19:38:39 0 举报
kcp完整流程图
作者其他创作
大纲/内容
获取最后的分片
Y
获取fragmentId
N
isSteam
接收窗口是否允许接收该消息
fragemnt=分片数量-i-1
判断时间差是否超过阈值
遍历sendBuff
isPeek
读取接收的数据
填充最后分片的数据,剩余数据发送给新的分片
设置窗口探针,下次update的时候发送接收窗口大小
结束
重发次数<最大重发次数
最小RTO=当前RTO>>3
通过发送窗口大小,下一个发送消息的id和未收到ack的最小消息id,三个参数确定从sendQueue移动到sendBuff的消息。下一个发送消息的id++
调整慢启动参数=未ack的消息/2拥挤窗口=慢启动参数+快速重发次数
最小未ack消息是否变化
调整慢启动参数=远端可接收窗口/2拥挤窗口=1
下一次刷新时间+=刷新间隔
发送数据
触发重传
isUpdated=true下一次刷新时间=current
根据收到的ack协议的时间更新RTO时间根据确认的消息号移除sendBuff的消息更新最小未ack的消息号
下一次刷新时间=current时间差=0
标记通知远端自己接收窗口的大小
快速重传的消息号是否比最小未ack消息小或者比下一个要发送的消息大
移动消息从receiveBuff到receiveQueue下一个要接收的消息Id++
根据数据大小和MSS计算分片数量
创建分片,填充数据,消息id未设置
遍历receiveQueue读取数据
返回填充最后分片的数据大小
最小RTO=0
fragmentId=0
isUpdated
设置探针等待时间和下次探查远端窗口的时间
发送次数++消息RTO=消息RTO+当前RTO/2重发时间=当前时间+消息RTO
插入消息到receiveBuff按照消息号顺序将receiveBuff移动到receiveQueue接收的下个消息号++
判断读取缓冲区和读取消息的大小
设置探查标记位,下次探查时间和探查等待时间
触发快速重传
推送ack消息
获取当前时间与下一次刷新时间差
更新拥堵窗口和慢启动参数
创建新分片
判断时间差是否小于0
循环读取数据
判断数据正确性
远端窗口探针等待时间=0
设置消息发送时间设置发送消息的接收窗口的大小设置没有收到ack的最小消息Id
发送次数++消息RTO=当前RTO重发时间=当前时间+消息RTO+最小RTO
判断探针标记位:发送和请求接收窗口大小
是否触发了快速重传
ack消息
当前时间>消息重发时间
放入sendQueue
接收数据
调整拥挤窗口最小为1
消息发送次数=0
发送探针消息
检测最后发送分片数据是否已满
遍历sendBuff的消息设置所有比触发的消息号大的消息快速重传++
判断数据长度
刷新kcp
快速重传次数判断
receiveQueue的大小是否从大于接收窗口到小于接收窗口
设置远端窗口大小根据消息里最小未ack消息移除sendBuff中已ack的消息更新最小未ack消息号
普通消息
消息号是否大于要接收的下个消息号
判断是否到达下次探查时间
分片数量>接收窗口
isNoDelay
segment:消息fragment:消息分片MSS:分片数据最大值
发送次数++消息快速重传次数=0重发时间=当前时间+消息RTO
重置远端窗口探针时间为0
判断远端接收窗口大小=0
取窗口大小和拥挤窗口的最小值
从receiveQueue中移除消息
计算发送窗口大小,取远程窗口和本身发窗口的最小值
判断是否启动了拥挤窗口
请求接收窗口消息
抛出异常
添加ack信息下次update推送给远端
返回填充的数据大小
0 条评论
下一页