具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
除非上下文另有特定清楚的描述,本发明中的元件和组件,数量既可以单个的形式存在,也可以多个的形式存在,本发明并不对此进行限定。本发明中的步骤虽然用标号进行了排列,但并不用于限定步骤的先后次序,除非明确说明了步骤的次序或者某步骤的执行需要其他步骤作为基础,否则步骤的相对次序是可以调整的。可以理解,本文中所使用的术语“和/或”涉及且涵盖相关联的所列项目中的一者或一者以上的任何和所有可能的组合。
可以理解,本发明所使用的术语“第一”、“第二”等可在本文中用于描述各种元件,但这些元件不受这些术语限制。这些术语仅用于将第一个元件与另一个元件区分。举例来说,在不脱离本发明的范围的情况下,可以将第一服务器称为第二服务器,且类似地,可将第二服务器称为第一服务器。第一服务器和第二服务器两者都是服务器,但其不是同一服务器。
在一个实施例中,如图1和图2所示,一种传输数据报文的方法,该方法可运行于基于图2的通信***上,该通信***包括第一服务器10和第二服务器20,第一服务器10和第二服务器20皆可为广域网上的计算机设备或网关设备,且第一服务器10和第二服务器20之间数据传输协议为UDP协议。
该方法包括:
步骤S102,第一服务器获取UDP报文,生成唯一不重复的标识号。
步骤S104,第一服务器通过在所述UDP报文中加入所述唯一不重复的标识号生成第一类UDP报文,生成所述第一类UDP报文的拷贝,并将第一类UDP报文及其拷贝一并发送给第二服务器。
在本实施例中,如图3所示,第一服务器在UDP报文的正文部分中加入生成的唯一不重复的标识号,即加入的标识号与UDP报文的UDP协议头部无关,属于UDP报文的报文内容。广域网中的转发数据报文的网络设备(例如路由器、网桥、交换机等)不会因为UDP报文的正文部分中加入的标识号而对正常的UDP报文转发产生影响。
第一类UDP报文即为加入了标识号且加入的标识号为唯一不重复的标识号的UDP报文,相应的,下文中的第二类UDP报文即为加入了标识号且加入的标识号为预设的固定可重复的标识号的UDP报文。
在一个实施例中,第一服务器生成唯一不重复的标识号的步骤还包括:
第一服务器生成循环递增/递减的数字码,并获取与其对应机器识别码,并根据机器识别码和所述数字码生成唯一不重复的标识号。
循环递增/递减的数字码即第一服务器为每个待发送的UDP报文分配比前一个已发送的UDP报文对应的数字递增的数字。例如,若第一服务器获取到3个UDP报文待发送,则可为第一个待发送的UDP报文分配数字1,为第二个待发送的UDP报文分配数字2(即在1的基础上递增1),为第三个待发送的UDP报文分配数字3(即在2的基础上递增1)。
机器识别码可以是MAC地址、IP地址、机器名等区别计算机硬件设备的标识信息。
也就是说,标识号可包含两部分内容,一部分为机器识别码,另一部分即为前述的数字码。如图5所示,若A和B两个第一服务器均向第二服务器C发送第一类UDP报文,则A发出的第一类UDP报文中的标识号为标识A加数字的形式,其中,标识A即为第一服务器A的机器识别码;B发出的第一类UDP报文中的标识号为标识B加数字码的形式,其中,标识B即为第一服务器B的机器识别码。如图5所示,若A发出的某个第一类UDP报文A0003的数字码和B生成的某个第一类UDP报文B0003的数字码相同,则由于其标识号中的机器识别码不同,使得第二服务器C在接收到A0003后不会因为B0003的数字码与A0003相同而将其丢弃,从而保证了第二服务器在接收多个第一服务器发送的UDP报文时接收数据的准确性。
在另一个实施例中,标识号还可以是随机码。当随机码的位数较大时(例如128位或256位的长度),随机生成的标识号重复的概率较小,可视为唯一不重复。
在一个实施例中,数字码具有初始值。
第一服务器生成唯一不重复的标识号的步骤还包括:
若该数字码已循环递增/递减至预设的最大/最小值,则将其设置为初始值,该数字码则从初始值重新开始循环递增/递减。
也就是说,若初始值为1,且数字为循环递增1,最大值为100,则当第一服务器发送的第一类UDP报文对应的标识号中包含的数字被设置为100后,第一服务器下一次发送第一类UDP报文时,则将第一类UDP报文中的标识号设置为初始值1,然后继续从1开始循环递增(此过程也可称为反卷)。
优选的,标识号可设置为64位数据段,包括两个32位子数据段,其中,两个32位子数据段分别对应机器识别码和数字码。由于32位子数据段对应的数字码在增加到全1时,则可通过+1变成全0的数字码。
例如,如图6所示,可高32位的子数据段对应机器识别码,低32位的子数据段对应数字。使用32位的子数据段来存储数字部分,对于现行网络,32位的子数据段对应4294967296个UDP报文,也就是说,只有至少发送了4294967296个UDP报文才有可能出现重复的UDP报文,而现网中实际处理的UDP报文的速度远小于10万/秒,也就是说,至少约12小时才会发生标识号重复的可能,从而避免了网络上有标识号重复的UDP报文出现(网络设备发出的UDP报文在现网中的生命周期远小于12小时)。
也就是说,第一服务器发送的第一类UDP报文中的标识号中由于包含了循环递增/递减的数字,因此不会产生重复。第一服务器获取的UDP报文在传输的过程中,只会与其相应的拷贝具有相同的标识号,而与其他UDP报文均具有不同的标识号。
需要说明的是,第一服务器生成的第一类UDP报文的拷贝可以有多份,且与网络质量对应。若网络质量较好,可仅生成一份拷贝;若网络质量较差,则可生成多份拷贝。也就是说,第一服务器可随网络质量的降低增加加入了标识号的UDP报文的拷贝的份数。
步骤S106,第二服务器接收UDP报文,并从中取出标识号,判断缓存中是否已存在该标识号,若是,则将该UDP报文丢弃;否则,在缓存中存储该取出的标识号,且判定该UDP报文接收成功。
第二服务器中设置有缓存,第二服务器在第一次接收到某个标识号对应的UDP报文时,先将标识号从UDP报文的正文部分中取出(不改变第一服务器原始获取到的UDP报文的正文内容),并在缓存中为其分配存储空间,然后将该取出的标识号存储在缓存中分配的存储空间中。UDP报文被判定接收成功后,即可由第二服务器提取其数据交由应用层程序进行处理或是由第二服务器转发给其他网络设备。
若第二服务器再次接收到该标识号对应的UDP报文(即接收到的UDP报文包含的标识号在缓存中已存在),则将其丢弃。
进一步的,第一服务器生成加入了标识号的UDP报文的拷贝的步骤还包括:
第一服务器获取预设的报文份数值,根据预设的报文份数值生成第一类UDP报文的拷贝。
第二服务器将接收到的UDP报文丢弃的步骤之后还包括:
第二服务器获取与所述标识号对应的接收次数,获取预设的报文份数值,判断标识号对应的接收次数是否大于或等于所述报文份数值,若是,则将该标识号从缓存中移除。
例如,若预设的报文份数值为2(即第一服务器将第一类UDP报文复制一份),则第二服务器在接收到该UDP报文时,通过判断缓存中是否存在相应的标识号即可得到其对应的接收次数。若存在,则接收次数为2,否则,接收次数为1。由于接收次数与报文份数值均为2相等,则可在缓存中将该标识号移除,回收其对应的存储空间。
再例如,若预设的报文份数值为n(即第一服务器将第一类UDP报文复制n份),则第二服务器可在缓存中为标识号扩展一块存储其对应的接收次数的存储空间。第二服务器每接收到一次该标识号对应的UDP报文,则将该接收次数+1,若该接收次数大于或等于n,则表示第一服务器发送的UDP报文及其n+1个拷贝均已被第二服务器接收,则第二服务器可从缓存中将其对应的标识号移除,回收其对应的存储空间。
第二服务器根据报文份数值及接收次数将缓存中的标识号移除,可在节省缓存的存储空间,从而提高存储空间的利用率。
进一步的,缓存中存储的标识号具有生命周期。
第二服务器将缓存中生命周期超时的标识号从缓存中移除。
也就是说,对于某个标识号对应的UDP数据报文,若第二服务器仅接收到一份(或少于前述的报文份数值的份数),而在传输过程中其他该标识号对应的UDP数据报文由于网络问题遗失了,则该标识号将一直存储在缓存中,其存储空间无法得到释放,则在为标识号分配存储空间时,为分配的存储空间设置生命周期,例如,10分钟。当生命周期抵达时,第二服务器则自动将该存储空间释放,在缓存中移除该标识号,从而节省了缓存空间,提高了存储空间的利用率。且优选的,生命周期可设置为大于或等于UDP协议中最大接收延时的值。
在一个实施例中,如图2所示,第一服务器10和第二服务器20均为用于中转的数据传输服务器,发送终端30与第一服务器10连接,接收终端40与第二服务器20连接,且第一服务器获取UDP报文的步骤为:第一服务器接收发送终端发送的UDP报文;第二服务器判定取出了标识号的UDP报文接收成功的步骤之后还包括:将取出了标识号的UDP报文转发至接收终端。
也就是说,在本实施例对应的应用场景中,第一服务器10与发送终端30可具有网络质量较优的链路(即丢包率较低、网络延时较小的链路),或第一服务器10与发送终端30处于同一子网中,且第一服务器10为网关设备;相应的,第二服务器20与接收终端40可具有网络质量较优的链路(即丢包率较低、网络延时较小的链路),或第二服务器20与接收终端40处于同一子网中,且第二服务器20为网关设备。发送终端30发送给接收终端40的UDP报文率先抵达第一服务器10,并由第一服务器将生成的唯一不重复的标识号加入该UDP报文生成第一类UDP报文,并将其拷贝成多份,然后发送给第二服务器,第二服务器20只需接收到该多份与同一标识号对应的UDP报文中的一个即接收成功,然后再由第二服务器20将移除标识号的UDP报文通过网络质量较优的链路转发给接收终端40。与传统技术中发送终端30和接收终端40之间没有第一服务器10和第二服务器20的网络环境相比,丢包的概率降低(假设1个数据报文在传输中丢失的概率为40%,则2个数据报文在传输中丢失的概率为40%的平方,即16%)。
本应用场景中发送终端、第一服务器、第二服务器和接收终端之间的交互过程可参考图4所示。
在一个实施例中,第一服务器生成加入了标识号的UDP报文的拷贝的步骤之前还包括:
第一服务器在UDP报文中加入生成时间戳。
第二服务器接收UDP报文的步骤之后还包括:
第二服务器获取接收到的UDP报文的生成时间戳,生成包含生成时间戳的响应报文并返回给第一服务器;
第一服务器接收返回的响应报文,提取其中包含的生成时间戳,根据生成时间戳来计算网络延时,根据接收到的返回的UDP报文的数量计算丢包率。
例如,第一服务器可定期在UDP报文中加入生成时间戳,第二服务器在接收到加入了生成时间戳的UDP报文后则生成其拷贝(该拷贝即为响应报文)然后将其返回给第一服务器,第一服务器接收到返回的UDP报文后,以接收到返回的UDP报文的时间戳减去生成时间戳然后除以2,即可计算得到第一服务器和第二服务器之间的网络延时。在其他实施例中,第二服务器在接受到包含生成时间戳的UDP报文后,可生成一个仅包含该生成时间戳的UDP报文作为响应报文返回给第一服务器。
相应的,第一服务器可在M个UDP报文中加入生成时间戳,若其仅接收到S个第二服务器返回的具有相同时间戳的UDP报文,则丢包率即为(M-S)/M。
在另一个实施例中,第一服务器也可通过发送独立的检测报文来计算网络延时和丢包率。
在本实施例中,第一服务器生成第一类UDP报文的拷贝步骤还包括:
第一服务器根据网络延时和/或丢包率确定拷贝的份数。
若网络延时较低,丢包率较低,则第一服务器和第二服务器之间的网络质量较好,第一服务器则在生成第一类UDP报文的拷贝时,可仅生成较少的拷贝份数,例如1份;若网络延时较高,丢包率较高,则第一服务器和第二服务器之间的网络质量较差,第一服务器则在生成第一类UDP报文的拷贝时,可生成较多的拷贝份数,例如2份。
在本实施例中,第一服务器生成唯一不重复的标识号的步骤之前还包括:
第一服务器根据网络延时和丢包率来判断是否适合单发,若是,则获取预设的固定可重复的标识号,通过将其加入UDP报文生成第二类UDP报文,并将该第二类UDP报文发送给第二服务器;否则,执行生成唯一不重复的标识号的步骤(即后续会生成第一类UDP报文)。
进一步的,第二服务器从接收到的UDP报文中取出标识号的步骤之后还可判断取出的标识号是否为预设的固定可重复的标识号,若否,则执行判断缓存中是否已存在该标识号的步骤。
如前例中,若固定可重复的标识号为数字码为0的标识号,则在网络延时较低,丢包率较低,即网络质量较优时,第一服务器不生成第一类UDP报文,而是通过在UDP报文中加入数字码为0的标识号来生成第二类UDP报文,否则,即在网络质量较差时,仍然生成第一类UDP报文及其拷贝。第二服务器若检测到从接收到的UDP报文中取出的标识号中的数字码为0(即该标识号为固定可重复的标识号),则表示该UDP报文为第二类UDP报文,为单发模式,可不缓存该标识号。
也就是说,在网络质量较好时,第一服务器可生成第二类UDP报文,第二类UDP报文无需生成其拷贝,从而提高了带宽利用率。
在一个实施例中,第二服务器从接收到的UDP报文中取出标识号的步骤之后还可包括:若取出失败,则判定该UDP报文接收成功。
例如,第一服务器还可在UDP报文的正文部分的起始位置***64位的协议标识,再在协议标识的结束位置***标识号,若第二服务器从接收到的UDP报文的正文部分的起始位置提取的64为的数据段与协议标识不符,则表示提取失败,即表示该UDP报文是由其他网络设备(例如图2中的发送终端30)发送来的UDP报文,则可将其判定为接收成功,但并不需要执行后续取出其的标识号的步骤。从而使得第二服务器可在广域网环境下不仅能接收第一服务器发送的UDP报文,还能接收其他网络设备发送的UDP报文。
在一个实施例中,如图2所示,一种传输数据报文的***,包括第一服务器10和第二服务器20,其中:
第一服务器10用于获取UDP报文,生成唯一不重复的标识号;通过在UDP报文中加入唯一不重复的标识号生成第一类UDP报文,生成第一类UDP报文的拷贝,并将第一类UDP报文及其拷贝一并发送给第二服务器20。
第二服务器20用于接收UDP报文,并从中取出标识号,判断缓存中是否已存在该标识号,若是,则将该UDP报文丢弃;否则,在缓存中存储该取出的标识号,且判定该UDP报文接收成功。
在一个实施例中,如图2所示,传输数据报文的***还包括发送终端30和接收终端40,其中:
第一服务器10还用于接收发送终端30发送的UDP报文。
第二服务器20还用于将判定接收成功的取出了标识号的UDP报文转发至接收终端40。
在一个实施例中,第一服务器10还用于获取预设的报文份数值,根据预设的报文份数值生成第一类UDP报文的拷贝。
第二服务器还用于获取与标识号对应的接收次数,获取预设的报文份数值,判断标识号对应的接收次数是否大于或等于报文份数值,若是,则将该标识号从缓存中移除。
在一个实施例中,缓存中存储的标识号具有生命周期。
第二服务器还用于将缓存中生命周期超时的标识号从缓存中移除。
在一个实施例中,第一服务器10还用于生成循环递增/递减的数字码,并获取与其对应机器识别码,并据所述机器识别码和所述数字码生成唯一不重复的标识号。
在一个实施例中,数字码具有初始值。
第一服务器10还用于在数字码已循环递增/递减至预设的最大/最小值时,将其设置为初始值,数字码从初始值重新开始循环递增/递减。
进一步的,标识号为64位数据段,包括两个32位子数据段,两个32位子数据段分别对应机器识别码和数字码。
在一个实施例中,第一服务器10还用于在UDP报文中加入生成时间戳。
第二服务器20还用于获取接收到的UDP报文的生成时间戳,生成包含生成时间戳的响应报文并返回给第一服务器10;
第一服务器10还用于接收返回的响应报文,提取其中包含的生成时间戳,根据生成时间戳来计算网络延时,根据接收到的返回的UDP报文的数量计算丢包率。
在一个实施例中,第一服务器10还用于根据网络延时和/或丢包率确定拷贝的份数。
在一个实施例中,第一服务器10还用于根据网络延时和/或丢包率来判断是否适合单发,若是,则获取预设的固定可重复的标识号,通过将其加入UDP报文生成第二类UDP报文,并将第二类UDP报文发送给第二服务器;否则,生成唯一不重复的标识号。
在一个实施例中,第二服务器20从接收到的UDP报文中取出标识号的步骤之后还包括:
第二服务器20还用于判断从接收到的UDP报文中取出标识号中是否为预设的固定可重复的标识号,若否,则判断缓存中是否已存在该标识号。
在一个实施例中,如图7所示,一种发送数据报文的方法,该方法的运行依赖于计算机程序,可运行于基于冯诺依曼体系的计算机***上,该方法包括:
步骤S202,获取UDP报文,生成唯一不重复的标识号。
步骤S204,通过在UDP报文中加入生成的标识号生成第一类UDP报文,生成第一类UDP报文的拷贝。
步骤S206,一并发送第一类UDP报文及其拷贝。
在一个实施例中,如图8所示,一种发送数据报文的装置,包括标识号生成模块102、数据报文拷贝模块104和数据报文发送模块106,其中:
标识号生成模块102,用于获取UDP报文,生成唯一不重复的标识号。
数据报文拷贝模块104,用于通过在UDP报文中加入唯一不重复的标识号生成第一类UDP报文,生成第一类UDP报文的拷贝。
数据报文发送模块106,用于一并发送第一类UDP报文及其拷贝。
在一个实施例中,如图9所示,一种接收数据报文的方法,该方法的运行依赖于计算机程序,可运行于基于冯诺依曼体系的计算机***上,包括:
步骤S302,接收UDP报文,并从中取出标识号。
步骤S304,判断缓存中是否已存在该标识号,若是,则执行步骤S306。
步骤S306,将该UDP报文丢弃;否则,执行步骤S308。
步骤S308,在缓存中存储该取出的标识号,且判定该UDP报文接收成功。
在本实施例中,将接收到的UDP报文丢弃的步骤之后还包括:
获取与标识号对应的接收次数;
获取预设的报文份数值;
判断标识号对应的接收次数是否大于或等于报文份数值,若是,则将该标识号从缓存中移除。
在本实施例中,缓存中存储的标识号具有生命周期。该方法还可包括将缓存中生命周期超时的标识号从缓存中移除的步骤。
在一个实施例中,如图10所示,一种接收数据报文的装置,包括标识号提取模块202和数据收拢模块204,其中:
标识号提取模块202,用于接收UDP报文,并从中取出标识号;
数据收拢模块204,用于判断缓存中是否已存在该标识号,若是,则将该UDP报文丢弃;否则,在缓存中存储该取出的标识号,且判定该UDP报文接收成功。
在本实施例中,数据收拢模块204还用于获取与标识号对应的接收次数;获取预设的报文份数值;判断标识号对应的接收次数是否大于或等于报文份数值,若是,则将该标识号从缓存中移除。
在本实施例中,缓存中存储的标识号具有生命周期。如图10所示,接收数据报文的装置还可包括缓存清理模块206,用于将缓存中生命周期超时的标识号从缓存中移除。
在一个实施例中,如图11所示,提供了一种可运行前述发送数据报文的方法或者接收数据报文的方法的服务器结构示意图。该服务器500可因配置或性能不同而产生比较大的差异,可以包括一个或一个以***处理器(centralprocessing units,CPU)522(例如,一个或一个以上处理器)和存储器532,一个或一个以上存储应用程序542或数据544的存储介质530(例如一个或一个以上海量存储设备)。其中,存储器532和存储介质530可以是短暂存储或持久存储。存储在存储介质530的程序可以包括一个或一个以上模块(如图8中的标识号生成模块102、数据报文拷贝模块104、数据报文发送模块106,或者图10中的标识号提取模块202、数据收拢模块204、缓存清理模块206),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器522可以设置为与存储介质530通信,在服务器500上执行存储介质530中的一系列指令操作。服务器500还可以包括一个或一个以上电源526,一个或一个以上有线或无线网络接口550,一个或一个以上输入输出接口558,和/或,一个或一个以上操作***541,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。上述图7和图9所示实施例中所述的由服务器所执行的步骤可以基于该图11所示的服务器结构。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
上述传输数据报文的方法及***中,第一服务器在将同一个UDP报文发送给第二服务器时,先在UDP报文中加入标识号区分每个UDP包,然后将UDP报文拷贝成多份发送。若丢包率为60%(即发送100个UDP报文时有60个UDP报文会在传输过程中遗失),拷贝后得到的具有相同标识号的UDP报文的份数为2,则该标识号对应的UDP包在传输中遗失的概率即为60%的平方,即36%(即两份UDP报文全部遗失的概率);若拷贝后得到的具有相同标识号的UDP报文的份数为n,则该标识号对应的UDP包在传输中遗失的概率即为60%的n次方,由于丢包率为小于1的值,因此实际丢包率较低。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。