UDP协议实现可靠网络传输策略

1 可靠性传输

UDP的可靠性,其实是借鉴TCP可靠性传输的策略,并且化繁为简取其精华。首先我们需要了解TCP是如何保证可靠性的。

1.1 常见保证可靠性的策略有哪些?

(1)ACK机制
(2)重传机制
(3)序号机制
(4)重排机制
(5)窗口机制

ACK机制比较好理解,即当接收到包即发送ACK进行确认。序号机制和重排机制用的也比较多,网络接收到数据包有可能是乱序的这时候需要在发送之初把每一个包的序号先加上,接收到之后进行重排即可。重传和窗口机制比较复杂,下面分开阐述。

1.2 重传机制
1.2.1 重传的三种策略
1. 停等协议
这是一种比较古老的方式,效率比较低,主要是每发送一帧数据后需要接收到对方的回复之后才发送下一帧数据,主要是用于对话的模式,一问一答。

在这里插入图片描述

2. 回退N帧重传
这种方式目前TCP仍然有在使用,就是发送一串连续的包,当中间存在丢包的情况后,会回复确认连续收到包的最大值,对应丢包以后的数据包都需要重传。

在这里插入图片描述

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

3. 选择性重传

从上面回退N帧的方式发现比较浪费带宽,因此想到一一个方式,就是我们只重传对方丢失的包。可以正向告诉发送端,哪一个报文丢失,重传丢失报文即可。

1.2.2 重传的时机
(1)发送方没有收到ack,则重传对应的报文;
(2)接收方收到的序号有缺失,这时候发送信息告诉发送方重传相应的包。

1.2 流量控制
1. 流量控制的目的
主要是是为了保证网络带宽的通畅,防止带宽浪费,而引入的机制,主要是在发送方进行流量的控制,即控制发送方的发送速率。
2. 流量控制原理
利用发送端和接收端的窗口进行调节当前的流量。边界条件,当接收端窗口为0时,发送方需要终止发送。即没有可以接收的空间,需要终止发送。
3. 终止发送后,什么时候恢复发送速率?
(1)接收端读数据时,需要更新窗口给发送方。
(2)隔一段时间发一个探测包去询问。接收方需要回应窗口大小。

1.3 拥塞控制
这里介绍两种策略,这幅图估计大部分人都不陌生。

1.3.1 慢启动

慢启动:其实并不慢主要是起点低,从一个包开始发送,然后指数递增。

1.3.2 快速恢复

快速恢:快速恢复并不快采用的是线性递增的方式,主要是起点高从阈值的一半开始。

1.4 基本概念
RTO:
定时器超时时间,即超时后需要进行数据包重传。
注意:
tcp超时计算:第一次重传时间:RTO2,连续丢包三次之后变成:RTO8,延迟非常大。
RTT:
网络往返时延,需要记录发送方和接收方的时间戳。

2 UDP可靠性设计

基于应用层的可靠传输,udp可靠设计没有万精油,需要根据具体的使用场景。

2.1 协议设计

协议设计:
|同步字|总字节大小|分片数|分片编号|载荷大小|预留|荷载|
typedef struct packet
{
    int recv_pieces;								//当前已经接收的数量;
    int total_size; 								//总数据大小
    int left; 										//最后一片大小
    int paiece_size; 								//分片大小
    int recv_len;  									//接收数据长度
    uint8_t *recv_buf;								//保存接收数据
    uint8_t * send_pt; 								//指向发送数据buffer
   	uint8_t piece_buf[PIECE_FIX_SIZE+HEAD_SIZE+1] ;	//单帧的buf
   	circular_buffer_t *circular_buffer; 			//环形缓存
}packet;

2.2 具体实现
这里不展开写具体实现,但是需要注意的几个点,UDP可靠性传输需要考虑的几个点,一个是重传机制,丢包需要进行重传,可以用ACK也可以用NACK的方式;第二是重排机制,我们在收到乱序数据一定需要增加一个缓冲区进行数据重排;第三是超时机制,长时间没收收到对方的回复需要进行重试;第四,流量控制,在局域网内一般是不考虑这部分,实现起来比较复杂,收益不是那么大。

3 UDP使用场景

  1. 实时性考虑
  2. 资源消耗考虑

具体场景主要包括下面几方面:

1 音视频通话(网络延时,tcp不可以控制重传,延时太大,udp可以控制重传时间);
2 游戏开发(实时性操作:王者荣耀;传输位置,延迟会造成卡顿)
3 DNS查询(一问一答;一个包就可以,丢包直接重发就行)
4 物联网设备监控,用电池(活跃状态耗电,睡眠,发送数据量不大)
5 心跳机制 监测设备在不在线心跳包

4 UDP编程需要注意的一些坑

4.1UDP乱序问题
一般采用接收缓冲区进行排序

4.2 发送包大小
sendto一次发送1400字节
需要小于最小的MTU,以太网数据帧一般是1500字节
经验值:1400 (实时通讯)500(游戏)主要是包比较小有一定的优先权
4.3 接收数据
recvfrom一次需要完整读取报文
udp一次只能收一个包,没有边界问题(报文传输)
tcp一次可以收一部分数据,有黏包问题(流式传输)

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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有正常模式和快速模式两种,通过以下策略 达到提高流速的结果: 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都能流畅传输的效果。 基本使用 创建 KCP对象: // 初始化 kcp对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双 // 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针 ikcpcb *kcp = ikcp_create(conv, user); 设置回调函数: // KCP的下层协议输出函数,KCP需要发送数据时会调用它 // buf/len 表示缓存和长度 // user指针为 kcp对象创建时传入的值,用于区别多个 KCP对象 int udp_output(const char *buf, int len, ikcpcb *kcp, void *user) {  .... } // 设置回调函数 kcp->output = udp_output; 循环调用 update: // 以一定频率调用 ikcp_update来更新 kcp状态,并且传入当前时钟(毫秒单位) // 如 10ms调用一次,或用 ikcp_check确定下次调用 update的时间不必每次调用 ikcp_update(kcp, millisec); 输入一个下层数据包: // 收到一个下层数据包(比如UDP包)时需要调用: ikcp_input(kcp, received_udp_packet, received_udp_size); 处理了下层协议的输出/输入后 KCP协议就可以正常工作了,使用 ikcp_send 来向 远端发送数据。而另一端使用 ikcp_recv(kcp, ptr, size)来接收数据。 协议配置 协议默认模式是一个标准的
序言 前言 第1章 引言 1.1 计算机网络的产生和发展 1.2 计算机网络的功能 1.3 计算机网络分类 1.3.1 局域网 1.3.2 城域网 1.3.3 广域网 1.3.4 互联网 1.3.5 无线网 1.4 网络体系结构 1.4.1 协议分层 1.4.2 服务类型 1.4.3 服务原语 1.5 ISO/OSI参考模型 1.5.1 参考模型 1.5.2 模型评价 1.6 本书的结构 第一部分 数据通信 第2章 数据通信基础知识 2.1 基本概念 2.1.1 信号与通信 2.1.2 模拟通信 2.1.3 数字通信 2.2 数据通信基础理论 2.2.1 信号的频谱和带宽 2.2.2 信道的截止频率与带宽 2.2.3 信道的最大数据传输率 2.3 传输介质 2.3.1 双绞线 2.3.2 同轴电缆 2.3.3 光纤 2.3.4 无线介质 2.4 多路复用 2.4.1 频分多路复用 2.4.2 波分多路复用 2.4.3 时分多路复用 2.5 数据交换技术 2.5.1 电路交换 2.5.2 报文交换 2.5.3 分组交换 2.6 调制解调器 2.6.1 调制方式 2.6.2 Modem标准 2.6.3 Modem分类 2.6.4 工作模式 2.7 小结 习题 第3章 物理层接口 3.1 RS-232-C接口 3.1.1 机械特性 3.1.2 电气特性 3.1.3 功能特性 3.1.4 过程特性 3.1.5 空Modem电缆 3.2 其他接口 3.2.1 RS-449接口 3.2.2 RS-530接口 3.3 小结 习题 第二部分 底层物理网络 第4章 广域网 4.1 广域网结构 4.1.1 虚电路和数据报 4.1.2 两者比较 4.2 广域网实例 4.2.1 PSTN 4.2.2 X.25 4.2.3 DDN 4.2.4 帧中继 4.2.5 SMDS 4.2.6 B-ISDN/ATM 4.3 各种广域网的比较 4.4 小结 习题 第5章 局域网 5.1 介质访问控制协议 5.1.1 ALOHA协议 5.1.2 CSMA协议 5.1.3 CSMA/CD协议 5.2 以太网和IEEE 802.3 5.2.1 物理层标准 5.2.2 MAC协议 5.2.3 性能分析 5.3 令牌环网和IEEE 802.5 5.3.1 MAC协议 5.3.2 管理与维护 5.3.3 性能分析 5.4 网桥 5.4.1 透明网桥 5.4.2 源选径网桥 5.5 小结 习题 第6章 高速局域网 6.1 FDDI网络 6.1.1 与OSI的关系 6.1.2 帧格式 6.1.3 MAC协议 6.1.4 工作原理 6.1.5 拓扑结构 6.1.6 网络容错 6.1.6 技术指标 6.2 快速以太网 6.3 千兆位以太网 6.4 局域网交换机 6.5 小结 习题 第三部分 网络互联 第7章 网络互联与TCP/IP 7.1 网络互联层次 7.1.1 应用级互联 7.1.2 网络级互联 7.2 TCP/IP参考模型 7.3 TCP/IP参考模型的特点 7.3.1 TCP/IP的两大边界 7.3.2 IP层的地位 7.3.3 TCP/IP的可靠性思想 7.3.4 TCP/IP模型的特点 7.4 TCP/IP与ISO/OSI 7.5 小结 习题 第8章 IP 8.1 IP数据报 8.1.1 数据报格式 8.1.2 地址格式 8.2 IPv6 8.2.1 固定头部格式 8.2.2 IPv6地址 8.2.3 扩展头部 8.3 小结 习题 第9章 ARP、RARP和ICMP 9.1 ARP和RARP 9.1.1 ARP 9.1.2 RARP协议 9.1.3 报文格式 9.2 ICMP 9.2.1 ICMP报文类型 9.2.2 ICMP报文格式 9.2.3 ICMP差错报文 9.2.4 ICMP控制报文 9.2.5 ICMP请求/应答报文 9.3 小结 习题 第10章 IP路由协议 10.1 路由器与路由选择 10.1.1 路由器 10.1.2 路由选择 10.2 Internet结构 10.3 基本路由算法 10.3.1 D-V路由算法 10.3.2 L-S路由算法 10.4 IGP:内部网关协议 10.4.1 RIP 10.4.2 IGRP 10.4.3 OSPF协议 10.5 外部网关协议EGP 10.6 Internet组播 10.6.1 组播协议 10.6.2 组的维护 10.6.3 组播范围 10.7 移动IP路由 10.8 无类域间路由 10.9 小结 习题 第11章 传输协议TCPUDP 11.1 传输层基本原理 11.1.1 服务质量 11.1.2 传输层端口 11.2 UDP 11.2.1 UDP报文格式 11.2.2 UDP伪头部 11.2.3 UDP多路复用 11.3 TCP 11.3.1 TCP报文格式 11.3.2 TCP连接端点 11.3.3 TCP可靠传输 11.3.4 TCP流量控制 11.3.5 TCP拥塞控制 11.3.6 TCP连接建立 11.3.7 TCP连接删除 11.3.8 TCP紧急数据传输 11.4 小结 习题 第四部分 网络应用 第12章 客户/服务器模型与套接字编程接口 12.1 网络间进程通信 12.2 客户/服务器模型 12.3 套接字编程接口 12.3.1 套接字基本概念 12.3.2 套接字系统调用 12.3.3 其它系统调用 12.4 基于客户/服务器模型的套接字编程举例 12.4.1 客户/服务器模型流程图 12.4.2 套接字实现机制 12.4.3 Unix环境下的套接字编程举例 12.5 小结 习题 第13章 DNS域名系统 13.1 域名结构 13.1.1 平面型命名机制 13.1.2 层次型命名机制 13.1.3 层次型名字管理 13.1.4 TCP/IP域名 13.2 域名解析 13.2.1 TCP/IP域名服务器 13.2.2 域名解析 13.2.3 逆向域名解析 13.2.4 域名解析的效率 13.3小结 习题 第14章 远程登录Telnet和Rlogin 14.1 为什么要引入远程登录? 14.2 TELNET协议 14.2.1 Telnet工作原理 14.2.2 网络虚终端 14.2.3 Telnet选项 14.3 Rlogin 14.4 小结 习题 第15章 文件传输与访问 15.1 FTP:文件传输协议 15.1.1 FTP特点 15.1.2 FTP工作原理 15.1.3 FTP连接建立 15.1.4 FTP访问控制 15.2 TFTP:简单文件传输协议 15.3 NFS:网络文件系统 15.4 小结 习题 第16章 电子邮件 16.1 电子邮件系统体系结构 16.1.1 ISO/OSI电子邮件系统 16.1.2 TCP/IP电子邮件系统 16.2 TCP/IP电子邮件地址 16.3 TCP/IP电子邮件标准 16.3.1 TCP/IP电子邮件格式 16.3.2 MIME:多用途Internet邮件扩展 16.3.3 SMTP:简单邮件传输协议 16.4 邮箱访问 16.5 小结 习题 第17章 万维网 17.1 Web页面浏览 17.1.1 浏览器和服务器 17.1.2 HTTP 17.1.3 HTML语言 17.2 交互式动态页面 17.2.1 CGI 17.2.2 Java 17.2.3 ASP 17.3小结 习题 第五部分 网络管理与安全 第18章 网络管理 18.1 互连网管理 18.2 SNMP网管体系 18.2.1 管理员/代理模型 18.2.2 MIB:管理信息库 18.2.3 ASN.1 18.2.4 SNMP 18.3 小结 习题 第19章 网络安全 19.1 基本概念 19.2 网络安全攻击 19.3 安全策略 19.4 安全机制 19.4.1 加密 19.4.2 鉴别 19.4.3 数字签名 19.5 防火墙 19.5.1 包过滤 19.5.2 应用级网关 19.6 小结 习题 第20章 网络技术的未来发展 20.1 新型网络应用技术 20.2 宽带网络技术 20.3 无线接入技术 20.4 统一网络技术 20.5 网络安全技术 20.6 主动网络技术 20.7 小结 参考文献
UDP是一种面向无连接的传输协议,它在传输数据时不提供可靠性,容易出现丢包、错包的情况。为了实现UDP可靠传输,可以采用以下策略: 1. 检验和:发送方在发送数据前,对数据进行检验和计算,并将计算结果附加在数据中。接收方在接收到数据后,重新计算检验和,并将计算结果与附加的检验和进行比对,如果不一致则认为数据损坏,需要重新发送。 2. 序列号和确认:发送方在发送每个数据包时都给数据包分配一个唯一的序列号。接收方在接收到数据包后,发送一个确认消息给发送方,告知发送方已成功接收到序列号为n的数据包。发送方在收到确认消息后,认为序列号为n的数据包已经可靠传输,可以发送下一个数据包。 3. 超时重传:发送方在发送数据包后设定一个定时器,如果在规定时间内没有收到接收方的确认消息,发送方就会认为数据包丢失,需要重新发送。 4. 滑动窗口:发送方可以同时发送多个数据包,接收方可以接收多个数据包。发送方和接收方分别维护一个窗口,窗口大小表示可以同时传输的数据包的数量。发送方根据接收方发送的确认消息来调整发送窗口的大小,以提高传输效率。 通过以上策略的组合应用,可以在UDP协议实现可靠传输。当然,这些策略也会增加网络传输的开销和延时,需要根据具体业务需求进行权衡和选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值