一种基于QUIC协议的端口共用方法、系统及服务器与流程

    专利查询2024-07-10  34


    一种基于quic协议的端口共用方法、系统及服务器
    技术领域
    1.本发明涉及互联网技术领域,特别涉及一种基于quic协议的端口共用方法、系统及服务器。


    背景技术:

    2.当前的nginx架构主要可以提供http服务。另外,基于nginx的开源rtmp模块可以提供rtmp服务。在某些应用场景下,http和rtmp可能会共用同一个端口。例如,基于quic(quick udp internet connection,快速udp网络连接)协议的http和rtmp服务可以共用443端口,这样,nginx架构就需要同时提供http服务和rtmp服务。
    3.多个协议在共同监听同一个端口时,如果该端口接收到连接请求,该连接请求可能会被随机地交由http或者rtmp处理。然而,如果http服务的连接请求被rtmp处理,或者rtmp服务的连接请求被http处理,将会导致数据异常。因此,目前亟需一种多个协议共用同一个端口的有效解决方法,以避免数据异常的发生。


    技术实现要素:

    4.本技术的目的在于提供一种基于quic协议的端口共用方法、系统及服务器,能够避免数据异常的发生。
    5.为实现上述目的,本技术一方面提供一种基于quic协议的端口共用方法,所述方法包括:针对http与rtmp共用的目标端口,利用http对所述目标端口进行监听;在所述目标端口接收到连接请求时,按照预设方式检测所述连接请求对应的目标协议,并将所述连接请求发送至所述目标协议对应的目标模块;在所述目标模块中,按照与所述预设方式相匹配的数据读取方式,读取所述连接请求的数据,并基于所述目标协议的配置信息对读取的所述数据进行处理。
    6.为实现上述目的,本技术另一方面还提供一种基于quic协议的端口共用系统,所述系统包括:端口监听单元,用于针对http与rtmp共用的目标端口,利用http对所述目标端口进行监听;协议检测单元,用于在所述目标端口接收到连接请求时,按照预设方式检测所述连接请求对应的目标协议,并将所述连接请求发送至所述目标协议对应的目标模块;数据处理单元,用于在所述目标模块中,按照与所述预设方式相匹配的数据读取方式,读取所述连接请求的数据,并基于所述目标协议的配置信息对读取的所述数据进行处理。
    7.为实现上述目的,本技术另一方面还提供一种服务器,所述服务器中部署有nginx系统,所述服务器包括存储器和处理器,所述存储器用于存储计算机程序,所述计算机程序被所述处理器执行时,实现上述的基于quic协议的端口共用方法。
    8.由上可见,本技术一个或者多个实施方式提供的技术方案,针对http与rtmp共用的目标端口,可以统一由http对目标端口进行监听。在监听到目标端口处进入连接请求时,可以检测该连接请求对应的目标协议。其中,不同的协议可以由不同的模块进行处理。在目标协议处理连接请求时,可以根据检测协议时的预设方式,相匹配地进行数据读取,读取后
    的数据便可以经过目标协议的配置信息进行处理。可见,连接请求可以由http统一地进行监听,并且通过相匹配的预设方式和数据读取方式,可以完成对连接请求的协议检测和数据读取过程,使得目标协议的连接请求可以被对应的目标模块进行处理,避免了数据异常的情况。
    附图说明
    9.为了更清楚地说明本发明实施方式中的技术方案,下面将对实施方式描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
    10.图1是本发明实施方式中基于quic协议的端口共用方法步骤图;
    11.图2是本发明实施方式中rtmp模块执行协议检测函数的流程图;
    12.图3本发明实施方式中基于quic协议的端口共用系统的功能模块示意图;
    13.图4是本发明实施方式中服务器的结构示意图。
    具体实施方式
    14.为使本技术的目的、技术方案和优点更加清楚,下面将结合本技术具体实施方式及相应的附图对本技术技术方案进行清楚、完整地描述。显然,所描述的实施方式仅是本技术一部分实施方式,而不是全部的实施方式。基于本技术中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施方式,都属于本技术保护的范围。
    15.本技术提供一种基于quic协议的端口共用方法,请参阅图1,该方法可以包括以下多个步骤。
    16.s1:针对http与rtmp共用的目标端口,利用http对所述目标端口进行监听。
    17.在实际应用中,由于在共用同一个目标端口时,rtmp的证书等内容通常是在http中处理的,因此为了解决基于quic协议的http与rtmp共用同一443端口导致数据异常的情况,可以统一地由http对443端口进行监听,而rtmp则不对443端口进行监听。这样,443端口接收到的连接请求,最开始可以由http监听到,后续可以再对连接请求实际支持的协议进行识别,并交由对应的协议进行处理。
    18.s3:在所述目标端口接收到连接请求时,按照预设方式检测所述连接请求对应的目标协议,并将所述连接请求发送至所述目标协议对应的目标模块。
    19.在本实施方式中,连接请求可以从端口监听事件处理函数进入,由于是采用http对端口进行监听,因此连接请求是从ngx_http_init_connection函数进入的。在连接请求进入该函数后,可以先将上层的读事件句柄由原来的ngx_http_wait_request_handler设置为预先设置的协议检测函数,该协议检测函数可以用于检测连接请求对应的协议。在实际应用中,该协议检测函数例如可以是ngx_core_protocol_detect_handler。这样,当443端口接收到连接请求,并由http通过端口监听事件处理函数监听到后,便可以交由协议检测函数来检测该连接请求对应的目标协议。当然,由于quic协议是属于udp协议,因此通常需要在完成quic协议的握手过程之后,才会进行协议检测。
    20.在实际应用中,在nginx架构中可以新增协议检测模块,该协议检测模块可以采用
    nginx的core模块来实现,在该协议检测模块中,可以提供钩子注入接口和钩子链执行接口。其中,钩子注入接口可以由不同的协议调用,当该钩子注入接口被调用时,不同的协议可以将各自新增的协议检测函数通过该钩子注入接口挂入钩子(hook)。在实际应用中,对于除了http以外的其它协议,都可以新增各自的协议检测函数,然后通过调用钩子注入接口,可以将各自的协议检测函数挂入钩子。例如,rtmp模块可以通过ngx_array_push方式将对应的协议检测函数的句柄压入钩子链表里,从而完成协议检测函数的添加过程。
    21.在本实施方式中,在完成了协议检测函数的添加过程后,钩子链执行接口在被调用时,可以遍历挂入钩子的各个协议检测函数,并依次执行这些协议检测函数,从而对连接请求实际对应的目标协议进行检测。
    22.具体地,首先可以调用上述的钩子链执行接口,并通过该钩子链执行接口依次执行预先设置的协议检测函数。其中,若当前的协议检测函数检测到所述连接请求对应的目标协议,则可以返回检测完成的指示符ngx_done,表示已经识别出连接请求对应的目标协议。而如果当前的协议检测函数未检测到所述连接请求对应的目标协议,则可以返回检测待续的指示符ngx_declined,表示连接请求无法通过当前的协议检测函数识别出目标协议,此时可以通过下一个协议检测函数检测所述连接请求对应的目标协议。如果所述多个协议检测函数均执行完毕,并且依然未检测到所述连接请求对应的目标协议,此时可以返回检测结束的指示符ngx_ok,后续,可以由http来处理该连接请求。此外,在进行协议检测的过程中,如果出现异常,可以返回检测失败的指示符ngx_error,从而结束本次的协议检测过程。
    23.在实际应用中,协议检测的过程可以针对连接请求中的指定字节而言,而无需对整个连接请求的数据进行检测。具体地,对于http和rtmp的连接请求而言,如果连接请求的首字节为0x03,则表示该连接请求为rtmp协议,否则就是http协议。因此,只需要对连接请求的首字节进行分析即可。
    24.在本实施方式中,获取连接请求首字节数据的预设方式也可以不同。具体地,该预设方式可以是quic协议封装的msg_peek方式,该方式可以探测连接请求的指定字节的数据,但是并不进行实际的数据读取操作。也就是说,这种方式并不会将协议栈中的首字节的数据读取出来,而仅仅是探测首字节数据的内容。另一种预设方式便可以是利用quic协议提供的数据接收接口recv读取所述连接请求的指定字节的数据。这种方式是将协议栈中连接请求的首字节数据读取出来,从而会导致协议栈中连接请求的数据不完整。
    25.无论采用上述的何种预设方式,都可以获知连接请求中指定字节的数据内容,通过对该指定字节的数据内容进行判断,从而可以确定连接请求对应的目标协议。
    26.在本实施方式中,针对http和rtmp而言,都具备各自的数据处理模块。在判断出连接请求对应的目标协议之后,便可以将连接请求发送至目标协议对应的目标模块处进行处理。
    27.s5:在所述目标模块中,按照与所述预设方式相匹配的数据读取方式,读取所述连接请求的数据,并基于所述目标协议的配置信息对读取的所述数据进行处理。
    28.在本实施方式中,根据预设方式的不同,协议栈中留存的连接请求的数据也可能不同。具体地,如果是采用quic封装的msg_peek方式对首字节数据进行探测,那么协议栈中的连接请求的数据是完整的。此时,目标模块可以直接调用quic协议提供的数据接收接口
    recv,读取连接请求的数据。而如果采用的是通过数据接收接口recv读取首字节的数据,那么可以继续调用该数据接收接口recv读取所述连接请求的剩余数据。为了保证数据的完整性,可以将读取的指定字节的数据和剩余数据进行拼接,从而形成连接请求的完整数据。
    29.在一个实施方式中,在利用quic协议提供的数据接收接口读取连接请求的指定字节的数据之后,可以将所述指定字节的数据写入连接结构的缓冲区域buffer中。这样,不管是在http还是rtmp的目标模块中处理所述连接请求时,都需要检测所述缓冲区域中是否存在数据,若存在,则将所述缓冲区域中的数据与所述连接请求的剩余数据进行拼接,从而得到完整的数据。
    30.在本实施方式中,如果连接请求的首字节是0x03,则表示是rtmp协议,此时可以进入rtmp模块进行初始化等操作。如果不是,则表示是http协议,此时可以将读事件句柄重置,并通过重置后的读事件句柄读取所述连接请求的数据。具体地,可以将读事件句柄重新设置为ngx_http_wait_request_handler,然后调用ngx_http_wait_request_handler读取连接请求的数据。
    31.在本实施方式中,针对rtmp模块,需要保存rtmp模块的配置信息。具体地,在模块初始化的时候可以将rtmp的配置信息保存在监听结构里,当探测到连接请求是rtmp协议时,再从监听结构里取出rtmp模块的配置信息,从而根据配置信息对连接请求进行处理。
    32.在一个具体应用场景中,可以在nginx的ngx_listening_t结构体中新增一个指定字段opaque,该指定字段可以用于保存协议的监听结构。在实际应用中,目标端口接收到的连接请求,最开始可以由http监听到,后续可以再对连接请求实际支持的协议进行识别,并交由对应的协议进行处理。
    33.针对http和rtmp共用的目标端口,可以将rtmp的监听结构写入http的指定字段opaque中,并且可以将监听该目标端口的rtmp的监听结构设置为忽略状态(请注意,这里是将原始的rtmp的监听结构设置为忽略状态,并非是将写入opaque字段的监听结构设置为忽略状态)。具体地,可以将rtmp监听结构中ignore参数的参数值设置为1,表征该rtmp监听结构不对目标端口进行监听。
    34.在本实施方式中,将rtmp的监听结构写入http的opaque字段,并将rtmp的监听结构设置为忽略状态后,为了避免在遍历监听链表时依然统计rtmp的监听结构,可以对cycle

    listening

    elts的过程进行修改。具体地,在一个实施方式中,可以添加规则,规定不统计ignore的值为1的监听结构。这样,在遍历监听链表时,针对目标端口而言,由于rtmp的监听结构中ignore的值为1,因此仅统计http的监听结构,而不统计rtmp的监听结构,从而避免在统计结果中目标端口同时有两个或者两个以上的协议进行监听。此外,在另一个实施方式中,还可以对事件(event)模块中的初始化函数进行修改。具体地,对于event模块中的初始化函数ngx_event_process_init在遍历监听链表时,可以加入判定条件,该判定条件可以是:如果当前的监听结构中ignore的参数值为1,那么就不统计该监听结构。这样,通过上述的方式,在遍历监听链表时,可以不统计处于忽略状态的监听结构,以使得后续的event模块不对处于忽略状态的监听结构进行轮询(epoll)操作。
    35.请参阅图2,在本实施方式中,在利用rtmp协议检测函数检测所述连接请求对应的目标协议时,首先可以判断http的指定字段是否为空,如果该指定字段为空,则表示rtmp的监听结构并没有写入该指定字段中,进而表明当前的端口不存在rtmp和http共用的情况,
    此时,可以直接判定所述连接请求对应的目标协议不是rtmp,返回检测待续的指示符ngx_declined,从而可以继续利用下一个协议检测函数检测所述连接请求对应的目标协议。如果该指定字段非空,则表示当前的端口存在多协议共用的情况,此时可以进一步判断该连接请求实际对应的是哪一个协议。
    36.请参阅图3,本技术还提供一种基于quic协议的端口共用系统,所述系统包括:
    37.端口监听单元,用于针对http与rtmp共用的目标端口,利用http对所述目标端口进行监听;
    38.协议检测单元,用于在所述目标端口接收到连接请求时,按照预设方式检测所述连接请求对应的目标协议,并将所述连接请求发送至所述目标协议对应的目标模块;
    39.数据处理单元,用于在所述目标模块中,按照与所述预设方式相匹配的数据读取方式,读取所述连接请求的数据,并基于所述目标协议的配置信息对读取的所述数据进行处理。
    40.请参阅图4,本技术还提供一种服务器,所述服务器中部署有nginx系统,所述服务器包括存储器和处理器,所述存储器用于存储计算机程序,所述计算机程序被所述处理器执行时,实现上述的基于quic协议的端口共用方法。
    41.在本技术中,所述存储器可以包括用于存储信息的物理装置,通常是将信息数字化后再以利用电、磁或者光学等方法的媒体加以存储。所述存储器又可以包括:利用电能方式存储信息的装置,如ram或rom等;利用磁能方式存储信息的装置,如硬盘、软盘、磁带、磁芯存储器、磁泡存储器或u盘;利用光学方式存储信息的装置,如cd或dvd。当然,还有其他方式的存储器,例如量子存储器或石墨烯存储器等等。
    42.在本技术中,所述处理器可以按任何适当的方式实现。例如,所述处理器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式等等。
    43.由上可见,本技术一个或者多个实施方式提供的技术方案,针对http与rtmp共用的目标端口,可以统一由http对目标端口进行监听。在监听到目标端口处进入连接请求时,可以检测该连接请求对应的目标协议。其中,不同的协议可以由不同的模块进行处理。在目标协议处理连接请求时,可以根据检测协议时的预设方式,相匹配地进行数据读取,读取后的数据便可以经过目标协议的配置信息进行处理。可见,连接请求可以由http统一地进行监听,并且通过相匹配的预设方式和数据读取方式,可以完成对连接请求的协议检测和数据读取过程,使得目标协议的连接请求可以被对应的目标模块进行处理,避免了数据异常的情况。
    44.本说明书中的各个实施方式均采用递进的方式描述,各个实施方式之间相同相似的部分互相参见即可,每个实施方式重点说明的都是与其他实施方式的不同之处。尤其,针对系统和服务器的实施方式来说,均可以参照前述方法的实施方式的介绍对照解释。
    45.本领域内的技术人员应明白,本发明的实施方式可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施方式、完全软件实施方式、或结合软件和硬件方面的实施方式的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算
    机程序产品的形式。
    46.本发明是参照根据本发明实施方式的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
    47.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
    48.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
    49.在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
    50.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
    51.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
    52.还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
    ……”
    限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
    53.以上所述仅为本技术的实施方式而已,并不用于限制本技术。对于本领域技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本技术的权利要求范围之内。

    技术特征:
    1.一种基于quic协议的端口共用方法,其特征在于,所述方法包括:针对http与rtmp共用的目标端口,利用http对所述目标端口进行监听;在所述目标端口接收到连接请求时,按照预设方式检测所述连接请求对应的目标协议,并将所述连接请求发送至所述目标协议对应的目标模块;在所述目标模块中,按照与所述预设方式相匹配的数据读取方式,读取所述连接请求的数据,并基于所述目标协议的配置信息对读取的所述数据进行处理。2.根据权利要求1所述的方法,其特征在于,在所述目标端口接收到连接请求之后,所述方法还包括:将读事件句柄设置为协议检测函数,以通过所述协议检测函数检测所述连接请求对应的目标协议。3.根据权利要求2所述的方法,其特征在于,所述方法还包括:当所述目标协议为http时,将所述读事件句柄重置,并通过重置后的读事件句柄读取所述连接请求的数据。4.根据权利要求1所述的方法,其特征在于,读取所述连接请求的数据包括:若所述预设方式为探测所述连接请求的指定字节的数据,则调用quic协议提供的数据接收接口,读取所述连接请求的数据;若所述预设方式为利用quic协议提供的数据接收接口读取所述连接请求的指定字节的数据,则继续调用所述数据接收接口读取所述连接请求的剩余数据,并将读取的所述指定字节的数据和所述剩余数据进行拼接,以形成所述连接请求的完整数据。5.根据权利要求4所述的方法,其特征在于,在利用quic协议提供的数据接收接口读取所述连接请求的指定字节的数据之后,所述方法还包括:将所述指定字节的数据写入连接结构的缓冲区域中,以使得在所述目标模块中处理所述连接请求时,检测所述缓冲区域中是否存在数据,若存在,将所述缓冲区域中的数据与所述连接请求的剩余数据进行拼接。6.根据权利要求1所述的方法,其特征在于,所述方法还包括:在http的监听结构中新增用于保存监听结构的指定字段;若所述目标协议为rtmp,从所述指定字段中读取所述rtmp的监听结构,以获取rtmp的配置信息,并通过所述rtmp的配置信息处理所述连接请求。7.根据权利要求6所述的方法,其特征在于,在将rtmp的监听结构写入http的所述指定字段中之后,所述方法还包括:将所述rtmp的监听结构设置为忽略状态,以使得rtmp不监听所述目标端口。8.根据权利要求6所述的方法,其特征在于,检测所述连接请求对应的目标协议包括:在利用rtmp协议检测函数检测所述连接请求对应的目标协议时,判断所述指定字段是否为空,若所述指定字段为空,判定所述连接请求对应的目标协议不是rtmp,并继续利用下一个协议检测函数检测所述连接请求对应的目标协议。9.根据权利要求1所述的方法,其特征在于,检测所述连接请求对应的目标协议包括:依次执行预先设置的多个协议检测函数,以对所述连接请求的部分数据进行检测;若当前的协议检测函数检测到所述连接请求对应的目标协议,返回检测完成的指示符;
    若当前的协议检测函数未检测到所述连接请求对应的目标协议,返回检测待续的指示符,以通过下一个协议检测函数检测所述连接请求对应的目标协议;若所述多个协议检测函数均执行完毕,并且未检测到所述连接请求对应的目标协议,返回检测结束的指示符。10.一种基于quic协议的端口共用系统,其特征在于,所述系统包括:端口监听单元,用于针对http与rtmp共用的目标端口,利用http对所述目标端口进行监听;协议检测单元,用于在所述目标端口接收到连接请求时,按照预设方式检测所述连接请求对应的目标协议,并将所述连接请求发送至所述目标协议对应的目标模块;数据处理单元,用于在所述目标模块中,按照与所述预设方式相匹配的数据读取方式,读取所述连接请求的数据,并基于所述目标协议的配置信息对读取的所述数据进行处理。11.一种服务器,其特征在于,所述服务器中部署有nginx系统,所述服务器包括存储器和处理器,所述存储器用于存储计算机程序,所述计算机程序被所述处理器执行时,实现如权利要求1至9中任一所述的方法。

    技术总结
    本发明公开了一种基于QUIC协议的端口共用方法、系统及服务器,其中,所述方法包括:针对HTTP与RTMP共用的目标端口,利用HTTP对所述目标端口进行监听;在所述目标端口接收到连接请求时,按照预设方式检测所述连接请求对应的目标协议,并将所述连接请求发送至所述目标协议对应的目标模块;在所述目标模块中,按照与所述预设方式相匹配的数据读取方式,读取所述连接请求的数据,并基于所述目标协议的配置信息对读取的所述数据进行处理。本申请提供的技术方案,能够避免数据异常的发生。能够避免数据异常的发生。能够避免数据异常的发生。


    技术研发人员:陈祥祥 庄晓川
    受保护的技术使用者:网宿科技股份有限公司
    技术研发日:2020.11.06
    技术公布日:2022/5/25
    转载请注明原文地址:https://tc.8miu.com/read-23368.html

    最新回复(0)