基于UDP协议的可靠数据传输的实现
2019-11-13许坤赵亮
许坤 赵亮
摘 要:UDP协议提供面向操作的简单而非可靠的数据传输服务。为了同时获得数据传输的高效性和可靠性,本文仿照TCP协议,在应用层建立报文确认与超时重发机制,基于UDP协议设计了一种可靠的数据传输方法并在工程项目中得到了应用。本文对两种协议的特点进行了探讨,基于UDP协议设计了一种可靠的数据传输方法并在工程项目中得到了应用。
关键词:UDP 可靠传输 报文确认与超时重发机制
中图分类号:TP3017 文献标识码:A 文章编号:1674-098X(2019)06(b)-0007-02
1 概述
随着计算机网络技术的快速发展,网络数据传输的实时性、可靠性越来越得到重视。而数据传输的性能与选择使用的网络协议密切相关。目前应用最广泛的计算机协议是TCP/IP协议。TCP/IP协议栈中与数据传输相关的协议主要包括TCP和UDP两种。这两种协议各有优势,TCP协议面向连接,更加可靠;UDP协议面向操作,简单高效。在一些实际工程应用中,期望同时获得数据传输的实时性、高效性和可靠性。
2 UDP协议与TCP协议的比较
2.1 TCP协议的特点
TCP(传输控制协议)提供了一种面向连接的实现可靠传输的通信方式。通信双方经“三次握手”机制进入连接状态。通过设置滑动窗口,接收方只允许发送方发送其缓冲区能够容纳的数据,实现流量控制。发送方对用户数据进行分片,由接收方对分片进行重组排序。接收方对收到的数据进行校验,如果数据校验和有差错,则丢弃该数据。若数据校验无误,则接收方向发送方发出确认信息;而发送方在发出数据后启动定时器,若超时未收到确认信息则向接收方重新发出数据。
2.2 UDP协议的特点
UDP(用户数据报协议)提供了一种面向操作的简单而非可靠的数据传输服务。数据发送时没有建立明确的连接,不提供可靠性,也不提供报文确认、分片与重组排序以及流量控制等功能。UDP只负责把应用层传来的数据包发送出去,但不保证数据能达到目的地。因此存在数据包丢失、重复和乱序的可能性。接收端进行数据校验,并丢弃校验和有差错的数据,这与TCP是相同的。
2.3 UDP与TCP协议的比较
简而言之,UDP与TCP协议的差异,见表1。
表1可见,在数据传输的可靠性上,TCP具有显而易见的优势。由于建立了明确的连接,加上有确认与超时重发、流量控制等功能,端与端之间进行数据传输稳定可靠。这样的通信方式比较适合于网络环境复杂的广域网,数据传输可能跨越多个不可预知的网段的场合。然而,如果我们的应用是在网络环境简单明确、各网段因素可预知的局域网,或者当我们更加强调数据的快速传输而不是数据的完整性时,UDP是更合适的通信协议。它的优势体现在以下几点。
(1)充分利用局域网本身的可靠性,无需连接,节省系统开销;
(2)不存在分片与重组管理,节省系统开销;
(3)无需对数据分片进行确认,提高了网络使用效率;
(4)支持组播和广播,提高了数据传输效率。
对局域网而言,在实际工程应用中,我们可以借鉴TCP的一些特点,在UDP的应用层进行改进,从而在实现数据高效传输的同时,提高数据传输的可靠性。
3 UDP协议下数据可靠传输的思路
对于网络拓扑结构比较简单的局域网来说,各段网路的性能参数是可知的,通信质量可预测,可靠性比较好,因此在进行网络数据传输时建立连接的步骤可以省略。当网络环境处于较差状态下,可能会存在小概率的丢包问题。解决这一问题的方法,是仿照TCP协议,在应用层建立报文确认与超时重发机制。
所谓报文确认与超时重发机制,就是当接收方收到来自发送方的数据报文后,立即反馈一条确认报文给发送方;发送方发出数据报文后,开启计时器;当计时达到某一时长仍未收到对应的确认报文,则重新发出数据报文。采取多次重发的方法,可以解决偶发性的丢包问题。
4 UDP协议下数据可靠传输的实现
4.1 报文结构设置
把UDP数据报分为两种:数据报文与确认报文。数据报文负责传递业务信息,确认报文负责对收到的数据报文进行应答。数据报文结构定义见表2。(字段1-3为报文头)
确认报文只包含上表中所示的报文头,不包含数据字段。
对于发出的报文,序列号从1开始,依次递增(对于超时重发的报文则保持原序列号),到255再循环回到1。当发出数据报文时,报文中的确认号设置为0;当发出确认报文时,确认号设置为接收到的数据报文的序列号。
4.2 報文确认与超时重发机制的实现
首先建立两个环形数据缓冲区:报文缓冲区、超时缓冲区,同时启动一个定时器。报文缓冲区存放待确认报文,超时缓冲区存放超时表。定时器周期性发出消息用于报文超时重发的倒计时。超时表是记录数据报文的重发次数和超时值的数据结构,其结构定义见表3。应用程序对发出的每条数据报文维护一个超时表,当发出的数据报文得到接收方的确认反馈,则把超时表从超时缓冲区中移除。
报文确认与超时重发机制的相关流程如下。
(1)发出数据报文,同时把该数据报文投入报文缓冲区,把该报文对应的超时表投入超时缓冲区。超时表中重发次数设置为初始值0,超时值根据需要而定,比如100ms。
(2)收到一条报文时,先判断确认号(假设为ACK)。若ACK为0,表示收到的是数据报文,根据数据报文的序列号sn,立即反馈一条确认报文,其确认号设置为等于sn。若ACK非0,表示收到的是确认报文,下一步操作是在报文缓冲区中搜索序列号等于ACK的待确认报文,并从缓冲区中移除该报文,同时在超时缓冲区中搜索序列号等于ACK的超时表,并从缓冲区中移除该超时表。
(3)周期性发出消息,而应用程序响应这个消息,对超时缓冲区中每个超时表的超时值进行倒计时更新,一旦某个超时表的超时值归0,则应用程序将判断其重发次数N:若N=0或1,则N自加1,而超时值更新为100ms(根据需要而定),并从报文缓冲区中提取与超时表序列号对应的数据报文重新发出;若N=2,则把报文缓冲区中与该超时表序列号对应的数据报文移除,把该超时表从超时缓冲区中移除。
按照上述方法设计的程序,应用于某工程项目中,在局域网环境比较恶劣、报文拥塞的情况下,测试了数据报文的丢包率,结果丢包率为0,达到了预期目的。
5 结语
引进报文确认与超时重发机制,有效改善了UDP协议下数据传输的可靠性,在特定局域网环境中,同时获得了实时高效与可靠传输的特性。在实际工程应用中,报文重发次数、重发超时时间、定时器消息周期等参数,可根据需要进行设定。
参考文献
[1] 赵飞,叶震.UDP协议与TCP协议的对比分析与可靠性改进[J].计算机技术与发展,2006,16(9):219-221.
[2] 朱华刚,周祥龙,吴永刚.简单可靠实时传送UDP协议的研究和应用[J].水雷战与舰船防护,2010,18(3):50-53.
[3] 陈佳.基于UDP的数据传输可靠性保障机制研究及应用[D].西安理工大学,2017.
[4] W.Richard Stevens. TCP/IP详解 卷1:协议[M].范建华,胥光辉,张涛,等译.北京:机械工业出版社, 2008.
[5] 谢希仁.计算机网络[M].北京:电子工业出版社,2008.