数据传输方法、装置、设备及存储介质与流程

xiaoxiao9月前  87



1.本技术涉及计算机技术领域,特别涉及一种数据传输方法、装置、设备及存储介质。


背景技术:

2.云游戏是以云计算为基础的游戏方式。在云游戏的模式下,服务端用于运行游戏并将渲染完毕后的游戏画面压缩后发送至客户端,客户端用于将用户的操作事件发送至服务端以控制游戏的运行。在此过程中,会涉及到频繁的数据传输,因此对传输延迟的要求非常高。
3.用户数据报协议互联网连接(quick user datagram protocol internet connection,quic)协议是使用用户数据报协议(user datagram protocol,udp)进行多路并发传输的协议,相较于传输控制协议(transmission control protocol,tcp)有诸多优势。相关技术中,通常采用quic协议来实现数据传输,例如采用gquic协议(一种quic协议),以提升数据传输的性能。
4.在采用gquic协议对应的quic库(包括用于实现gquic协议的代码)的情况下,由于无法充分使用中央处理器(central processing unit,cpu)的多核心来管理quic连接,存在效率较低的问题。


技术实现要素:

5.本技术提供了一种数据传输方法、装置、设备及存储介质,可以提升管理quic连接的效率。所述技术方案如下。
6.根据本技术的一方面,提供了一种数据传输方法,所述方法由服务器执行,所述服务器中运行的服务端与客户端建立有通信连接,所述服务端和所述客户端中集成有quic-软件开发工具包(software development kit,sdk),所述quic-sdk用于实现基于quic协议的传输,所述方法包括以下步骤。
7.接收所述客户端发送的udp数据包。
8.通过第一线程,在n个第二线程中确定目标第二线程,所述n个第二线程用于处理所述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数。
9.通过所述第一线程将所述udp数据包传递至所述目标第二线程。
10.根据本技术的一方面,提供了一种数据传输方法,所述方法由客户端执行,所述客户端与服务器中运行的服务端建立有通信连接,所述服务端和所述客户端中集成有quic-sdk,所述quic-sdk用于实现基于quic协议的传输,所述方法包括以下步骤。
11.向所述服务端发送udp数据包。
12.其中,所述服务端用于通过第一线程,在n个第二线程中确定目标第二线程,并通过所述第一线程将所述udp数据包传递至所述目标第二线程,所述n个第二线程用于处理所
述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数。
13.根据本技术的另一方面,提供了一种数据传输装置,所述装置中运行的服务端与客户端建立有通信连接,所述服务端和所述客户端中集成有quic-sdk,所述quic-sdk用于实现基于quic协议的传输,所述装置包括以下模块。
14.接收模块,用于接收所述客户端发送的用户数据报协议udp数据包。
15.确定模块,用于通过第一线程,在n个第二线程中确定目标第二线程,所述n个第二线程用于处理所述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数。
16.传递模块,用于通过所述第一线程将所述udp数据包传递至所述目标第二线程。
17.在一个可选的设计中,所述确定模块,用于:响应于所述第一线程接收到所述udp数据包,通过所述第一线程解析所述udp数据包,得到目标连接标识。
18.通过所述第一线程,根据所述目标连接标识在所述n个第二线程中确定目标第二线程。
19.在一个可选的设计中,所述确定模块,用于:在所述目标连接标识对应的quic连接为已存在的连接的情况下,通过所述第一线程,根据缓存将包括所述目标连接标识对应的会话对象的第二线程确定为所述目标第二线程。
20.其中,所述缓存用于存储不同的所述第二线程中的会话对象和连接标识之间的对应关系,所述会话对象与所述quic连接对应。
21.在一个可选的设计中,所述n个第二线程中的每个线程包括调度组件,所述调度组件用于管理一个或多个所述会话对象。所述传递模块,用于:通过所述第一线程将所述udp数据包传递至所述目标第二线程中的所述调度组件。
22.所述确定模块,用于通过所述目标第二线程中的所述调度组件确定所述目标连接标识对应的会话对象。
23.所述传递模块,用于通过所述目标第二线程中的所述调度组件将所述udp数据包传递至所述目标连接标识对应的会话对象。
24.在一个可选的设计中,所述确定模块,用于:在所述目标连接标识对应的quic连接不为已存在的连接的情况下,通过所述第一线程在所述n个第二线程中随机确定所述目标第二线程。
25.在一个可选的设计中,所述n个第二线程中的每个线程包括调度组件,所述调度组件用于管理一个或多个会话对象,所述会话对象与所述quic连接对应。所述装置还包括以下模块。
26.所述传递模块,用于通过所述第一线程将所述udp数据包传递至所述目标第二线程中的所述调度组件。
27.建立模块,用于在所述目标第二线程中的所述调度组件确定所述目标连接标识对应的quic连接不为所述已存在的连接的情况下,建立所述udp数据包的quic连接。
28.所述建立模块,用于在所述目标第二线程中创建所述udp数据包的quic连接对应的会话对象。
29.所述传递模块,用于通过所述目标第二线程中的所述调度组件将所述udp数据包传递至所述udp数据包的quic连接对应的会话对象。
30.在一个可选的设计中,所述装置还包括以下模块。
31.保存模块,用于在缓存中保存所述目标第二线程中的所述会话对象与所述目标连接标识的对应关系。
32.在一个可选的设计中,所述建立模块,用于:基于udp文件描述符在所述目标第二线程中创建所述udp数据包的quic连接对应的会话对象。
33.其中,所述udp文件描述符设置有复用规则,所述复用规则用于所述第一线程和所述第二线程绑定相同的针对所述udp数据包的侦听地址。
34.在一个可选的设计中,所述装置还包括以下模块。
35.所述传递模块,用于在所述服务端的应用层传输发送数据的过程中,将所述发送数据传递至quic线程中的发包处理组件,所述quic线程是由所述quic-sdk提供的。
36.保存模块,用于通过所述发包处理组件将所述发送数据保存至本地发送缓存中。
37.发送模块,用于在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的数据。
38.在一个可选的设计中,所述发送模块,用于:在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的全部数据。
39.在一个可选的设计中,所述装置还包括以下模块。
40.通知模块,用于通过所述发包处理组件基于发送事件文件描述符对消息环进行唤醒通知,所述消息环用于管理传输任务。
41.唤醒模块,用于通过所述消息环唤醒所述发包处理组件以指示所述发包处理组件进行数据发送。
42.在一个可选的设计中,所述装置还包括以下模块。
43.获取模块,用于在接收到所述客户端发送的崩溃信号的情况下,通过云存储服务器获取崩溃文件。
44.所述确定模块,用于根据所述崩溃文件确定崩溃的原因和位置。
45.其中,所述崩溃文件是所述客户端通过所述quic-sdk监测到运行崩溃的情况下生成并上传至所述云存储服务器的。
46.在一个可选的设计中,所述装置还包括以下模块。
47.切换模块,用于在接收到所述客户端发送的所述崩溃信号的情况下,对应用层协议进行切换。
48.在一个可选的设计中,所述装置还包括以下模块。
49.保存模块,用于在所述服务端运行的过程中,将性能侦测数据格式化,并保存至本地文件中。
50.上传模块,用于在所述服务端结束服务的情况下,将所述本地文件上传至云存储
服务器。
51.其中,所述云存储服务器中的所述本地文件用于解析得到性能侦测信息,所述性能侦测信息用于在用户界面中展示。
52.根据本技术的另一方面,提供了一种数据传输装置,所述装置与服务器中运行的服务端建立有通信连接,所述服务端和所述装置中集成有quic-sdk,所述quic-sdk用于实现基于quic协议的传输,所述装置包括以下模块。
53.发送模块,用于向所述服务端发送udp数据包。
54.其中,所述服务端用于通过第一线程,在n个第二线程中确定目标第二线程,并通过所述第一线程将所述udp数据包传递至所述目标第二线程,所述n个第二线程用于处理所述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数。
55.在一个可选的设计中,所述装置还包括以下模块。
56.传递模块,用于在所述客户端的应用层传输发送数据的过程中,将所述发送数据传递至quic线程中的发包处理组件,所述quic线程是由所述quic-sdk提供的。
57.保存模块,用于通过所述发包处理组件将所述发送数据保存至本地发送缓存中。
58.所述发送模块,用于在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的数据。
59.根据本技术的另一方面,提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如上方面所述的数据传输方法。
60.根据本技术的另一方面,提供了一种计算机可读存储介质,所述可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如上方面所述的数据传输方法。
61.根据本技术的另一方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面的各种可选实现方式中提供的数据传输方法。
62.本技术提供的技术方案带来的有益效果至少包括:通过第一线程调度第二线程,不同第二线程可实现管理不同的quic连接,实现了通过不同线程来管理quic连接,使服务端能够充分利用多个核心的并发处理能力,避免了使用单一线程管理quic连接导致对并发量瓶颈限制较大的问题,提升了管理quic连接的效率,有助于提升数据传输的性能。
附图说明
63.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
64.图1是本技术一个示例性实施例提供的云游戏业务的后台布署的示意图;图2是本技术一个示例性实施例提供的相关技术中基于quic协议的部署方案的示意图;图3是本技术一个示例性实施例提供的计算机系统的结构框图;图4是本技术一个示例性实施例提供的基于quic协议的云游戏的架构模式的示意图;图5是本技术一个示例性实施例提供的一种数据传输方法的流程示意图;图6是本技术一个示例性实施例提供的另一种数据传输方法的流程示意图;图7是本技术一个示例性实施例提供的又一种数据传输方法的流程示意图;图8是本技术一个示例性实施例提供的发送数据的过程的示意图;图9是本技术一个示例性实施例提供的再一种数据传输方法的流程示意图;图10是本技术一个示例性实施例提供的崩溃分析的过程的示意图;图11是本技术一个示例性实施例提供的还一种数据传输方法的流程示意图;图12是本技术一个示例性实施例提供的相关技术中进行性能侦测的过程的示意图;图13是本技术一个示例性实施例提供的性能侦测的过程的示意图;图14是本技术一个示例性实施例提供的基于quic协议的传输过程的示意图;图15是本技术一个示例性实施例提供的流量控制的原理的示意图;图16是本技术一个示例性实施例提供的数据传输方法的流程示意图;图17是本技术一个示例性实施例提供的第一种数据传输装置的结构示意图;图18是本技术一个示例性实施例提供的第二种数据传输装置的结构示意图;图19是本技术一个示例性实施例提供的第三种数据传输装置的结构示意图;图20是本技术一个示例性实施例提供的第四种数据传输装置的结构示意图;图21是本技术一个示例性实施例提供的第五种数据传输装置的结构示意图;图22是本技术一个示例性实施例提供的第六种数据传输装置的结构示意图;图23是本技术一个示例性实施例提供的第七种数据传输装置的结构示意图;图24是本技术一个示例性实施例提供的第八种数据传输装置的结构示意图;图25是本技术一个示例性实施例提供的第九种数据传输装置的结构示意图;图26是本技术一个示例性实施例提供的第十种数据传输装置的结构示意图;图27是本技术一个示例性实施例提供的计算机设备的结构示意图。
65.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。
具体实施方式
66.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施方式作进一步地详细描述。
67.首先,对本技术实施例涉及的名词进行介绍。
68.云游戏:云游戏是以云计算为基础的游戏方式。在云游戏的运行模式下,所有游戏都在服务端运行,服务端会将渲染完毕后的游戏画面压缩后通过网络传送给客户端(用
户)。客户端获取用户的操作事件,如触屏事件、键盘鼠标事件、摇杆事件等,通过网络传输到服务端,以达到操作游戏的目的。
69.quic协议:quic和英文quick谐音,简称“快”。quic协议是使用udp进行多路并发传输的协议,相对于tcp有诸多优势。
70.ietf quic:互联网工程任务组(internet engineering task force,ietf)标准组织所提供的quic协议规范。
71.gquic:gquic协议是一种quic协议,本意是设计为通用协议以在浏览器中支持超文本传输安全协议(hypertext transfer protocol secure,http(s)/https),同时其也在跟进支持最新的quic标准,与ietf quic有一些格式上的差异。
72.webrtc:webrtc是全球广域网(world wide web,web)实时通信(real-time communication,rtc)的缩写,它既是应用程序编程接口(application programming interface,api)也是协议。它是跨平台的音视频通讯框架,现已成为ietf web标准。
73.pacing(踱步):即有节奏、步调的进行。在音视频领域描述以固定的频率来执行某个动作。
74.拥塞控制:作用于网络的机制,防止过多的数据注入到网络中,避免出现网络负载过大的情况。
75.流量控制:指如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,需控制发送者的发送速度,使得接收者来得及接收。
76.云对象存储(cloud object storage,cos):指无目录层次结构、无数据格式限制,可容纳海量数据且支持超文本传输协议(hypertext transfer protocol,http)/https访问的分布式存储服务,可具体实现为云存储服务器。
77.promethues(普罗米修斯):一种开源的侦测告警解决方案,目前已广泛应用于kubernetes(k8s,一种容器集群管理系统)云原生环境。
78.pushgateway(推送网关):一种针对短生命期或无法拉取的目标所提供的组件。
79.grafana(格拉法纳):一款用go语言(golang,一种开发语言)开发的开源数据可视化工具,主要用来侦测数据的可视化、告警。
80.在云游戏场景中,对用户的操作延迟非常敏感,延迟的大小主要取决于客户端的网络情况。客户端的网络存在不稳定的特点,比如存在切换网络(无线保真(wireless fidelity,wi-fi)与第四代(4th generation,4g)移动通信技术/第五代(5th generation,5g)移动通信技术的切换,或,在移动场景(地铁火车上)上频繁切换基站)的情况,以及弱网(网络抖动、丢包)的情况,传统的tcp、基于tcp的全双工通信协议(websocket)很难应对这种情况。
81.本技术实施例提供的方法,通过在客户端和服务端之间建立基于quic协议的通信连接,相较于传统的tcp和websocket,能够减少延迟,从而优化弱网下的用户体验。示例地,本技术实施例提供的方法能够用于云游戏的场景下。图1是本技术一个示例性实施例提供的云游戏业务的后台布署的示意图。如图1所示,客户端101和k8s边缘集群中的x86(一种架构)服务器102建立有基于quic协议的通信连接,k8s边缘集群中的x86服务器102和arm(一种架构)服务器103建立有基于tcp的通信连接。其中,客户端101向x86服务器102的linux(一种操作系统)容器中的媒体传输模块发送的用户操作指令采用quic协议传输,x86服务
器102中的媒体传输模块向客户端101发送的云游戏的音视频流采用实时传输协议(real-time transport protocol,rtp)或实时传输控制协议(real-time transport control protocol,rtcp)传输,客户端101和x86服务器102之间传输的鉴权、性能侦测数据采用quic协议传输。k8s边缘集群中的x86服务器102和arm服务器103的andriod(一种操作系统)容器中的媒体编码模块之间的数据传输采用tcp,媒体编码模块用于对云游戏的媒体数据进行编码,arm服务器103的andriod容器中的游戏实例即为运行的云游戏。需要说明的是,上述云游戏业务的后台布署方案仅用作实例,不作为对本技术的限制。
82.由于云游戏业务有如下特殊性。
83.(1)对延迟要求非常高。
84.(2)边缘集群很多,要尽量减少运维成本,并降低单集群的资源成本。
85.在选型实现方案时,需要进行一些权衡。另外,开源领域quic库的质量参差不齐,要做合适的选型并改造以适合云游戏的架构,需要做很多工作。本技术实施例提供了一种quic协议在云游戏业务的应用方案,能够满足低延迟的需求,且不增加运维成本、不增加单集群的资源成本。
86.示例地,图2是本技术一个示例性实施例提供的相关技术中基于quic协议的部署方案的示意图。如图2所示,服务器外部的udp包通过四层的弹性负载均衡(elastic load balance,elb)代理201以及七层的elb代理202后,传输至后端(主机host203)中的业务进程,传输至主机host203的过程采用tcp,且主机host203之后的传输采用tcp。其中,七层elb代理202中实现了quic server,即基于quic协议实现的服务。
87.相关技术中的上述方案存在如下缺点。
88.(1)七层的elb代理需要独占机器,即该部署方案下要求每个边缘集群单独部署2台elb代理。由于云游戏的边缘集群非常多,这大大增加了机器成本和布署运维成本。
89.(2)增加了传输延迟。由于传输链路增加了一跳(七层elb代理),而七层elb代理是在应用层实现的quic server,这会增加内核到应用层的上下文切换。实际测试中,这一跳增加了0.5毫秒的延迟。
90.(3)增加了elb代理,host主机的路由转发规则的变更。
91.本技术实施例提供的方法,能够通过在服务器和客户端中集成用于实现基于quic协议的传输的quic-sdk,以实现基于quic协议的传输。相较于上述方案,无需单独部署用于实现quic server的elb代理,能够节省机器成本和布署运维成本。并且由于无需部署用于实现quic server的elb代理,因此能够避免上述传输延期,以及避免了转发规则的变更导致的维护较为复杂的情况。
92.图3是本技术一个示例性实施例提供的计算机系统的结构框图。该计算机系统300包括:终端310、服务器320。
93.终端310安装和运行有支持云游戏的客户端311。当终端310调起客户端311运行时,终端310的屏幕上显示客户端311的用户界面。客户端311中集成有quic-sdk,quic-sdk用于实现基于quic协议的传输。终端310是用户312使用的终端,应用程序311上登录有用户312的用户帐号。终端310可以泛指多个终端中的一个。可选地,终端310的设备类型包括:智能手机、平板电脑、电子书阅读器、mp3播放器、mp4播放器、膝上型便携计算机和台式计算机中的至少一种。
94.终端310通过无线网络或有线网络与服务器320中运行的服务端相连。
95.服务器320包括一台服务器、多台服务器、云计算平台和虚拟化中心中的至少一种。服务器320用于为支持云游戏的客户端311提供后台服务。可选地,服务器320承担主要计算工作,终端310承担次要计算工作;或者,服务器320承担次要计算工作,终端310承担主要计算工作;或者,服务器320和终端310之间采用分布式计算架构进行协同计算。
96.在一个示意性的例子中,服务器320包括处理器321、用户帐号数据库322、quic-sdk323、面向用户的输入/输出接口(input/output interface,i/o接口)324。其中,处理器321用于加载服务器320中存储的指令,处理用户帐号数据库322和quic-sdk323中的数据;用户帐号数据库322用于存储终端310以及其它终端所使用的用户帐号的数据,比如用户帐号的头像、用户帐号的昵称、用户帐号所在的群组等;quic-sdk323用于实现基于quic协议的传输;面向用户的i/o接口324用于通过无线网络或有线网络和终端310建立通信交换数据。
97.在选型quic库(用于实现quic-sdk)时,有如下要求:(1)能跟进quic标准,持续更新;(2)成熟、稳定;(3)支持跨平台;(4)支持服务端(server)和客户端(client),支持长连接。目前,开源领域没有成熟的、开箱即用的quic库(quic程序库)。总体来看,gquic库,具有代码质量较高、能够持续跟进标准,也能很好的跨平台的特点,但它存在以下缺点。
98.(1)难集成,它依赖了浏览器的很多组件,很难剥离出来。
99.(2)只实现了http(基于quic)的传输方式,不支持长连接。
100.(3)对服务端不友好,不支持高并发,性能和延迟较差。
101.本技术实施例提供了一种quic协议在云游戏场景的应用方案,这个方案的优点是传输延迟低、不增加运维成本、不增加单集群的资源成本,很适合边缘计算、要求低延迟的场景。通过提供quic-sdk(例如通过gamematrix(游戏矩阵)sdk提供),以实现各类客户端与服务端建立基于quic协议的传输。可用于降低云游戏的操作延迟、提升弱网场景下长连接的稳定性。
102.示例地,图4是本技术一个示例性实施例提供的基于quic协议的云游戏的架构模式的示意图。如图4的(a)所示,在该架构下云游戏包括客户端401和服务端(主机host)402。可选地,客户端401和服务端402之间部署有弹性负载均衡(elastic load balance,elb),例如为四层elb。客户端401中集成有quic-sdk,服务端402的各应用层模块中集成有quic-sdk,以实现为服务端402的各应用层模块提供quic服务(quic server),即实现为各应用层模块提供了基于quic协议的传输,quic-sdk用于实现基于quic协议的传输。在客户端和服务端中集成quic-sdk,这个方案的优点是不增加额外的传输延迟、不增加机器成本和运维成本,对于后台布署架构的兼容性较好。
103.集成方式:可选地,本技术实施例中的quic-sdk,是基于对gquic的gquic库进行优化从而得到的。在基于gquic的gquic库进行quic-sdk的集成时,存在三种方案:(1)使用全量的gquic库,并将云游戏的业务代码加入,再构建业务模块;(2)将gquic库的代码抽离,成为新的库,再放入实际项目中使用;(3)在全量的gquic库上进行优化改造,封装成一个新的库,然后在实际项目中使用这个库。本技术的集成方案选择上述方案(3),具有工作量适中、维护成本较低且能够跟随gquic库进行升级的优势。需要说明的是,上述方案以集成gquic库为例进行说明,本技术提供的方案也能够采用上述方案以对其它quic库进行集成,上述
对gquic库集成过程的说明不作为对本技术的限制。可选地,具体的集成方案包括如下方案。
104.对于服务端:基于c++语言(一种开发语言),将quic sdk编译成一个共享库,服务端进行链接引用。基于go语言(一种开发语言),将本机quic(quic native)通过cgo工具(使go语言与c语言相互调用)封装go层的quic sdk。
105.对于客户端:对于android客户端,将quic native代码通过java(一种开发语言)本机接口(java native interface,jni)层封装java层的quic sdk。对于超文本标记语言5(hyper text markup language 5,h5)端和web端,使用web程序集(assembly)技术,将quic sdk编译成wasm(即web assembly),然后加载到浏览器中。
106.在上述集成方案中,采用了共享库的方式,而不是静态库的方式。库是一种可执行代码的二进制形式,可以被操作系统载入内存执行,静态库的代码在编译过程中已经被载入可执行程序,而共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用。采用共享库的原因在于gquic的符号(用于链接相关代码)较多,静态库的方式很容易造成符号冲突,导致无法编译。采用共享库的好处是不需要将quic相关代码集成到程序代码中,因此不会符号冲突。集成的quic-sdk还实现了长连接的功能。
107.针对数据接收的优化:由于gquic库的服务端无法利用多个cpu核心的扩展能力,这会对服务端的并发量瓶颈产生较大的限制。如图4的(b)所示,本技术实施例中,服务端402在接收客户端401发送的udp数据包时,会通过第一线程403解析udp数据包,得到目标连接标识(connection id),并通过第一线程403根据缓存(缓存map)确定目标连接标识对应的quic连接是否为已存在的连接。在目标连接标识对应的quic连接为已存在的连接的情况下,服务端402通过第一线程403根据缓存将包括目标连接标识对应的会话对象(quicsession)的第二线程404确定为目标第二线程,该会话对象与quic连接对应。之后通过第一线程403将udp数据包传递至目标第二线程中的调度组件(dispatcher),并通过目标第二线程中的调度组件确定连接标识对应的会话对象,之后再通过目标第二线程中的调度组件将udp数据包传递至连接标识对应的会话对象,以处理该udp数据包。在连接标识对应的quic连接不为已存在的连接的情况下,服务端402通过第一线程403在n个第二线程404中随机确定目标第二线程,并通过第一线程403将udp数据包传递至目标第二线程中的调度组件。之后服务端会建立udp数据包的quic连接,并在目标第二线程中创建quic连接对应的会话对象,之后通过目标第二线程中的调度组件将udp数据包传递至quic连接对应的会话对象,以处理该udp数据包。通过上述方案,实现完成了对udp数据包的接收,后续处理可通过会话对象实现。
108.针对数据发送:在服务端402的应用层(应用层模块)传输发送数据的过程中,会将发送数据传递至quic线程中的发包处理组件,并通过发包处理组件将发送数据保存至本地发送缓存(local send buffer)中。之后在通过发包处理组件进行数据发送时,服务端402发送本地发送缓存中的数据。在此过程中,服务端402通过发包处理组件基于发送事件(send event)文件描述符(file descriptor,fd)对消息环(message loop)进行唤醒通知,该消息环用于管理传输任务。之后通过消息环唤醒发包处理组件指示发包处理组件进行数据发送。需要说明的是,上述数据发送的方案也能够应用在客户端401中,即客户端401也通过quic-sdk执行上述数据发送的流程。
109.针对崩溃分析:服务端402在接收到客户端404发送的崩溃信号的情况下,通过云存储服务器(例如cos)获取崩溃文件,从而根据崩溃文件确定崩溃的原因和位置。其中,崩溃文所述客户端401通过quic-sdk监测到运行崩溃的情况下生成并上传至云存储服务器的。在接收到客户端401发送的崩溃信号的情况下,客户端401和服务端402会将应用层协议切换为流控制传输协议(stream control transmission protocol,sctp)或websocket。
110.针对性能侦测:在服务端运行的过程中,服务端402将性能侦测数据格式化,并保存至本地文件中。之后在服务端402结束服务的情况下,将本地文件上传至云存储服务器。云存储服务器中的本地文件用于解析得到性能侦测信息,性能侦测信息用于在用户界面中展示,例如在浏览器中展示。
111.通过在服务端和客户端中集成quic-sdk,实现了基于quic协议的传输,可提升数据传输的性能。并且,通过第一线程调度第二线程,不同第二线程可实现管理不同的quic连接,实现了通过不同线程来管理quic连接,使服务端能够充分利用多个核心的并发处理能力,避免了使用单一线程管理quic连接导致对并发量瓶颈限制较大的问题,提升了管理quic连接的效率,有助于提升数据传输的性能。
112.图5是本技术一个示例性实施例提供的一种数据传输方法的流程示意图。该方法可以用于服务器。如图5所示,该方法包括以下步骤。
113.步骤502:接收客户端发送的udp数据包。
114.上述服务器中运行的服务端与客户端建立有通信连接,服务端和客户端中集成有quic-sdk,quic-sdk用于实现基于quic协议的传输。服务器接收udp数据包可指服务器中的应用层模块接收udp数据包,例如媒体传输模块或业务网关接收udp数据包,接收udp数据包的过程是基于quic-sdk实现的。
115.示例性地,该udp数据包包括云游戏的用户对云游戏进行操作的操作指令,或者包括用于鉴权的数据,或者包括性能侦测数据。
116.步骤504:通过第一线程,在n个第二线程中确定目标第二线程。
117.其中,n为大于1的整数。上述第一线程和第二线程是由quic-sdk提供的,quic-sdk提供的组件在服务器的不同线程中运行,从而实现提供了第一线程和第二线程。n个第二线程用于处理udp数据包,不同的第二线程管理了不同的quic连接,每个第二线程能够管理一个或多个quic连接。该目标第二线程是第一线程确定的用于管理udp数据包对应的quic连接的第二线程。可选地,上述quic连接为长连接。
118.第一线程用于接收上述udp数据包,第一线程在接收到上述udp数据包,会判断该udp数据包对应的quic连接是否为已存在的连接。在udp数据包对应的quic连接为已存在的连接的情况下,第一线程会确定用于管理该已存在的连接的第二线程作为目标第二线程。在udp数据包对应的quic连接不为已存在的连接的情况下,第一线程会在n个第二线程中按顺序确定目标第二线程,或者按照第二线程管理的quic连接的数量,或者随机确定目标第二线程。服务端会为该udp数据包在目标第二线程中建立相应的quic连接,此时目标第二线程会成为用于管理该udp数据包的quic连接的线程。
119.步骤506:通过第一线程将udp数据包传递至目标第二线程。
120.目标第二线程用于管理该udp数据包的quic连接,通过该quic连接能够实现对udp数据包的解析、处理和发送。可选地,第二线程中的每个线程包括调度组件,该调度组件用
于管理一个或多个会话对象,每个会话对象对应于一个已建立的quic连接,以负责管理quic连接,对quic连接对应的udp数据包进行处理。第一线程在将udp数据包传递至目标第二线程,会将udp数据包传递至目标第二线程的调度组件,目标第二线程的调度组件根据udp数据包的quic连接和会话对象之间的对应关系,将udp数据包传递至udp数据包的quic连接对应的会话对象,以实现对udp数据包进行处理。
121.综上所述,本实施例提供的方法,通过第一线程调度第二线程,不同第二线程可实现管理不同的quic连接,实现了通过不同线程来管理quic连接,使服务端能够充分利用多个核心的并发处理能力,避免了使用单一线程管理quic连接导致对并发量瓶颈限制较大的问题,提升了管理quic连接的效率,有助于提升数据传输的性能。
122.以下实施例对针对数据接收的优化方案进行介绍。
123.图6是本技术一个示例性实施例提供的另一种数据传输方法的流程示意图。该方法可以用于服务器。如图6所示,该方法包括以下步骤。
124.步骤602:接收客户端发送的udp数据包。
125.上述服务器中运行的服务端与客户端建立有通信连接,服务端和客户端中集成有quic-sdk,quic-sdk用于实现基于quic协议的传输。可选地,服务端通过第一线程进行侦听(udp listen),以接收客户端发送的udp数据包。第一线程也可称为主线程,第一线程是由quic-sdk提供的。
126.服务端单独使用一个线程进行侦听,并且对于侦听,服务端使用单独的udp fd。实现第一线程侦听的过程:服务端创建一个udp fd,对udp fd设置复用规则,例如包括地址复用(reuse addr)、端口复用(reuse port)属性,然后绑定侦听地址,以使得第一线程调用接收函数(recvfrom())进行udp数据包的接收。上述复用规则用于使不同线程绑定相同的针对udp数据包的侦听地址。上述侦听地址指向客户端的发送地址,用于实现侦听客户端发送的数据包,以使得服务端获知其接收的udp数据包是由客户端发送的,从而进行后续处理,对于非侦听地址发送的数据包不会进行上述处理。
127.步骤604:响应于第一线程接收到udp数据包,通过第一线程解析udp数据包得到目标连接标识。
128.目标连接标识(connection id)用于标识udp数据对应的quic连接。服务器中的不同第二线程管理了不同的quic连接,每个第二线程能够管理一个或多个quic连接。通过第一线程根据解析得到的目标连接标识,即可确定用于管理udp数据包的quic连接的第二线程。上述第二线程是由quic-sdk提供的。
129.步骤606:通过第一线程,根据目标连接标识在n个第二线程中确定目标第二线程。
130.该目标第二线程是第一线程确定的用于管理udp数据包对应的quic连接的第二线程,n为大于1的整数。第二线程也可称为子线程,可选地,上述quic连接为长连接。不同第二线程所管理的quic连接与连接标识具有对应关系,通过第一线程,根据目标连接标识即可确定用于管理udp数据包的quic连接的目标第二线程。通过解析连接标识来确定第二线程,提供了一种维护线程和quic连接的对应关系的方式,可实现快速确定目标第二线程。
131.第一线程在解析得到udp数据包的目标连接标识的情况下,会查询该目标连接标识对应的quic连接是否为已存在的连接,即查询目标连接标识对应的quic连接为新连接(还没连上)还是老连接(已连上了)。
132.针对目标连接标识对应的quic连接不为已存在的连接的情况:在目标连接标识对应的quic连接不为已存在的连接的情况下,服务端会通过第一线程在n个第二线程中随机确定目标第二线程。通过根据缓存结合连接标识判断udp的quic连接未存在的情况,随机确定目标第二线程,提供了一种在未建立连接的情况下调度第二线程的方式。
133.针对目标连接标识对应的quic连接为已存在的连接的情况:在目标连接标识对应的quic连接为已存在的连接的情况下,服务端通过第一线程根据缓存将用于管理目标连接标识对应的quic连接的第二线程确定为目标第二线程。示例地,该缓存是基于开发语言中的map(一种键值对的集合接口)实现的,可称为缓存map。map提供了一个通用的元素存储方法,基于map实现的集合类用于存储元素对(即“键”和“值”),其中每个键映射到一个值。可选地,服务端通过第一线程根据缓存将包括目标连接标识对应的会话对象(quicsession)的第二线程确定为目标第二线程。其中,该缓存用于存储不同的第二线程中的会话对象和连接标识之间的对应关系,会话对象与quic连接对应,用于负责管理其对应的quic连接。通过根据缓存结合连接标识来判断udp的quic连接是否已存在,从而根据缓存确定目标第二线程,提供了一种在已建立quic连接的情况下,快速选择子线程的方式。
134.步骤608:通过第一线程将udp数据包传递至目标第二线程。
135.可选地,n个第二线程中的每个线程包括调度组件(dispatcher),该调度组件用于管理一个或多个会话对象,会话对象与quic连接对应。服务端通过第一线程将udp数据包传递至目标第二线程中的调度组件。目标第二线程中的调度组件在接收到udp数据包后,也会解析出目标连接标识并判断是否为已存在的连接。
136.针对目标连接标识对应的quic连接为已存在的连接的情况:服务端通过目标第二线程中的调度组件根据上述缓存确定目标连接标识对应的会话对象,之后通过目标第二线程中的调度组件将udp数据包传递至目标连接标识对应的会话对象(会话对象负责目标连接标识对应的quic连接),以对udp数据包进行处理。通过由每个子线程的调度组件来调度quic连接会话对象,可实现使每个子线程支持多个quic连接,从而提升管理quic连接的效率。
137.针对目标连接标识对应的quic连接不为已存在的连接的情况:服务端通过第一线程将udp数据包传递至目标第二线程中的调度组件,在目标第二线程中的调度组件确定目标连接标识对应的quic连接不为已存在的连接的情况下,会建立udp数据包的quic连接,并在目标第二线程中创建udp数据包的quic连接对应的会话对象。之后通过目标第二线程中的调度组件将udp数据包传递至udp数据包的quic连接对应的会话对象。
138.可选地,在上述过程中,服务端会创建一个新的udp fd,并对udp fd设置复用规则,例如包括地址复用(reuse addr)、端口复用(reuse port)属性,然后绑定侦听地址。上述复用规则用于使第一线程和第二线程绑定相同的针对udp数据包的侦听地址。之后,服务端会对该udp fd使用连接函数(connect(peer_addr)),连接到对端的地址(peer_addr)上。在创建会话对象时,服务端会基于上述udp fd在目标第二线程中创建udp数据包的quic连接对应的会话对象(连接对象,例如包括quic会话(quicsession)、quic连接
(quicconnection)、quic读取(quicreader)、quic写入(quicwriter)等),以注册读写事件,之后这个udp fd的读写操作都在这个quicsession中处理。其中,udp fd设置有复用规则,复用规则用于第一线程和第二线程绑定相同的针对udp数据包的侦听地址。服务端还会在缓存中保存目标第二线程中的会话对象与目标连接标识的对应关系。
139.通过在缓存中存储会话对象与连接标识的对应关系,可实现通过缓存来快速确定quic连接和第二线程的对应关系。通过在目标第二线程中建立udp数据包的quic连接,并创建连接相应的会话对象,以实现管理quic连接,提供了对未建立的quic连接进行建立并对udp数据包进行调度的具体实现过程。
140.需要说明的是,主线程的udp fd和子线程的udp fd都设置了复用规则(reuse addr、reuse port属性),因为若不设置,会导致在linux上绑定(bind)同一个侦听地址(listen addr)失败。通过对udp fd设置复用规则,可避免不同udp fd绑定同一个地址导致地址冲突从而侦听失败。子线程在创建新连接时,要对udp fd执行connect(peer_addr)。这么做的好处是:会在linux内核做一个映射(即peer_addr至线程的映射),后续收到peer_addr发来的数据包时,服务端能够优先唤醒对应的线程,然后将udp数据包分派给这个线程,以提升效率。在服务端支持上述多线程模型后,每个quic连接对应一个子线程中的udp fd,服务端可以使用发送函数(send())和接收函数(recv())来代替发送至函数(sendto(peer_addr))和接收来自函数(recvfrom(src_addr))。这样在收发数据时,无需进行内核寻址,因此减少了一次内核寻址的过程,以降低延迟。
141.综上所述,本实施例提供的方法,通过第一线程调度第二线程,不同第二线程可实现管理不同的quic连接,实现了通过不同线程来管理quic连接,使服务端能够充分利用多个核心的并发处理能力,避免了使用单一线程管理quic连接导致对并发量瓶颈限制较大的问题,提升了管理quic连接的效率,有助于提升数据传输的性能。
142.以下实施例对针对数据发送的优化方案进行介绍。
143.图7是本技术一个示例性实施例提供的又一种数据传输方法的流程示意图。该方法可以用于服务器。如图7所示,该方法包括以下步骤。
144.步骤702:在服务端的应用层传输发送数据的过程中,将发送数据传递至quic线程中的发包处理组件。
145.上述服务器中运行的服务端与客户端建立有通信连接,服务端和客户端中集成有quic-sdk,quic-sdk用于实现基于quic协议的传输。上述quic线程是由quic-sdk提供的线程,quic线程具有quic-sdk提供的功能,quic线程中的组件是由quic-sdk提供的。服务端的应用层传输发送数据即服务端的应用层模块进行发送数据的发送。
146.步骤704:通过发包处理组件将发送数据保存至本地发送缓存中。
147.在发包处理组件接收到发送数据时,服务端会将发送数据保存至本地发送缓存(local send buffer)中。本地发送缓存中存储的数据是用于后续进行发送的数据。
148.步骤706:在通过发包处理组件进行数据发送时,发送本地发送缓存中的数据。
149.可选地,在通过发包处理组件进行数据发送时,服务端会将本地发送缓存中全部的待发送数据取出,并进行批量组包,从而发送本地发送缓存中的全部数据。通过一次性发送本地发送缓存中的全部数据,相较于针对数据按照队列逐个发送的方式,能够实现批量发送数据,从而提升数据发送的效率。
150.数据发送的任务是由消息环(messageloop)组件进行管理的。消息环也称为消息循环,它是一种等待和分派消息的编程结构,是消息驱动机制的基础。消息环组件能够使所有的任务(例如发送数据的任务)都变成异步驱动。消息环组件用于接收任务,以生成任务列表,并采用循环的方式触发执行任务列表中的任务。可选地,在对发送数据进行传输的过程中,服务端会通过发包处理组件基于消息环组件的发送事件文件描述符(sendeventfd)对消息环组件进行唤醒通知,消息环用于管理传输任务。之后服务端会通过消息环组件来唤醒发包处理组件,以指示发包处理组件进行数据发送,从而实现通过发包处理组件对数据进行发送。
151.在gquic库中,数据发送的流程为应用层将数据传递给gquic库,由quic线程中的消息环组件创建一个异步任务,之后消息环组件按照任务列表的执行唤醒quic线程,quic线程中的发包处理组件取出异步任务,之后发包处理组件执行发包处理任务,将最终的组包发送到操作系统内核,完成数据发送。
152.本技术实施例提供的方法,通过由发包处理组件获取应用层发送的数据,并通过发送事件文件描述符对消息环组件进行通知,以使消息环唤醒发包处理组件进行数据发送。相较于上述gquic的方案,能够无需等待消息环组件的指示,主动对消息环组件进行唤醒以执行发送数据的任务,实现简化从投递发送任务到执行发送任务的流程,提升数据发送的效率。
153.需要说明的是,本技术实施例中内部的事件通知使用eventfd(即sendeventfd),而非使用管道文件描述符(pipefd)。eventfd和pipefd均用于进行事件通知,示例地,对于操作系统内核来说,eventfd的开销更低,eventfd只需要创建一个虚拟文件,而pipefd需要创建两个。并且,eventfd可用于多路复用模型中,从而实现异步的信号通知功能。因此,相较于pipefd,使用eventfd能够提升通知的效率。
154.并且,本技术实施例还对一次循环(loop)处理消息的个数进行提升。例如,在gquic库中,当存在两个发送数据的任务的情况下,消息环组件通知发包处理组件进行发送时,默认每次只通知执行一个数据的发送任务,对于两个数据的发送需要通知两次,发包处理组件执行一次发送后需要等待下一次通知。本技术实施例提供的方法中,由于不同发送任务的数据均存储在本地发送缓存中,因此能够实现使消息环组件在对发包处理组件进行的一次通知中,指示执行多个发送任务,即对多个任务的数据进行发送,从而使得发包处理组件能够将本地发送缓存中多个发送任务的数据进行批量组包并进行发送,能够提高数据传输的吞吐量。
155.示例地,图8是本技术一个示例性实施例提供的发送数据的过程的示意图。如图8所示,在服务端的应用层模块801发送数据时,会将数据传递给quic库(quic线程802),quic发包处理组件803会将数据保存到本地发送缓存中,并通知(notify())消息环组件804的sendeventfd对消息环组件进行唤醒。消息环组件804会为该发送事件在任务列表中建立相应的发送任务(posttask()),并按照本地事件环(native event loop)对任务列表中的任务进行执行,以唤醒(wakeup())quic发包处理组件803,并指示quic发包处理组件803进行数据发送。quic发包处理组件803会从本地发送缓存中将待发送数据都取出,批量组包并发送到操作系统内核,从而完成数据的发送。其中,操作系统内核用于实现向数据的接收端发送数据。示例地,该操作系统内核指linux内核。示例地,在操作系统内核获取到需要发送的
数据后,会将数据转换为数据包,并调用服务器的网卡驱动使网卡获取到需要发送的数据并向网卡指示进行数据发送,从而使服务器的网卡将获取的数据发送至数据的接收端。
156.综上所述,本实施例提供的方法,通过在发送数据的过程中先将发送数据保存至本地缓存再进行发送,相较于对发送数据进行拷贝,之后再进行数据发送的方案能够减小内存开销。
157.以下实施例对针对崩溃分析的优化方案进行介绍。
158.图9是本技术一个示例性实施例提供的再一种数据传输方法的流程示意图。该方法可以用于服务器。如图9所示,该方法包括以下步骤。
159.步骤902:在接收到客户端发送的崩溃信号的情况下,通过云存储服务器获取崩溃文件。
160.上述服务器中运行的服务端与客户端建立有通信连接,服务端和客户端中集成有quic-sdk,quic-sdk用于实现基于quic协议的传输。上述崩溃文件是客户端通过quic-sdk监测到运行崩溃的情况下生成并上传至云存储服务器的,可选地,该云存储服务器为cos。服务端通过quic-sdk实现对崩溃信号的侦听。
161.可选地,上述崩溃文件为小存储器转储文件(minidump),客户端在执行崩溃时,会生成崩溃时的minidump。此时客户端会将minidump上传至cos,并通知服务端。可选地,崩溃信号包括反映quic产生了崩溃的信息以及minidump在cos中的文件路径中的至少一种。
162.在接收到客户端发送的崩溃信号的情况下,客户端和服务端会对应用层协议进行切换。例如,将应用层由quic-sdk实现的quic协议切换到流控制传输协议(stream control transmission protocol,sctp)或全双工通信协议(websocket)。sctp是一种在网络连接的两端之间同时传输多个数据流的协议,websocket是一种在单个传输控制协议(transmission control protocol,tcp)连接上进行全双工通信的协议。sctp和websocket是基于连接的,而quic-sdk实现的quic协议基于用户数据报协议(user datagram protocol,udp),udp是基于非连接的。基于连接来传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方。而udp的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。本实施例提供的方法,通过在系统崩溃的情况下,切换应用层协议,能够实现在崩溃后切换至稳定协议以保证服务质量。
163.示例性地,上述应用层是开放式系统互联(open system interconnection,osi)模型下的第七层,osi模型将网络通信的工作分为七层,分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。
164.步骤904:根据崩溃文件确定崩溃的原因和位置。
165.该崩溃文件是客户端通过quic-sdk监测到运行崩溃的情况下生成并上传至云存储服务器的。可选地,本技术实施例中的quic-sdk(quic库)集成了崩溃板(breakpad)库,用以对运行中的崩溃进行检测。在构建quic库时,服务端会将代码中的符号信息卸除(dump)下来,并保存成为符号文件。在向外部分发quic库时,分发的是去掉了符号信息的quic库,从而减少库文件的大小,以及减少符号信息的泄漏。
166.服务端在获取到崩溃文件后,会根据构建quic库时保存的符号文件,来定位崩溃的原因和位置,从而进行崩溃的分析。
167.示例地,图10是本技术一个示例性实施例提供的崩溃分析的过程的示意图。如图10所示,客户端1001向操作系统内核注册quic库(quic-sdk提供)提供的崩溃信号处理函数(crashhandler()),之后客户端1001通过该崩溃信号处理函数检测操作系统内核的运行崩溃。在检测到运行崩溃的情况下,客户端1001会生成崩溃文件,并上传至cos1003,并且客户端1001还会向云游戏服务端1002发送崩溃信号。在检测到崩溃时,客户端1001还会将应用层降级到备用通道(sctp或websocket)。云游戏服务端1002会通过cos1003下载崩溃文件,并根据构建系统时保存的符号文件结合崩溃文件,分析崩溃的原因和位置。
168.综上所述,本实施例提供的方法,通过服务器获取在崩溃情况下客户端生成的崩溃文件,以对崩溃情况进行分析,提供了一种简单便捷的分析系统崩溃情况的实现方案。并且崩溃文件经由云存储服务器传输,能够保证传输的稳定性,且便于进行崩溃的历史记录。
169.以下实施例对针对性能侦测的优化方案进行介绍。
170.图11是本技术一个示例性实施例提供的还一种数据传输方法的流程示意图。该方法可以用于服务器。如图11所示,该方法包括以下步骤。
171.步骤1102:在服务端运行的过程中,将性能侦测数据格式化,并保存至本地文件中。
172.服务端运行指服务端在为客户端提供后台服务,例如用户在使用客户端进行云游戏,服务器在此过程中会运行云游戏。通过将性能侦测数据进行格式化处理,能够便于后续的分析。示例地,格式化处理指通过格式操作使任意类型的数据转换成一个字符串,也即是按照便于读取分析的格式对数据进行处理,使得处理得到的数据的格式满足读取分析的要求,从而提升后续读取分析的效率。可选地,上述格式化处理所采用的格式是开发人员设置的。可选地,性能侦测数据包括基于quic协议的收发包数、收发速度等反映基于quic协议的传输性能的数据。例如,未处理的基于quic协议的发送速度数据为每秒“10000000000”kb(二进制),通过格式化处理后,得到的数据为每秒“1024”kb(十进制)。
173.步骤1104:在服务端结束服务的情况下,将本地文件上传至云存储服务器。
174.服务端结束服务指服务端停止为客户端提供后台服务,例如用户在客户端中退出,服务器在此过程中会停止运行云游戏。上述云存储服务器中的本地文件用于解析得到性能侦测信息,性能侦测信息是能够直观向用户展示的信息,性能侦测信息用于在用户界面中展示。
175.示例地,图12是本技术一个示例性实施例提供的相关技术中进行性能侦测的过程的示意图。如图12所示,边缘集群1201的服务模块通过使用prometheus-sdk方法将侦测数据推送到后台的侦测服务器1202,从而在后台收集和存储指标数据。之后通过grafana在浏览器1203中进行侦测数据的查询和展示。上述方案的缺点是对后台服务(存储服务prometheus、接收网关pushgateway等)的并发量要求高,机器成本大。但是对于侦测来说,日常的查询频率较低,使用大量的机器实现上述方案对资源的利用效率不高。
176.示例地,图13是本技术一个示例性实施例提供的性能侦测的过程的示意图。如图13所示,在本技术实施例提供的方案中,在服务端1302的程序运行过程中,服务端1302将侦测数据格式化,并保存到本地文件中。在用户退出客户端1301时,服务端1302将日志文件上传到cos1303。在事后查询侦测数据时,通过下载日志文件,然后对日志文件进行解析,能够实现将其直观的展示到web界面上。
177.综上所述,本实施例提供的方法,通过在服务端运行的过程中,保存性能侦测数据并在结束服务时进行上传,实现了轻量化的进行性能侦测,且通过云存储服务器能够便捷的获取性能侦测数据并分析展示,可降低服务端进行性能侦测的开销。
178.对于基于quic协议的传输的收发延迟,本技术实施例对此也提供了优化的方案。图14是本技术一个示例性实施例提供的基于quic协议的传输过程的示意图。如图14所示,发送端中存在流量控制、拥塞控制、pacing环节1401来限制发送的速度,以减少针对对端、网络的拥塞程度。接收端接收到数据包后,会执行延迟确认流程1402,确认当前的接收窗口是否足够,如果不够,会向发送端发送延迟确认,并通知对端降低发送速率。本技术实施例提供的优化方案包括如下几个环节。
179.针对流量控制:示例地,图15是本技术一个示例性实施例提供的流量控制的原理的示意图。如图15所示,发送端1501和接收端1502建立有quic连接1503,在quic协议下,存在两级流量控制。分别为连接(connection)级和流(stream)级,connection级是对一个quic连接进行整体的流量控制,stream级是对quic连接中的每个请求进行流量控制,以减少stream的相互影响。这样做的好处是支持在应用层对每个连接、stream设置不同的窗口大小。且对于乱序(不同时序)收到的数据包,接收窗口(反映可流量的大小)仍旧能够向之后的时间滑动。如果发送端的发送窗口大小设置过小,会影响发送速率。比如:如果窗口不满足发送的需求,则发送端会缓存数据,等发送窗口恢复,即满足发送需求后再发送。如果接收端的接收窗口大小设置过小,当接收的数据量超过窗口大小时,会向发送端发送延迟确认,表示接收端没有空间接收了。这样发送端就不会持续发送了,它会等到接收端有足够的接收窗口才发送。
180.本技术实施例提供的quic-sdk,相较于gquic库,调大了发送端的发送窗口大小,以及调大了接收端的接收窗口大小。调整的过程同时涉及上述connection级和stream级,即调整包括调大了发送端的和接收端各自的流窗口大小(stream windows size)和连接窗口大小(connection windows size)。调整的数值是根据收发包的实际情况确定的,也能够根据经验值确定。
181.针对拥塞控制:发送端通过拥塞控制中的探测算法,能够实时探测网络链路中的实时带宽大小,探测的实时带宽大小会限制发送端的发送速度,这样能够避免全局的网络拥塞。示例地,发送端通过探测算法,能够周期性地探测网络的带宽大小,并交替测量一段时间内的带宽极大值和时延极小值,之后发送端根据两者乘积可确定拥塞窗口大小。采用交替测量的原因在于带宽和时延是正相关的,即带宽极大时网络拥塞,时延也会极大,时延极小时网络畅通,带宽也会极小,上述探测方式能够使得拥塞窗口的值与网络的实际容量保持一致。拥塞窗口的大小能够反映网络的拥塞程度,从而以此进行拥塞的优化。本技术实施例提供的quic-sdk,相较于gquic库,提供了修改的拥塞控制中的探测算法,能够使其返回的当前的网络带宽足够大,例如能够支持探测到100mb/s的带宽。
182.针对pacing:pacing是指均速发送,即按照相同的时间间隔(pacing间隔)发送数据。如果当前需要发送的数据量较大,若瞬间将全部数据发出,则需要很大的传输速度,很可能导致网络拥塞。本技术实施例提供的quic-sdk,对于pacing的实现,是发送端通过探测算法获取到当前的带宽,然后按时间单位(例如10ms/50ms/100ms)来分配可发送的数据量,而不是采用瞬间发送的方式。所以当上述探测算法返回的当前带宽足够大时,pacing间隔
可以忽略不计了。因此在该情况下发送端在需要发送数据时会马上进行数据的发送,而不是间隔发送。
183.上述方案增加的成本(机器成本、运维成本)几乎忽略不计。并且在quic上线后,实际场景下业务网关的连接稳定性比websocket提升了33%左右,用户操作指令的发送延迟比sctp降低13%左右。在弱网环境下,quic比websocket和sctp有更显著的体验提升。
184.图16是本技术一个示例性实施例提供的数据传输方法的流程示意图。该方法可以用于客户端。如图16所示,该方法包括以下步骤。
185.步骤1602:向服务端发送udp数据包。
186.上述客户端与服务器中运行的服务端建立有通信连接,服务端和客户端中集成有quic-sdk,quic-sdk用于实现基于quic协议的传输。示例性地,该udp数据包包括云游戏的用户对云游戏进行操作的操作指令,或者包括用于鉴权的数据,或者包括性能侦测数据。
187.服务端用于通过第一线程,在n个第二线程中确定目标第二线程,并通过第一线程将udp数据包传递至目标第二线程。n个第二线程用于处理udp数据包,目标第二线程用于管理udp数据包对应的quic连接,第一线程和第二线程是由quic-sdk提供的,n为大于1的整数。
188.可选地,在客户端的应用层传输发送数据的过程中,将发送数据传递至quic线程中的发包处理组件,quic线程是由quic-sdk提供的。通过发包处理组件将发送数据保存至本地发送缓存中。在通过发包处理组件进行数据发送时,发送本地发送缓存中的数据。需要说明的是,客户端进行发送数据传输的具体过程可参见图7对应的实施例,即图7对应的实施例也能够以客户端为执行主体进行执行,本技术实施例在此不作赘述。
189.综上所述,本实施例提供的方法,通过第一线程调度第二线程,不同第二线程可实现管理不同的quic连接,实现了通过不同线程来管理quic连接,使服务端能够充分利用多个核心的并发处理能力,避免了使用单一线程管理quic连接导致对并发量瓶颈限制较大的问题,提升了管理quic连接的效率,有助于提升数据传输的性能。
190.需要说明的是,本技术实施例提供的方法步骤的先后顺序可以进行适当调整,步骤也可以根据情况进行相应增减,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化的方法,都应涵盖在本技术的保护范围之内,因此不再赘述。
191.图17是本技术一个示例性实施例提供的第一种数据传输装置的结构示意图。所述装置中运行的服务端与客户端建立有通信连接,所述服务端和所述客户端中集成有quic-sdk,所述quic-sdk用于实现基于quic协议的传输。如图17所示,该装置包括以下模块。
192.接收模块1701,用于接收所述客户端发送的用户数据报协议udp数据包。
193.确定模块1702,用于通过第一线程,在n个第二线程中确定目标第二线程,所述n个第二线程用于处理所述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数。
194.传递模块1703,用于通过所述第一线程将所述udp数据包传递至所述目标第二线程。
195.在一个可选的设计中,所述确定模块1702,用于:响应于所述第一线程接收到所述udp数据包,通过所述第一线程解析所述udp数据包,得到目标连接标识。
196.通过所述第一线程,根据所述目标连接标识在所述n个第二线程中确定目标第二线程。
197.在一个可选的设计中,所述确定模块1702,用于:在所述目标连接标识对应的quic连接为已存在的连接的情况下,通过所述第一线程,根据缓存将包括所述目标连接标识对应的会话对象的第二线程确定为所述目标第二线程。
198.其中,所述缓存用于存储不同的所述第二线程中的会话对象和连接标识之间的对应关系,所述会话对象与所述quic连接对应。
199.在一个可选的设计中,所述n个第二线程中的每个线程包括调度组件,所述调度组件用于管理一个或多个所述会话对象。所述传递模块1703,用于:通过所述第一线程将所述udp数据包传递至所述目标第二线程中的所述调度组件。
200.所述确定模块1702,用于通过所述目标第二线程中的所述调度组件确定所述目标连接标识对应的会话对象。
201.所述传递模块1703,用于通过所述目标第二线程中的所述调度组件将所述udp数据包传递至所述目标连接标识对应的会话对象。
202.在一个可选的设计中,所述确定模块1702,用于:在所述目标连接标识对应的quic连接不为已存在的连接的情况下,通过所述第一线程在所述n个第二线程中随机确定所述目标第二线程。
203.在一个可选的设计中,所述n个第二线程中的每个线程包括调度组件,所述调度组件用于管理一个或多个会话对象,所述会话对象与所述quic连接对应。如图18所示,所述装置还包括以下模块。
204.所述传递模块1703,用于通过所述第一线程将所述udp数据包传递至所述目标第二线程中的所述调度组件。
205.建立模块1704,用于在所述目标第二线程中的所述调度组件确定所述目标连接标识对应的quic连接不为所述已存在的连接的情况下,建立所述udp数据包的quic连接。
206.所述建立模块1704,用于在所述目标第二线程中创建所述udp数据包的quic连接对应的会话对象。
207.所述传递模块1703,用于通过所述目标第二线程中的所述调度组件将所述udp数据包传递至所述udp数据包的quic连接对应的会话对象。
208.在一个可选的设计中,如图19所示,所述装置还包括以下模块。
209.保存模块1705,用于在缓存中保存所述目标第二线程中的所述会话对象与所述目标连接标识的对应关系。
210.在一个可选的设计中,所述建立模块1704,用于:基于udp文件描述符在所述目标第二线程中创建所述udp数据包的quic连接对应的会话对象。
211.其中,所述udp文件描述符设置有复用规则,所述复用规则用于所述第一线程和所述第二线程绑定相同的针对所述udp数据包的侦听地址。
212.在一个可选的设计中,如图20所示,所述装置还包括以下模块。
213.所述传递模块1703,用于在所述服务端的应用层传输发送数据的过程中,将所述发送数据传递至quic线程中的发包处理组件,所述quic线程是由所述quic-sdk提供的。
214.保存模块1705,用于通过所述发包处理组件将所述发送数据保存至本地发送缓存中。
215.发送模块1706,用于在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的数据。
216.在一个可选的设计中,所述发送模块1706,用于:在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的全部数据。
217.在一个可选的设计中,如图21所示,所述装置还包括以下模块。
218.通知模块1707,用于通过所述发包处理组件基于发送事件文件描述符对消息环进行唤醒通知,所述消息环用于管理传输任务。
219.唤醒模块1708,用于通过所述消息环唤醒所述发包处理组件以指示所述发包处理组件进行数据发送。
220.在一个可选的设计中,如图22所示,所述装置还包括以下模块。
221.获取模块1709,用于在接收到所述客户端发送的崩溃信号的情况下,通过云存储服务器获取崩溃文件。
222.所述确定模块1702,用于根据所述崩溃文件确定崩溃的原因和位置。
223.其中,所述崩溃文件是所述客户端通过所述quic-sdk监测到运行崩溃的情况下生成并上传至所述云存储服务器的。
224.在一个可选的设计中,如图23所示,所述装置还包括以下模块。
225.切换模块1710,用于在接收到所述客户端发送的所述崩溃信号的情况下,对应用层协议进行切换。
226.在一个可选的设计中,如图24所示,所述装置还包括以下模块。
227.保存模块1705,用于在所述服务端运行的过程中,将性能侦测数据格式化,并保存至本地文件中。
228.上传模块1711,用于在所述服务端结束服务的情况下,将所述本地文件上传至云存储服务器。
229.其中,所述云存储服务器中的所述本地文件用于解析得到性能侦测信息,所述性能侦测信息用于在用户界面中展示。
230.图25是本技术一个示例性实施例提供的第九种数据传输装置的结构示意图。所述装置与服务器中运行的服务端建立有通信连接,所述服务端和所述装置中集成有quic-sdk,所述quic-sdk用于实现基于quic协议的传输。如图25所示,该装置包括以下模块。
231.发送模块2501,用于向所述服务端发送udp数据包。
232.其中,所述服务端用于通过第一线程,在n个第二线程中确定目标第二线程,并通过所述第一线程将所述udp数据包传递至所述目标第二线程,所述n个第二线程用于处理所述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数。
233.在一个可选的设计中,如图26所示,所述装置还包括以下模块。
versatile disc,dvd)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知所述计算机存储介质不局限于上述几种。上述的系统存储器2704和大容量存储设备2707可以统称为存储器。
244.存储器存储有一个或多个程序,一个或多个程序被配置成由一个或多个中央处理单元2701执行,一个或多个程序包含用于实现上述方法实施例的指令,中央处理单元2701执行该一个或多个程序实现上述各个方法实施例提供的方法。
245.根据本技术的各种实施例,所述计算机设备2700还可以通过诸如因特网等网络连接到网络上的远程计算机设备运行。也即计算机设备2700可以通过连接在所述系统总线2705上的网络接口单元2711连接到网络2712,或者说,也可以使用网络接口单元2711来连接到其他类型的网络或远程计算机设备系统(未示出)。
246.所述存储器还包括一个或者一个以上的程序,所述一个或者一个以上程序存储于存储器中,所述一个或者一个以上程序包含用于进行本技术实施例提供的方法中由计算机设备所执行的步骤。
247.本技术实施例中还提供了一种计算机可读存储介质,该可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,当该至少一条指令、至少一段程序、代码集或指令集由计算机设备的处理器加载并执行时,实现上述各方法实施例提供的数据传输方法。
248.本技术还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例提供的数据传输方法。
249.本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,该程序可以存储于一种计算机可读存储介质中,上述提到的可读存储介质可以是只读存储器,磁盘或光盘等。
250.以上所述仅为本技术的可选实施例,并不用以限制本技术,凡在本技术的精神和原则之内,所作的任何修改、等同切换、改进等,均应包含在本技术的保护范围之内。

技术特征:
1.一种数据传输方法,其特征在于,所述方法由服务器执行,所述服务器中运行的服务端与客户端建立有通信连接,所述服务端和所述客户端中集成有快速用户数据报协议互联网连接-软件开发工具包quic-sdk,所述quic-sdk用于实现基于quic协议的传输,所述方法包括:接收所述客户端发送的用户数据报协议udp数据包;通过第一线程,在n个第二线程中确定目标第二线程,所述n个第二线程用于处理所述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数;通过所述第一线程将所述udp数据包传递至所述目标第二线程。2.根据权利要求1所述的方法,其特征在于,所述通过第一线程,在n个第二线程中确定目标第二线程,包括:响应于所述第一线程接收到所述udp数据包,通过所述第一线程解析所述udp数据包,得到目标连接标识;通过所述第一线程,根据所述目标连接标识在所述n个第二线程中确定所述目标第二线程。3.根据权利要求2所述的方法,其特征在于,所述通过所述第一线程,根据所述目标连接标识在所述n个第二线程中确定所述目标第二线程,包括:在所述目标连接标识对应的quic连接为已存在的连接的情况下,通过所述第一线程,根据缓存将包括所述目标连接标识对应的会话对象的第二线程确定为所述目标第二线程;其中,所述缓存用于存储不同的所述第二线程中的会话对象和连接标识之间的对应关系,所述会话对象与所述quic连接对应。4.根据权利要求3所述的方法,其特征在于,所述n个第二线程中的每个线程包括调度组件,所述调度组件用于管理一个或多个所述会话对象;所述通过所述第一线程将所述udp数据包传递至所述目标第二线程,包括:通过所述第一线程将所述udp数据包传递至所述目标第二线程中的所述调度组件;通过所述目标第二线程中的所述调度组件确定所述目标连接标识对应的会话对象;通过所述目标第二线程中的所述调度组件将所述udp数据包传递至所述目标连接标识对应的会话对象。5.根据权利要求2所述的方法,其特征在于,所述通过所述第一线程,根据所述目标连接标识在所述n个第二线程中确定所述目标第二线程,包括:在所述目标连接标识对应的quic连接不为已存在的连接的情况下,通过所述第一线程,在所述n个第二线程中随机确定所述目标第二线程。6.根据权利要求5所述的方法,其特征在于,所述n个第二线程中的每个线程包括调度组件,所述调度组件用于管理一个或多个会话对象,所述会话对象与所述quic连接对应;所述通过所述第一线程将所述udp数据包传递至所述目标第二线程,包括:通过所述第一线程将所述udp数据包传递至所述目标第二线程中的所述调度组件;在所述目标第二线程中的所述调度组件确定所述目标连接标识对应的quic连接不为所述已存在的连接的情况下,建立所述udp数据包的quic连接;在所述目标第二线程中创建所述udp数据包的quic连接对应的会话对象;
通过所述目标第二线程中的所述调度组件将所述udp数据包传递至所述udp数据包的quic连接对应的会话对象。7.根据权利要求6所述的方法,其特征在于,所述方法还包括:在缓存中保存所述目标第二线程中的所述会话对象与所述目标连接标识的对应关系。8.根据权利要求6所述的方法,其特征在于,所述在所述目标第二线程中创建所述udp数据包的quic连接对应的会话对象,包括:基于udp文件描述符,在所述目标第二线程中创建所述udp数据包的quic连接对应的会话对象;其中,所述udp文件描述符设置有复用规则,所述复用规则用于所述第一线程和所述第二线程绑定相同的针对所述udp数据包的侦听地址。9.根据权利要求1至8任一所述的方法,其特征在于,所述方法还包括:在所述服务端的应用层传输发送数据的过程中,将所述发送数据传递至quic线程中的发包处理组件,所述quic线程是由所述quic-sdk提供的;通过所述发包处理组件将所述发送数据保存至本地发送缓存中;在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的数据。10.根据权利要求9所述的方法,其特征在于,所述在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的数据,包括:在通过所述发包处理组件进行数据发送时,发送所述本地发送缓存中的全部数据。11.根据权利要求9所述的方法,其特征在于,所述方法还包括:通过所述发包处理组件基于发送事件文件描述符对消息环进行唤醒通知,所述消息环用于管理传输任务;通过所述消息环唤醒所述发包处理组件以指示所述发包处理组件进行数据发送。12.根据权利要求1至8任一所述的方法,其特征在于,所述方法还包括:在接收到所述客户端发送的崩溃信号的情况下,通过云存储服务器获取崩溃文件;根据所述崩溃文件确定崩溃的原因和位置;其中,所述崩溃文件是所述客户端通过所述quic-sdk监测到运行崩溃的情况下生成并上传至所述云存储服务器的。13.一种数据传输装置,其特征在于,所述装置中运行的服务端与客户端建立有通信连接,所述服务端和所述客户端中集成有quic-sdk,所述quic-sdk用于实现基于quic协议的传输,所述装置包括:接收模块,用于接收所述客户端发送的udp数据包;确定模块,用于通过第一线程,在n个第二线程中确定目标第二线程,所述n个第二线程用于处理所述udp数据包,所述目标第二线程用于管理所述udp数据包对应的quic连接,所述第一线程和所述第二线程是由所述quic-sdk提供的,n为大于1的整数;传递模块,用于通过所述第一线程将所述udp数据包传递至所述目标第二线程。14.一种计算机设备,其特征在于,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或所述指令集由所述处理器加载并执行以实现如权利要求1至12任一所述的数据传输方法。
15.一种计算机可读存储介质,其特征在于,所述可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如权利要求1至12任一所述的数据传输方法。

技术总结
本申请公开了一种数据传输方法、装置、设备及存储介质,属于计算机技术领域。所述方法包括:接收客户端发送的UDP数据包;通过第一线程,在n个第二线程中确定目标第二线程,n个第二线程用于处理UDP数据包,目标第二线程用于管理UDP数据包对应的QUIC连接;通过第一线程将UDP数据包传递至目标第二线程。通过第一线程调度第二线程,不同第二线程可实现管理不同的QUIC连接,实现了通过不同线程来管理QUIC连接,使服务端能够充分利用多个核心的并发处理能力,避免了使用单一线程管理QUIC连接导致对并发量瓶颈限制较大的问题,提升了管理QUIC连接的效率,有助于提升数据传输的性能。有助于提升数据传输的性能。有助于提升数据传输的性能。


技术研发人员:包增辉 袁勇
受保护的技术使用者:腾讯科技(深圳)有限公司
技术研发日:2022.12.12
技术公布日:2023/1/6

最新回复(0)