KCP和UDP


UDPrfc文档

UDP报头的结构


文档中有以下几点值得注意:

Source Port is an optional field, when meaningful, it indicates the port
of the sending process, and may be assumed to be the port to which a
reply should be addressed in the absence of any other information. If
not used, a value of zero is inserted.
源端口是可选的,可以不填

Length is the length in octets of this user datagram including this
header and the data. (This means the minimum value of the length is
eight.)

长度包含头部和数据,2^16=64kb

先进行TCP UDP的对比

  • TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务;
  • TCP 具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP 在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;
  • UDP具有较好的实时性,工作效率较TCP协议高;
  • UDP段结构比 TCP的段结构简单,因此网络开销也小。
  • TCP协议可以保证接收端毫无差错地接收到发送端发出的字节流,为应用程序提供可靠的通信服务。对可靠性要求高的通信系统往往使用TCP传输数据。

什么是KCP

TCP优缺点:
我们知道TCP有超时重传和滑动窗口机制提供了TCP的可靠性和流控特性,滑动窗口和拥塞控制可以使得TCP做到流量控制。
但是TCP协议是从大局上考虑的,大公无私,经常牺牲自己速度来减少网络拥塞。且TCP高度自治,很多参数没法配置。
UDP优缺点:
UDP协议简单,所以它更快。但是,UDP毕竟是不可靠的,应用层收到的数据可能是缺失、乱序的。

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

整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,
而缺乏一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。

技术特点

TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而 KCP是为流速设计的(
单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。
TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。
KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果:

  1. RTO不翻倍
    在丢包的情况下,TCP中RTO会被设置为RTO=2,而KCP中只是RTO=1.5
  2. 选择性重传
    KCP只会选择重传应该被重传的数据
  3. 快速重传
    发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,
    收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。
  4. 延迟ACK vs 非延迟ACK:
    TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 RTT时间,
    延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。

ARQ协议的形式

ARQ协议(Automatic Repeat-reQuest),即自动重传请求,是传输层的错误纠正协 议之一,它通过使用确认和超时两个机制,在不可靠的网络上实现可靠的信息 传输。 ARQ协议主要有3种模式:

即停等式(stop-and-wait)

ARQ适用于发送窗口=1,接收窗口=1

停等协议的工作原理如下:

1、发送方对接收方发送数据包,然后等待接收方回复ACK并且开始计时。

2、在等待过程中,发送方停止发送新的数据包。

3、当数据包没有成功被接收方接收,接收方不会发送ACK.这样发送方在等待一 定时间后,重新发送数据包。

4、反复以上步骤直到收到从接收方发送的ACK.

缺点:较长的等待时间导致低的数据传输速度。

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

发送窗口大小 n > 1,接收窗口 = 1

发送方最多可以连续发送n个数据包,不必等待接收方的ack包。

接收窗口必须按照顺序来接收数据包,如果接收到无序数据包的时候,会发送当前最小的有序数据包的序列号+1作为ack回应包。

接收窗口采用累计确认的方式来发送ack包。

进一步加快了发送效率

选择性重传(selective repeat)ARQ

发送窗口大小 > 1,接收窗口大小 > 1

相较于回退n步协议,选择重选只会重传那些丢失和顺坏的数据包。

比如上面的图片中的接收窗口,200~299的数据包丢失了。

ack是无法满足选择重传的要求的,接收窗口发送一个ack = 200的ack包,只能通知发送端 序列号小于200的数据包都已经被接收了。
当过了超时时间的时候,发送窗口 会将大于200的所有数据包都重新发送。

还有一种实现重传机制的方式叫:SACK( Selective Acknowledgment), 选择性确认。

这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。

如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK 信息发现只有 200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。

posted @ 2024-01-11 09:35  LiviaYu  阅读(119)  评论(0)    收藏  举报