KCP】从零开始深入理解KCP原理(含TCP可靠机制原理), 及源码解析。_海洋管家的博客-kcp

最后更新 :2023-01-15 21:08:23

目录

KCP是什么?

KCP商业案例

KCP的实现原理

停等式ARQ协议

确认机制

超时重传

连续ARQ

(1) 回退n帧(go-back-n)ARQ

(2) 选择重传协议(selective repeat)(待补充)

滑动窗口协议

TCP应用的ARQ机制和其他机制(待更新)

接下来看一下KCP和TCP的对比:(待补充)

KCP源码解析

KCP应用场景:(待补充)

参考文章:


查了不少KCP资料,可在很多文章中涉及到多种网络底层术语和符号,对于网络底层不怎么了解的,看的简直头疼,还有对ARQ也缺乏描述,死磕了一段时间的网络底层,才理解起来,因此在这篇文章里会对各个涉及到的网络术语进行解释。主要针对对于网络底层欠缺了解的同学。

大致说一下需要的前置知识,如果本文章没有的话需要单独了解一下。

  1. OSI模型,TCP/Ip模型(重点了解 传输层,网络层,数据链路层,以及这些层的功能和传输单位)
  2. TCP实现原理(含可靠机制,本文章有讲解),UDP实现原理
  3. ARQ(本文章有讲解)

OK开始。

KCP是什么?

官方简介

官方地址:GitHub - skywind3000/kcp: KCP - A Fast and Reliable ARQ Protocol

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。

术语解释:

**带宽:**是指在单位时间(一般指的是1秒钟)内能传输的数据量。网络和高速公路类似,带宽越大,就类似高速公路的车道越多,其通行能力越强。

KCP到底是什么?

严格意义上讲KCP并不是一种网络传输协议,它是为UDP写的可靠传输算法,它是把TCP的主要可靠传输机制移植到了UDP身上,让UDP变的可靠了起来,所以想了解KCP的原理,就得先了解 TCP传输为什么可靠?UDP传输为什么不可靠?

KCP商业案例

  • 明日帝国:Game K17 的 《明日帝国》 (Google Play),使用 KCP 加速游戏消息,让全球玩家流畅联网
  • 仙灵大作战:4399 的 MOBA游戏,使用 KCP 优化游戏同步
  • CC:网易 CC 使用 kcp 加速视频推流,有效提高流畅性
  • BOBO:网易 BOBO 使用 kcp 加速主播推流
  • 云帆加速:使用 KCP 加速文件传输和视频推流,优化了台湾主播推流的流畅度
  • SpatialOS: 大型多人分布式游戏服务端引擎,BigWorld 的后继者,使用 KCP 加速数据传输。

KCP的实现原理

KCP的出发点主要就是为了让UDP变的可靠,大家可以自己先思考一下,如何让UDP变的可靠? 答案就是把TCP的可靠机制移植过来,可TCP的可靠机制是在传输层完成的,而UDP在传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。这就是KCP做法,也是其他UDP可靠算法的做法,在UDP身上套一个可靠机制算法,只不过使用上会有差异而已。

(提示:对于传输层,应用层,链路层不了解的同学,可以先了解一下OSI7层模型,Tcp/ip参考模型) 附上图:

So,了解了TCP可靠传输机制原理,那么等于几乎了解了KCP的实现原理,本文章重点会讲 TCP的可靠机制,然后讲KCP移植了哪些可靠机制,又与Tcp哪些地方不同。

TCP和UDP 可靠简述:

  • 在TCP协议中使用了接收确认和重传机制。使得每一个信息都能保证到达,所以是可靠的。
  • 而UDP是尽力传送,没有应答和重传机制,UDP只是将信息发送出去,对方收不收到也不进行应答。所以UDP协议是不可靠的。

首先来讲讲TCP的可靠传输机制:

说到TCP可靠机制,先说一说自动重传请求(Automatic Repeat-reQuest,ARQ),ARQ是属于OSI模型中数据链路层的错误纠正协议之一,为什么说这个呢?因为TCP传输层的主要可靠传输机制思想来自于ARQ。ARQ因现在链路的性能较好,目前在数据链路层很少采用。 总结成一句话就是TCP的可靠传输机制是在 传输层完成的,而可靠机制原理应用的是ARQ的工作原理。搞懂了ARQ,就搞懂了真谛,当然TCP除了ARQ机制外,还有一些其他机制,本文章先讲ARQ的可靠机制原理后再讲TCP其他机制。

看协议之前先了解涉及到的符号以及术语

**分组:**分组是在互联网中传送数据的单元,把一个报文划分为几个分组后再进行传送,报文为要发送的整块数据。在发送报文之前,先把较长的报文划分成为一个个更小的等长数据段,在每一个数据段前面,加上一些由必要的控制信息组成的首部(header),就构成了一个分组(packet)。 **帧:**所谓数据帧(Data frame),就是数据链路层的协议数据单元,它包括三部分:帧头,数据部分,帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如IP数据包,等等。TCP报文格式相关: **SYN:**同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接。 **FIN:(Finish)**终结一个连接,是TCP/IP关闭连接时的挥手信号。Seq:(Sequence Number) 是序列号,针对自身的,表示我发出去的数据分组,它的序列号。Ack:(Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误,回复的ACK等于 = 发送方seq + 字节数 + 1,代表着已经收到发送方的s数据了, Ack是请求下一个seq数据。 **PSH:**发送(Push)。

RST:重置(Reset)?

**URG:**紧急(Urgent) Seq和Ack是保障TCK可靠传输的根本。

为了方便理解,贴上图,此图是TCP连接和传输过程图:

?

?

接下来看看ARQ的几种典型协议:

  • 停等式ARQ(stop-and-wait)
  • 连续ARQ

(1) 回退n帧(go-back-n) (2) 选择重传协议(selective repeat)

  • 滑动窗口协议(sliding window)

? 回退n帧(go-back-n)和 选择重传协议(selective repeat)是 滑动窗口技术与请求重发技术的结合,又称其为 连续ARQ协议。区别在于对于出错的数据报文的处理机制不同。

停等式ARQ协议

主要讲两个功能

  1. 确认机制
  2. 超时重传

确认机制

  1. 发送方 发送数据,然后暂停发送,等待接收方的ACK确认
  2. 收到 接收方回复的ACK(确认号)
  3. 发送下一个数据

如图:

超时重传

超时重传:只要超过了一段时间还没有收到确认,就认为已发送的帧出错或丢失了,因而重传已发送过的帧。这就叫做超时重传。 以下三种情况会进行超时重传:

  1. 发送方 发送过程中出现差错,导致接收方检测出了差错,丢弃了该数据帧。(发送方未收到确认应答,一直等待,直到超时)
  2. 发送方 发送过程中 丢失了(发送方未收到确认应答,一直等待,直到超时)
  3. 传送延迟: 接收方接收成功后回复了Ack确认,但是由于网络原因延迟了, 也就是Ack确认在发送方超时后才到达。而发送方超时时已经重传了一次, 此时接收方要做的事情:丢弃重复分组,重新发送确认. 发送方如果收到两个或者多个确认,除了第一个确认,丢弃其他确认.

如图:

?

停止等待协议的优点是简单,但缺点是信道的利用率太低,一次发送一条消息,使得信道的大部分时间内都是空闲的。

如下图:

连续ARQ

由于停止等待ARQ协议信道利用率太低,所以需要使用连续ARQ协议来进行改善。这个协议会连续发送一组数据包,然后再等待这些数据包的ACK。 发送方采用流水线传输。流水线传输就是发送方可以连续发送多个分组,不必每发完一个分组就停下来等待对方确认。 如下图所示

(1) 回退n帧(go-back-n)ARQ

发送方:发送方根据窗口大小不用等待接收方的应答,持续的发送多个帧,假如发现已发送的帧中有错误发生,那么从那个发生错误的帧开始及其之后所有的帧全部再重新发送,这就叫回退n帧。

接收方:接收方一般都是采用 累积确认的方式。也就是说接收方不必对收到的分组逐个发送确认。而是在收到几个分组后,对按序到达的最后一个分组发送确认。如果收到了这个分组确认信息,则表示到这个分组为止的所有分组都已经正确接收到了。

如图:

?

在上图中左侧方发送的序列号为0,1的数据,右测方已正确收到,并且回复Ack确认成功,但右侧方在收到序列号为2的数据时,发现错误并丢弃,左侧方等到超时后回退n帧到序列号为2的数据,然后全部重传一遍。

**(2) **选择重传协议(selective repeat)(待补充)

它通过让发送方仅重传那些它怀疑在接收方出错(即丢失或受损)的分组而避免了不必要的重传。选择重传协议只重传真正丢失的分组.

滑动窗口协议

TCP采用可变滑动窗口来实现流量控制。TCP连接的两端交互作用,互相提供数据流的相关信息,包括报文段序列号、ACK号和窗口大小(即接收端的可用空间)。发送端根据这些信息动态调节窗口大小来控制发送,以达到流量控制的目的。每个TCP头部的窗口大小字段表明接收端可用缓存空间的大小。

每个TCP连接的两端都维护一组窗口:发送窗口结构(send window structure)和接收窗口结构(receive window structure)。TCP以字节为单位维护其窗口结构。TCP头部中的窗口大小字段相对ACK号有一个字节的偏移量。发送端计算其可用窗口,即它可以立即发送的数据量。可用窗口(允许发送但还未发送)计算值为提供窗口(即由接收端通告的窗口)大小减去在传(已发送但未得到确认)的数据量。图中P1、P2、P3分别记录了窗口的左边界、下次发送的序列号、右边界。

如下图所示,

?

随着发送端接收到返回的数据ACK,滑动窗口也随之右移。发送端根据接收端返回的ACK可以得到两个重要的信息:一是接收端期望收到的下一个字节序号;二是当前的窗口大小(再结合发送端已有的其他信息可以得出还能发送多少字节数据)。如下图所示

如上文所述,窗口大小是动态变化的,如下图所示,每次发送数据都会附带窗口大小。

?

TCP应用的ARQ机制和其他机制(待更新)

接下来看一下KCP和TCP的对比:(待补充)

其他对比待更新

来自官方对比

  • 选择性重传 vs 全部重传:

TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正丢失的数据包。(也就是TCP采用的是 **回退n帧,**而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都能流畅传输的效果。

KCP源码解析

?

UDP 收到的包,不断通过 kcp_input 喂给 KCP , KCP 会对这部分数据( KCP 协议数据)进行解包,重新封装成应用层用户数据,应用层通过 kcp_recv 获取。应用层通过 kcp_send 发送数据, KCP 会把用户数据拆分 kcp 数据包,通过 kcp_output , 以 UDP ( send ) 的方式发送 。

源码字段中 名词说明:

? 用户数据:应用层发送的数据,如一张图片 2 Kb 的数据

? MTU : 最大传输单元。即每次发送的最大数据

? RTO : Retransmission TimeOut , 重传超时时间。

? c wnd : congestion window , 拥塞窗口,表示发送方可发送多少个 KCP 数据包。与接收方窗口有关,与网络状况(拥塞控制)有关,与发送窗口大小有关。

? Rwnd : receiver window, 接收方窗口大小,表示接收方还可接收多少个 KCP 数据包

? snd_queue :待发送 KCP 数据包队列

? snd_nxt :下一个即将发送的 kcp 数据包序列号

? snd_una :下一个待确认的序列号

KCP应用场景:(待补充)

适用场景是客户端与服务端交互很频繁的游戏。

  1. 帧同步
  2. 状态同步

参考文章:

  1. https://blog.csdn.net/guoweimelon/article/details/50879588?TCP连续ARQ协议和滑动窗口协议
  2. https://www.jianshu.com/p/6a4ec6095f2c?TCP 可靠性保证
  3. https://www.jianshu.com/p/e16ae45239ca?TCP的可靠性传输
  4. https://www.cnblogs.com/blythe/articles/7348812.html??TCP连续ARQ协议和滑动窗口协议
  5. https://wenku.baidu.com/view/75395bdbcc175527062208a1.html?数据链路层(ARQ,PPP)
  6. https://blog.csdn.net/btb5e6nsu1g511eg5xeg/article/details/80165735?分分钟读懂tcp/ip通信协议原理(含视频)
  7. https://blog.csdn.net/weixin_42867972/article/details/82054814?TCP/IP 模型 与 OSI 七层模型的对应关系
  8. https://blog.csdn.net/qq_37653144/article/details/82765098?TCP滑动窗口与流量控制
  9. 其他

- END -

牙膏保质期一般几年(牙膏保质期几年?)

酒店牙膏保质期?1、普遍牙膏的保质期为三年。2、牙膏是有保质期的。在牙膏的盒盖和管尾上...

美国留学外语(外国人上大学选啥专业,原来这些最香……)

他国人上大学选啥专业原本这些最香现在各地高考纷繁出分考生们得绞尽脑汁填志愿了啥专业...