重新认识KCP_重新认识一个人的说说

重新认识KCP_重新认识一个人的说说什么是KCP"KCP"是一种网络传输协议(AFastandReliableARQProtocol),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

什么是KCP

KCP是一种网络传输协议(A Fast and Reliable ARQ Protocol),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与接收,只是个纯算法实现可靠传输,它的特点是牺牲带宽来降低延迟。因为TCP协议的大公无私,经常牺牲自己速度来减少网络拥塞,它是从大局上考虑的。而KCP是自私的,它只顾自己的传输效率,从不管整个网络的拥塞情况。举个例子,TCP检测到丢包的时候,首先想到的是网络拥塞了,要放慢自己的速度别让网络更糟,而KCP想到的赶紧重传别耽误事。

TCP的特点是可靠传输(累积确认、超时重传、选择确认)、流量控制(滑动窗口)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)、面向连接。KCP对这些参数基本都可配,也没用建立/关闭连接的过程。

其实KCP并不神秘,因为TCP的高度自治(很多东西都不可配),满足不了如今各种速度需求。而KCP就是基于UDP协议,再将一些TCP经典的机制移植过来,变成参数可配。在这种

怎么使用

KCP只有两个文件,分别是ikcp.cikcp.h,代码行数1300左右。使用KCP和使用TCP有些不同,所以上手之前需要先了解下KCP如何使用,需要时间成本。

第一步,就是创建一个kcp实例,相当于一个句柄。

ikcpcb* ikcp_create(IUINT32 conv, void *user)

第二步,设置发送数据的接口,底层用哪种socket都没问题,只要能把数据发送出去,建议使用UDP,比较简单。

int output(const char *buf, int len, ikcpcb *kcp, void *user)

第三步,更新KCP状态。KCP运行于用户空间,所以需要手动去更新每个实例的状态,其实主要就是检测哪些数据包该重传了。

void ikcp_update(ikcpcb *kcp, IUINT32 current)

第四步,发送数据。调用ikcp_send之后,KCP最后会使用上面设置的output函数来将发送数据(KCP自己并不关心如何发送数据)。

int ikcp_send(ikcpcb *kcp, const char *buffer, int len)

第五步,预接收数据。先手动预接收数据,然后再调用ikcp_input将裸数据交给KCP,这些数据有可能是KCP控制报文,并不是我们要的数据。

int ikcp_input(ikcpcb *kcp, const char *data, long size)

第六步,接收数据。此时收到的数据才是真正的数据,重组操作在调用ikcp_recv之前就完成了。

int ikcp_recv(ikcpcb *kcp, char *buffer, int len)

总体上还是容易理解的,以前我们是直接使用各种socket和对端通信,各种功能由自己控制。现在是在socket之上使用了一个中间件KCP,帮忙实现快速可靠传输功能。注意一下KCP有模式的区分,不同模式下的速度表现不一样,建议把参数配好之后再使用,否则使用的都是默认的参数。

快在哪里

  • 没用使用任何系统调用接口
  • 无需建立/关闭连接(就KCP本身来说)
  • 很多影响速度的参数都可配

使用场景

丢包率高的网络环境下KCP的优点才会显示出来。如果不丢包,那么TCP和KCP的效率不会差别很大,可能就是少了连接建立/关闭而已。一般来讲,在公网上传输的都可以使用,特别是对实时性要求较高的程序,如LOL。

有何缺点

  • 学习成本
  • 据说有些运营商对UDP有限制?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167773.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nand flash用途_flash基础测试试题

    nand flash用途_flash基础测试试题NANDFlash的驱动程序设计http://hong60104.spaces.eepw.com.cn/articles/article/item/892051.   硬件特性:【Flash的硬件实现机制】   Flash全名叫做FlashMemory,属于非易失性存储设备(Non-volatileMemoryDevice),非易失性就是不容易丢失,数据存储在这类设备

    2022年10月21日
    0
  • TB6612FNG电机驱动模块使用说明

    TB6612FNG电机驱动模块TB6612的的用法:TB6612是双驱动,也就是可以驱动两个电机下面分别是控制两个电机的IO口STBY口接单片机的IO口清零电机全部停止,置1通过AIN1AIN2,BIN1,BIN2来控制正反转VM接15V以内电源VCC接2.7v–5V电源GND接地驱动1路PWMA接单片机的PWM口真值表:AIN1 0…

    2022年4月7日
    647
  • Apache配置与应用

    Apache配置与应用一、构建虚拟web主机1、概述2、分类二、构建虚拟web主机1、基于域名搭建虚拟web主机2、基于IP地址的虚拟主机三、构建web虚拟目录与用户授权限制1、创建用户认证数据文件2、添加

    2022年7月1日
    20
  • Java单例模式(Singleton)以及实现「建议收藏」

    Java单例模式(Singleton)以及实现「建议收藏」一.什么是单例模式因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。二.单例模式的特点单例模式只能有一个实例。单例类必须创建自己的唯一实例。单例类必须向其他对象提供这一实例。三.单例模式VS静态类在知道了什么是单例模式后,我想你一定会想到静态类,“既然只使用一个对象,为何不干脆使用静态类?”,这里我会将单例模式和静态类进行一个比较。单例可以继承和被继承,方法可以被override,而静态方法不可以。静态方

    2022年7月7日
    23
  • waypoint_使用jQuery Waypoint创建粘性导航标题

    waypoint_使用jQuery Waypoint创建粘性导航标题在本教程中,我们将创建一个导航栏,当您向下滚动时,它会陪伴您-我们还将在混合中添加一两个two头以对其进行修饰。介绍克里斯·科耶尔(ChrisCoyier)在讨论:before和:after伪元素的优点时说:“每个人都喜欢丝带。”我已经看到这些程式化的三角形边缘的丝带在整个互联网上突然冒出(一个著名的例子是Facebook的IntroducingTimeline页面),尽管它…

    2022年10月21日
    0
  • zookeeper实现分布式锁的两种方式

    zookeeper实现分布式锁的两种方式

    2021年8月3日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号