kcp 介绍与源代码分析_kcp介绍
KCP介绍
1 简介
KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。
2 技术特性
TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果:
RTO翻倍vs不翻倍:
TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速模式后不x2,只是x1.5(实验证明1.5这个值相对比较好),提高了传输速度。
选择性重传 vs 全部重传:
TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正丢失的数据包。
快速重传:
发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。
延迟ACK vs 非延迟ACK:
TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。
UNA vs ACK+UNA:
ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,而 KCP协议中,除去单独的 ACK包外,所有包都有UNA信息。
非退让流控:
KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。
3 协议定义
3.1 kcp协议
type segment struct {
// 发送端与接收端通信时的匹配数字,发送端发送的数据包中此值与接收端的conv值匹配一致时,接收端才会接受此包
conv uint32
// 改数据包的协议号,协议号有以下枚举:
// IKCP_CMD_PUSH = 81 // cmd: push data,数据包
// IKCP_CMD_ACK = 82 // cmd: ack,确认包,告诉对方收到数据包
// IKCP_CMD_WASK = 83 // cmd: window probe (ask),询问远端滑动窗口的大小
// IKCP_CMD_WINS = 84 // cmd: window size (tell),告知远端滑动窗口的大小
cmd uint8
// 分帧号,由于udp传输有数据包大小的限制,因此,应用层一个数据包可能被分为多个udp包
frg uint8
// 滑动窗口的大小
// 当Segment做为发送数据时,此wnd为本机滑动窗口大小,用于告诉远端自己窗口剩余多少
// 当Segment做为接收到数据时,此wnd为远端滑动窗口大小,本机知道了远端窗口剩余多少后,可以控制自己接下来发送数据的大小
wnd uint16
// timestamp , 当前Segment发送时的时间戳
ts uint32
// Sequence Number,Segment数据包的编号
sn uint32
// una即unacknowledged,未确认数据包的编号,表示此编号前的所有包都已收到了。
una uint32
// rto即Retransmission TimeOut,即超时重传时间,在发送出去时根据之前的网络情况进行设置
rto uint32
// 基本类似于Segment发送的次数,每发送一次会自加一。用于统计该Segment被重传了几次,用于参考,进行调节
xmit uint32
// 即resend timestamp , 指定重发的时间戳,当当前时间超过这个时间时,则再重发一次这个包。
resendts uint32
// 用于以数据驱动的快速重传机制;
fastack uint32
// len uint32 c++版本有数据包的数据长度,go版本无此字段
// 协议数据的具体内容
data []byte
}
3.2 enet协议对比
typedef struct _ENetProtocolHeader
{
enet_uint16 peerID;
enet_uint16 sentTime;
} ENET_PACKED ENetProtocolHeader;
typedef struct _ENetProtocolCommandHeader
{
enet_uint8 command;
enet_uint8 channelID;
enet_uint16 reliableSequenceNumber;
} ENET_PACKED ENetProtocolCommandHeader;
4 流程图
4.1 发送流程
4.2 接收流程
kcp 介绍与源代码分析_kcp介绍相关推荐
- kcp 介绍与源代码分析_KCP-GO源码解析
原标题:KCP-GO源码解析 原文作者:张伯雨 golang技术社区 概念 ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一. ...
- kcp 介绍与源代码分析_Mendel:基于遗传隐喻的源代码推荐
引用:Proceedings of the 2011 26th IEEE/ACM International Conference on Automated Software Engineering, ...
- DataX介绍以及优缺点分析
DataX介绍以及优缺点分析 DataX介绍: DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.ODPS.HBase. ...
- python比较两个列表的重合度_#源代码#超几何分布算法介绍及python下的实现代码...
原标题:#源代码#超几何分布算法介绍及python下的实现代码 超几何分布是统计学上一种离散概率分布.它描述了由有限个物件中抽出n个物件,成功抽出指定种类的物件的次数(不归还). 在产品质量的不放回抽 ...
- 静态代码分析工具列表--常用静态代码分析工具介绍
代码检测简介 本文是一个静态代码分析工具的清单,但是为公司产品需要付费使用.共有37个公司,有些公司包含多个工具.其中27个公司有多语言 工具,1个公司为PHP工具.2个公司为.NET工具.1个公司为 ...
- 动态恶意软件分析工具介绍
网络安全观察者 在本教程中,我们将介绍动态恶意软件分析工具,用于了解恶意软件执行后的行为.本教程是我们恶意软件分析教程中的第2部分.如果您尚未阅读本系列的第1部分,请先阅读本系列教程1,然后再继续这一 ...
- Android Studio CPU profiler性能分析工具介绍和使用详解
Android Studio CPU profiler性能分析工具介绍和使用详解 CPU profiler介绍 Android Studio CPU 性能剖析器可实时检查应用的 CPU 使用率和线程活 ...
- 软件成分分析技术介绍
软件成分分析技术介绍 1.关于软件成分分析 SCA,Software Composition Analysis,软件成本分析是一种对二进制软件的组成部分进行识别.分析和追踪的技术.在开源软件日益盛行的 ...
- 关于直流电源纹波和噪声的测量的分析和介绍
电源纹波和噪声的定义PARD(periodicand random deviation): 1. 电源纹波(Power Ripple): 直流电压/电流中,叠加在直流稳定量上的交流分量,用电压和电流的 ...
最新文章
- Android中的Touch事件处理流程
- info nano shutdown
- HTML/HTML5/CSS/CSS3教程速查手册地址以及如何快速直到webkit的用法
- php怎么循环显示图片,thinkphp 循环显示图片问题!!!~~~~
- C# 改变图片大小的功能代码片段 (wince5)
- Java编程提高性能时需注意的地方
- 感谢宝贝: 带给我别样人生
- linux 有道词典无法屏幕取词,有道词典怎么开启屏幕取词功能 有道词典开启屏幕取词功能方法...
- uniApp实现二维码带中间logo图(uQRCode插件)
- Shiro框架的搭建与使用
- HTML鼠标悬停的语法
- java成语填充,java - 什么是“执行”这个成语?
- Ubuntu(21.04)下UHD(4.1)与Gnuradio安装配置--USRP X410软件无线电平台开发
- pinctrl学习笔记---描述/获得引脚
- android6.0 cta认证,什么是CTA认证?CTA进网许可认证。
- iso shell vg220齿轮油_CLP220齿轮油性能
- 自学系列 | 就谈兴趣!
- 22个免费的图表、流程图工具
- 白话讲懂wait notify 和park unpark的使用示例和区别
- 在web 开发中input file 中调用摄像头
热门文章
- 【转】微信小游戏开发源码_教程_工具_资源最新集合
- 下拉框反选的几种方式
- 利用腾讯 优图visionseed硬件 实现人脸疲劳检测项目(包括数据读取,数据保存,数据web端展示)
- 服务器中了勒索病毒怎么办,服务器中了勒索病毒怎么解决,服务器中了勒索病毒怎么处理
- Python使用adbapi实现MySQL数据库的异步存储
- Azure: Azure AD(For Development)的使用
- JavaScript中BOM和DOM(持续更新)
- 【215】第K个大的数,K相关题目-分治、堆应用
- python并发测试脚本语言_python并发测试脚本
- Superhuman AI for multiplayer poker