基于UDP的可靠传输方法
技术领域
本申请涉及一种网络传输方法,具体地,涉及一种基于UDP,且结合了TCP传输特点的可靠传输方法。
背景技术
目前,在设计网络数据传输方案时,常用到的有TCP(传输控制协议)传输方式和UDP(用户数据报文协议)传输方式。
TCP传输
TCP是一种基于连接的协议,在数据通信之前需要通信双方建立连接,事先为所发送的数据开辟好通道,然后,再进行数据发送。
TCP协议上规定类流控制,确保通信数据可靠、顺序到达目的地,因此有一个三次握手的要求。按照协议规范的要求,实现的路由设备提供相应的支持,并且尽量不丢弃TCP数据,实现协议的系统驱动层进行重发和滑动窗口控制,并且通过增加重发时间减少可能带来的网络堵塞问题。系统提供的API应用上,针对不同的链接分配独立缓冲区,进一步减少可能的丢包问题(由于缓冲区满造成数据无法接受引起数据包丢失问题)。
TCP所支持的协议包括Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)等。
UDP传输
UDP是面向非连接的(正式通信前不必与对方建立连接,不管对方状态就直接发送),不能提供可靠性、流控、差错恢复功能。UDP用于一次只传送少量数据,可靠性要求低、传输经济等应用。
UDP没有三次握手的需求,网络设备在通信时,UDP数据拥有比TCP数据更高的优先通信权利,这点使得UDP数据在通信上更加的快速,但是当网络拥堵时,通信设备同样会优先丢弃UDP数据,这种设计方式会导致UDP数据出现丢失的问题,同时协议没有规定相应的流控制方式,自然也不会保证数据的顺序到达。在没有流控制的情况下,UDP数据可能出现丢失、乱序到达的问题,同样由于没有流控制,如果开发控制不当,可能导致数据风暴问题。在系统驱动实现上,由于所有的UDP数据接收时,使用共享的数据缓冲区,设置不当大小的缓冲区,可能会增加数据包的丢失问题,这个就是为什么UDP协议无法实现高并发的服务器原因所在。
UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
但现有技术中,上述两种传输方法具有一定的缺陷,具体为:对于TCP传输,其速度慢、建立连接需要开销较多(时间,系统资源)、实时性较差。对于UDP传输,传输不可靠、在网络拥堵的情况下容易丢包、数据包无序、重传率高。
特别是在P2P网络中,由于TCP需要对方的IP和端口固定,且能直接访问,而在P2P网络中大部分情况都是,主机挂在交换机或路由器后面,映射出来的外网端口不是固定的,也不能被直接访问,所以,P2P网络大部分采用的都是UDP,而不是TCP。因此,如何能够结合两种网络传输协议的优点,形成一种新的网络传输协议,特别的,能够将这种网络传输协议应用在P2P等无法使用TCP网络传输协议的网络中,成为现有技术亟需解决的技术问题。
发明内容
本发明的目的在于提出一种新的基于UDP的可靠传输方法,使得该方法能够适用于P2P等UDP使用的网络, 既保证传输的效率,又降低了数据的重传率。
为达此目的,本发明采用以下技术方案:
一种基于UDP的可靠传输方法,其特征在于:在UDP传输中,模拟TCP的3次握手,建立连接,具体为:
1)发送端向接收端发送SYN,告诉对方要和它建立连接,同时将自己的状态置为SYN_SEND;
2)当接收方收到SYN消息后,给对方回应ACK,同时在发一个SYN,并将自己的状态置为SYN_RECEIVED;
3)当发送端收到对方的回应ACK和SYN后,再给对方发送一个ACK,同时将自己的状态置为ESTABLISHED;
4)当接收端收到对方的回应ACK后,更新自己的状态为ESTABLISHED,至此双方建立连接。
优选地,在UDP数据传输时,采用如下步骤进行数据传输:
1)对于发送方和接收方,分别分配发送缓冲区和接收缓冲区,用来保存发送和接收的数据;
2)应用层将要传输的数据放到发送缓冲区中,当缓冲区满了,则停止放入,直到有空闲的缓冲区再继续放入;
3)网络层将缓冲区中的数据组上包头,按数据包序号逐个发出去,同时等待接收方回应ack;
4)接收方收到数据包,按照包的序号放到对应的缓冲区位置,并需要根据当前的缓冲区状态,计算出回应的ack_no,即ack序号,给对方回复一个ack消息;
5)发送端收到ack后,根据回应的ack_no判断,发送缓冲区的滑动床后是否后移,当满足窗口后移条件后,可以把缓冲区前面的位置腾出来,并通知上传继续放数据。
优选地,在采用UDP方式在传输数据时,当产生丢包现象,通过数据重传,将丢弃的数据包重新发送给接收端。
优选地,接收端在接收的时候,要把接收到的数据包按次序放到缓冲队列中,同时根据当前缓冲区的情况计算出对应的ACK序号,回复对方,发送端收到回复之后,根据对应的ACK序号,判断是继续发送下一个数据包,还是重传之前发过的数据包。
优选地,接收端在接收的时候,要把接收到的数据包按次序放到缓冲队列中,同时根据当前缓冲区的情况计算出对应的ACK序号和SACK序号。
优选地,当发送端发送的UDP数据块过大,超过单个缓冲区的大小的时候,就需要把这块数据拆成几个小的数据包发送,拆包的时候,以缓冲区容量为限,将数据包从前往后依次放入到缓冲队列中,若提示缓冲区满,则需要将缓冲区锁定,防止其他进程写入,造成数据破坏,等有空闲缓冲区的时候,再将剩余的数据块写入。
优选地,当接收端收到数据后,分配一块大的缓冲区,将收到的包,按顺序依次写入缓冲区,保证收到的顺序和发送的顺序是一致的,这样组合出来的数据块和发送的原数据块就能保证是一致的。
优选地,在UDP连接时,通过定时的向对方发送心跳包,告诉对方自己处于活跃状态,收到对方的心跳后更新一下状态。
优选地,在UDP断开连接时,传输的一方能够主动断开连接或者是长时间等不到对方的心跳,将连接断开。
优选地,对UDP数据传输进行数据校验。
一种基于UDP的可靠传输方法,在UDP传输中借鉴了TCP的传输特点,通过3次握手建立连接,通过心跳维持连接,可以主动或者接收不到心跳后断开连接从而为数据传输建立一个可靠的传输通道;在数据的传输时,通过滑动窗口以及重发机制最大效率地传输数据。本发明的数据传输更加灵活,可以动态地调整参数,以适应不用的网络环境;并且适应范围更广,可以使用于P2P网络。本发明极大地改善了各种适用于UDP应用场所的网络环境,提升UDP传输的效率,降低了重传率,减少了数据的冗余。针对网络异常情况,采取一系列措施,保证网络传输的质量。
附图说明
图1 是根据本发明具体实施例的基于UDP的可靠传输方法的建立连接时序图;
图2是根据本发明具体实施例的基于UDP的可靠传输方法的数据传输的时序图;
图3是根据本发明具体实施例的基于UDP的可靠传输方法的数据丢包重发的时序图;
图4是根据本发明具体实施例的基于UDP的可靠传输方法的数据包无序传输的时序图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
本发明的原理在于:针对目前TCP和UDP的缺点,设计一个底层采用UDP传输,同时有兼具TCP传输特性的技术方案——UTCP。技术方案主要从两个方面考虑,一个连接的建立,维持和断开,即如何为数据传输建立一个可靠的传输通道;另一个是数据的传输,即如何最大效率地传输数据,同时又降低数据的重传率。应当注意,本发明中底层传输均采用UDP传输完成。
实施例1:
建立连接:原本基于UDP的传输是不需要建立连接的,为了建立一个可靠的传输通道,传输双发可以模拟TCP的3次握手,建立连接。
维持连接:通过定时的向对方发送心跳包,告诉对方自己处于活跃状态。
断开连接:断开连接包括两种情况,一种是传输的一方主动断开连接;另一种是长时间等不到对方的心跳,将连接断开。
具体而言,包括如下方面。
建立连接:传统的UDP传输方式是不需要建立连接的,为了传输双方建立可靠的连接,模拟TCP传输的3次握手。参见图1,示出了根据本发明具体实施例的基于UDP的可靠传输方法的建立连接时序图,实现过程如下:
1)发送端向接收端发送SYN,告诉对方要和它建立连接,同时将自己的状态置为SYN_SEND;
2)当接收方收到SYN消息后,给对方回应ACK,同时在发一个SYN,并将自己的状态置为SYN_RECEIVED;
3)当发送端收到对方的回应ACK和SYN后,再给对方发送一个ACK,同时将自己的状态置为ESTABLISHED;
4)当接收端收到对方的回应ACK后,更新自己的状态为ESTABLISHED,至此双方建立连接。
维持连接:通过定时器,每隔一定时间向对方发送心跳,收到对方的心跳后更新一下状态,若连续几个心跳骤起都收不到对方心跳,则认为对方已经下线,断开连接。
断开连接:分两种情况:1)一方主动断开,断开前向对方发送一个FIN包,告知对方不用再发送(或接收)数据,将自己的状态置为CLOSING,对方收到后停止发送(或接收),同时回复一个FIN包,收到FIN包将状态置置为CLOSED,正式断开连接;2)超时收不到心跳,认为对方下线,更新状态为CLOSED,断开连接,释放资源。
实施例2:
数据传输:每个客户端都即可能是发送端,也可能是接收端,所以在数据传输的时候,需要分配发送缓冲区和接收缓冲区,分别用来保存发送和接收的数据。应用层过来的数据,先放到发送缓冲区中,通过调度逐个将缓冲区的数据发送出去,接收端收到以后再回复对应的ack包,表明这包数据已经接收,可以发送下一个数据包,发送端收到ack后,就可发送下一个数据包,同时把旧的缓冲区腾出来给新的数据,以此类推双方实现通信。当出现丢包的情况下,通过定时器判断长时间没有收到ack的数据包进行重发。具体实现过程(以4个窗口为例),参见图2示出了根据本发明具体实施例的基于UDP的可靠传输方法的数据传输的时序图,如下:
1)应用层将要传输的数据放到发送缓冲区中,当缓冲区满了,则停止放入,直到有空闲的缓冲区再继续放入。
2)网络层将缓冲区中的数据组上包头,按数据包序号逐个发出去,同时等待接收方回应ack。
3)接收方收到数据包,按照包的序号放到对应的缓冲区位置。由于,udp数据传输方式传输的数据是无序的,后发的包可能会先到,所以,需要根据当前的缓冲区状态,计算出回应的ack_no(即ack序号),给对方回复一个ack消息。
4)发送端收到ack后,根据回应的ack_no判断,发送缓冲区的滑动床后是否后移,当满足窗口后移条件后,可以把缓冲区前面的位置腾出来,并通知上传继续放数据。
其中,所述ack_no,即ack序号,表明需要传输的包的序号。例如,ack2表示已经收到了数据包1,需要接收数据包2。
实施例3:
数据丢包:由于采用UDP方式在传输数据时,可能产生丢包现象,所以,当出现这种情况时,需要能通过数据重传,将丢弃的数据包重新发送给接收端。
参见图3,示出了根据本发明具体实施例的基于UDP的可靠传输方法的数据丢包重发的一个示例性的时序图。其中ack2,表示已经收到了数据包1,需要接收数据包2。Ack2,sack3表示,表示已经收到了后面的数据包3,需要接收数据包2,即ack表示接收到了时序前面的数据包,需要后面的数据包,sack表示已经接收到了位于时序后面的数据包。通过ack和sack的组合,使得在利用UDP网络传输的时候,能够清楚地知道丢失了什么数据包,从而通过计时器判断超时时,启动重传机制。
数据包无序:由于,采用UDP方式传输的数据包,对方收到的包可能是无序的,而在视频文件传输的时候,对数据包的次序要求非常严格,必须是有序的。针对这种情况,接收端在接收的时候,要把接收到的数据包按次序放到缓冲队列中,同时根据当前缓冲区的情况计算出对应的ACK(有时,还具有SACK序号)序号,回复对方。发送端收到回复之后,根据对应的ACK值,判断是继续发送下一个数据包,还是重传之前发过的数据包。
参见图4,示出了根据本发明具体实施例的基于UDP的可靠传输方法的数据包无序传输的时序图。
实施例4:
数据拆包:当发送端发送的UDP数据块过大,超过单个缓冲区的大小的时候,就需要把这块数据拆成几个小的数据包发送。拆包的时候,以缓冲区容量为限,将数据包从前往后依次放入到缓冲队列中,若提示缓冲区满,则需要将缓冲区锁定,防止其他进程写入,造成数据破坏,等有空闲缓冲区的时候,再将剩余的数据块写入,这样就可以保证同一个数据块的几个小数据包是连续的。
数据组包:当接收端收到数据后,考虑到发送端有可能拆包,所以分配一块大的缓冲区,将收到的包,按顺序依次写入缓冲区,保证收到的顺序和发送的顺序是一致的,这样组合出来的数据块和发送的原数据块就能保证是一致的。
为了保证拆包后的数据的连续性,必须遵循两条规则:1)拆包之后的小包,包序号必须是连续的;2)接收端收到小包后,必须按照包序号,有序地重组数据。
数据校验:在数据传输的时候,从应用层到传输层,到网络层,到物理层等各个环节,可能对数据造成破坏,影响数据的一致性,所以,加入数据校验,保证收发数据的一致。校验分两种校验,一种是网络层数据校验,通过CRC校验码实现;另一种是应用层的校验,通过MD5算法实现,实现原理是,发送前根据数据报文计算出一个MD5值,连同数据包一起发送,接收到收到后,也计算出一个MD5值,并和发送端的MD5值进行比较,若一致则说明刷双方的数据是一致的。
综上,本发明在底层采用UDP进行传输,在传输规则中借鉴了TCP传输的规则。因此,相对于TCP,UTCP传输规则具有两个方面的优势:1)更加灵活,可以动态地调整参数,以适应不用的网络环境;2)适应范围更广,TCP不适用于P2P网络,而UTCP可以(因为UTCP底层使用UDP实现的)。
本发明针对当前互联网环境中,传输数据量大,并发度高的情况,设计一个基于UDP的可靠的传输方案,极大地改善了各种适用于UDP应用场所的网络环境,提升UDP传输的效率,同时也降低了重传率,减少了数据的冗余。针对网络异常情况,如网络拥堵,网络丢包,数据包无序,脏数据等多种情况,采取一系列措施,保证网络传输的质量。
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施方式仅限于此,对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单的推演或替换,都应当视为属于本发明由所提交的权利要求书确定保护范围。