UDP实现可靠传输

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: UDP实现可靠传输

引言

上一篇文章TCP和UDP协议详解,我们学习了TCP和UDP协议。了解了UDP是不可靠的传输协议,尽最大能力交付。今天我们就来聊聊如何实现UDP的可靠传输。

一、TCP是如何实现可靠传输的?

在网络中,我们认为传输是不可靠的,而在很多场景下我们需要的是可靠的数据。所谓可靠,指的是数据能够正常收到,且能够顺序收到,于是就有了ARQ协议,TCP之所以可靠就是基于此。

1.1 ARQ协议

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

模式:ARQ协议主要有3种模式:

  • 停等协议(stop-and-wait)
    1、发送方发送数据包,等待对方回复ACK,并且开始计时。
    2、在等待对方回复过程中,停止发送新的数据包。
    3、若在等待时间内收到对方ACK确认,开始发送下个数据包;如果没有收到,会再次发送该数据包,直到收到从接收方发送的ACK。。

存在问题:发送方在未收到上个包的确认不会发送下个数据包,效率太低,基本不用

  • 回退n帧(go-back-n)
    为了克服停等协议长时间等待ACK的缺陷,连续ARQ协议会连续发送一组数据包,然后再等待这些数据包的ACK。回退N帧协议允许发送方在等待超时期间,可以继续发送分组。所有发送的分组,都带有序号。
    在回退N帧协议中,发送方需响应以下三种事件:
    1、上层调用send()时,发送方首先要检查发送窗口是否已满。
    2、接收ACK。在该协议中,对序号为n的分组的确认采取累积确认的方式,表明接收方已正确接收到序号n以前(包括n)的所有分组。
    3、超时。若出现超时,发送方将重传所有已发出但还未被确认的分组。对于接收方来说,若一个序号为n的分组被正确接收,并且按序,则接收方会为该分组返回一个ACK给发送方,并将该分组中的数据交付给上层。在其他情况下,接收方都会丢弃分组。若分组n已接收并交付,那么所有序号比n小的分组也已完成了交付。发送方在发完一个窗口里的所有分组后,会检查最大的有效确认,然后从最大有效确认的后一个分组开始重传。

    分析:如上图所示,序号为2的分组丢失,因此分组2及之后的分组都将被重传。
    总结:GBN采用的技术包括序号、累积确认、检验和以及计时/重传。
  • 选择性重传(selective repeat,SR)
    虽然GBN改善了停等协议中时间等待较长的缺陷,但它依旧存在着性能问题。特别是当窗口长度很大的时候,会使效率大大降低。而SR协议通过让发送方仅重传在接收方丢失或损坏了的分组,从而避免了不必要的重传,提高了效率。
    在SR协议下,发送方需响应以下三种事件:
    1、从上层收到数据。当从上层收到数据后,发送方需检查下一个可用于该分组的序号。若序号在窗口中则将数据发送。
    2、接收ACK。若收到ACK,且该分组在窗口内,则发送方将那个被确认的分组标记为已接收。若该分组序号等于基序号,则窗口序号向前移动到具有最小序号的未确认分组处。若窗口移动后并且有序号落在窗口内的未发送分组,则发送这些分组。
    3、超时。若出现超时,发送方将重传已发出但还未确认的分组。与GBN不同的是,SR协议中的每个分组都有独立的计时器。
1.2 RTT和RTO
  • RTO(Retransmission TimeOut)即重传超时时间。
  • RTT(Round-Trip Time): 往返时延。表示从发送端发送数据开始,到发送端收到来自
    接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。
1.3 流量控制

◼ 双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。

◼ 如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。

◼ 对发送方发送速率的控制,称之为流量控制。

1.4 拥塞控制

二、UDP如何可靠传输?

UDP是传输层协议,本身就是不可靠的,所以只能在应用层来实现了。实现的方式可以参照TCP可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。

2.1 KCP协议

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。

KCP力求在保证可靠性的情况下提高传输速度。

KCP没有规定下层传输协议,但通常使用UDP来实现,至于原因,非常有必要说明,如果不清楚,就不能够真正地了解KCP。

补充:传输层的数据叫作段(segment),网络层的数据叫作包(packet),数据链路层的数据叫作帧(frame),物理层的数据叫作流(stream)。

三、KCP协议的特征

在谈KCP协议的特征前,还是先贴一下KCP协议的数据段格式。

KCP格式

  1. RTO不翻倍

RTO(Retransmission-TimeOut)即重传超时时间,TCP是基于ARQ协议实现的可靠性,KCP也是基于ARQ协议实现的可靠性,但TCP的超时计算是RTO2,而KCP的超时计算是RTO1.5,也就是说假如连续丢包3次,TCP是RTO8,而KCP则是RTO3.375,意味着可以更快地重新传输数据。通过4字节ts计算RTT(Round-Trip-Time)即往返时延,再通过RTT计算RTO,ts(timestamp)即当前segment发送时的时间戳。

  1. 选择性重传

TCP中实现的是连续ARQ协议,再配合累计确认重传数据,只不过重传时需要将最小序号丢失的以后所有的数据都要重传,而KCP则只重传真正丢失的数据。

  1. 快速重传

与TCP相同,都是通过累计确认实现的,发送端发送了1,2,3,4,5几个包,然后收到远端的ACK:1,3,4,5,当收到ACK = 3时,KCP知道2被跳过1次,收到ACK = 4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。1字节cmd = 81时,sn相当于TCP中的seq,cmd = 82 时,sn相当于TCP中的ack。cmd相当于WebSocket协议中的openCode,即操作码。

  1. 非延迟ACK

TCP在连续ARQ协议中,不会将一连串的每个数据都响应一次,而是延迟发送ACK,即上文所说的UNA模式,目的是为了充分利用带宽,但是这样会计算出较大的RTT时间,延长了丢包时的判断过程,而KCP的ACK是否延迟发送可以调节。

  1. UNA + ACK

UNA模式参考特征2和特征4,ACK模式可以参考特征3。4字节una表示cmd = 81时,当前已经收到了小于una的所有数据。

  1. 非退让流控

在传输及时性要求很高的小数据时,可以通过配置忽略上文所说的窗口协议中的拥塞窗口机制,而仅仅依赖于滑动窗口。2字节wnd与TCP协议中的16位窗口大小意义相同,值得一提的是,KCP协议的窗口控制还有其它途径,当cmd = 83时,表示询问远端窗口大小,当cmd = 84时,表示告知远端窗口大小。

4字节conv表示会话匹配数字,为了在KCP基于UDP实现时,让无连接的协议知道哪个是哪个,相当于WEB系统HTTP协议中的SessionID。

1字节frg表示拆数据时的编号,4字节len表示整个数据的长度,相当于WebSocket协议中的len。

文章参考于<零声教育>的C/C++linux服务期高级架构

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
缓存 网络协议 算法
UDP可靠性传输协议kcp
UDP可靠性传输协议kcp
188 1
|
2月前
|
网络协议 网络安全 Python
Python 通过UDP传输超过64k的信息
Python 通过UDP传输超过64k的信息
|
2月前
|
网络协议 网络安全 Python
Python 通过UDP传输超过64k的信息
Python 通过UDP传输超过64k的信息 原创
|
4月前
|
网络协议 网络性能优化
用udp协议传输文件
【7月更文挑战第18天】使用 UDP 协议传输文件 UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输协议。尽管它不像 TCP 那样提供可靠的传输和拥塞控制,但在某些特定场景下,例如对实时性要求较高、能容忍一定数据丢失的情况,也可以用于文件传输。
|
6月前
|
缓存 网络协议 物联网
UDP的可靠性传输
UDP的可靠性传输
182 1
|
6月前
|
缓存 网络协议 NoSQL
基于UDP的可靠性传输协议-KCP简介
基于UDP的可靠性传输协议-KCP简介
217 0
|
6月前
|
缓存 网络协议 网络性能优化
UDP的可靠传输/KCP是怎样练成的
UDP的可靠传输/KCP是怎样练成的
180 0
|
6月前
|
缓存 网络协议 算法
UDP的可靠性传输2
UDP的可靠性传输2
86 0
|
6月前
|
缓存 网络协议 算法
UDP如何实现可靠传输
UDP如何实现可靠传输
139 0
|
6月前
|
缓存 网络协议 算法
UDP的可靠传输
UDP的可靠传输
114 0