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

文档序号:29035161发布日期:2022-02-25 18:08阅读:401来源:国知局
一种多协议端口的共用方法、系统及服务器与流程

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


背景技术:

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


技术实现要素:

4.本技术的目的在于提供一种多协议端口的共用方法、系统及服务器,能够避免数据异常的发生。
5.为实现上述目的,本技术一方面提供一种多协议端口的共用方法,在http的监听结构中新增用于保存监听结构的指定字段;所述方法包括:若http与rtmp存在共用的目标端口,针对所述目标端口,将rtmp的监听结构写入http的所述指定字段中;当所述目标端口接收到连接请求时,检测所述连接请求对应的目标协议;若所述目标协议为rtmp,从所述指定字段中读取所述rtmp的监听结构,以获取rtmp的配置信息,并通过所述rtmp的配置信息处理所述连接请求。
6.为实现上述目的,本技术另一方面还提供一种多协议端口的共用系统,在http的监听结构中新增用于保存监听结构的指定字段;所述系统包括:监听结构填写单元,用于若http与rtmp存在共用的目标端口,针对所述目标端口,将rtmp的监听结构写入http的所述指定字段中;协议检测单元,用于当所述目标端口接收到连接请求时,检测所述连接请求对应的目标协议;配置信息读取单元,用于若所述目标协议为rtmp,从所述指定字段中读取所述rtmp的监听结构,以获取rtmp的配置信息,并通过所述rtmp的配置信息处理所述连接请求。
7.为实现上述目的,本技术另一方面还提供一种服务器,所述服务器中部署有nginx系统,所述服务器包括存储器和处理器,所述存储器用于存储计算机程序,所述计算机程序被所述处理器执行时,实现上述的多协议端口的共用方法。
8.由上可见,本技术一个或者多个实施方式提供的技术方案,可以在http的监听结构中新增用于保存监听结构的指定字段。当http与rtmp共用同一目标端口时,可以将rtmp的监听结构写入该指定字段中,这样,目标端口接收到的连接请求可以统一先由http监听。
后续,针对http监听到的连接请求,可以检测该连接请求对应的目标协议。如果该目标协议为http,那么就可以通过http正常处理。如果该目标协议为rtmp,那么应当交由rtmp处理该连接请求。具体地,由于rtmp的监听结构写入了指定字段中,因此可以从指定字段中读取rtmp的监听结构,从而可以获取到rtmp的配置信息,通过该配置信息,rtmp便可以处理该连接请求。通过以上的方案,可以利用http统一监听共用的目标端口,然后加入协议检测的步骤,可以将连接请求交由对应的协议进行处理,避免了数据异常的发生。
附图说明
9.为了更清楚地说明本发明实施方式中的技术方案,下面将对实施方式描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
10.图1是本发明实施方式中多协议端口的共用方法步骤图;
11.图2是本发明实施方式中连接请求的处理示意图;
12.图3是本发明实施方式中rtmp模块执行协议检测函数的流程图;
13.图4是本发明实施方式中多协议端口的共用系统的功能模块示意图;
14.图5是本发明实施方式中服务器的结构示意图。
具体实施方式
15.为使本技术的目的、技术方案和优点更加清楚,下面将结合本技术具体实施方式及相应的附图对本技术技术方案进行清楚、完整地描述。显然,所描述的实施方式仅是本技术一部分实施方式,而不是全部的实施方式。基于本技术中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施方式,都属于本技术保护的范围。
16.本技术提供一种多协议端口的共用方法,可以对现有的nginx架构进行改进,以使得多个协议在共用同一个端口时,不会发生数据异常的情况。
17.具体地,可以在nginx的ngx_listening_t结构体中新增一个指定字段opaque,该指定字段可以用于保存协议的监听结构。在实际应用中,由于在共用同一个端口时,rtmp的证书等内容通常是在http中处理的,因此为了解决http与rtmp共用同一端口导致数据异常的情况,可以统一地由http对共用的端口进行监听,而rtmp则不对端口进行监听。这样,端口接收到的连接请求,最开始可以由http监听到,后续可以再对连接请求实际支持的协议进行识别,并交由对应的协议进行处理。
18.请参阅图1,本技术一个实施方式提供的多协议端口的共用方法,可以包括以下多个步骤。
19.s1:若http与rtmp存在共用的目标端口,针对所述目标端口,将rtmp的监听结构写入http的所述指定字段中。
20.在本实施方式中,由于连接请求统一由http进行监听,因此可以在http的监听结构中新增上述的指定字段opaque。然后,可以通过遍历监听链表,判断当前是否存在http与rtmp共用的目标端口。
21.在实际应用中,可以通过nginx中的cycle

listening

elts来遍历监听链表,通
过遍历监听链表,可以罗列出当前正在监听端口的各个监听结构。通过罗列结果,可以识别出对于同一个端口而言,是否同时存在多个协议进行监听。如果存在http和rtmp同时监听的目标端口,则表示该目标端口被http和rtmp共用。此时,可以将rtmp的监听结构写入http的指定字段opaque中,并且可以将监听该目标端口的rtmp的监听结构设置为忽略状态(请注意,这里是将原始的rtmp的监听结构设置为忽略状态,并非是将写入opaque字段的监听结构设置为忽略状态)。具体地,可以将rtmp监听结构中ignore参数的参数值设置为1,表征该rtmp监听结构不对目标端口进行监听。
22.在本实施方式中,将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)操作。
23.在实际应用中,除了http和rtmp,可能还存在http/2在对端口进行监听,但由于http/2的配置结构与http相同,因此不需要对http/2进行额外的处理。
24.在本实施方式中,在监听链表中,http和rtmp的监听结构可能处于不同的位置,因此通常需要在将监听链表中的内容全部解析完成后,再针对共用的端口进行上述的设置。鉴于此,上述针对共用的端口进行设置的过程,可以在rtmp的core模块中执行。原因在于,rtmp的core模块可以提供初始化函数(init_conf),该初始化函数刚好可以在监听链表被解析完毕之后,以及调用后续的套接字函数(ngx_open_listening_sockets)之前执行。这样,通过执行rtmp的core模块提供的初始化函数,便可以准确地检测http与rtmp共用的目标端口。
25.s3:当所述目标端口接收到连接请求时,检测所述连接请求对应的目标协议。
26.在本实施方式中,经过步骤s1的处理,被http和rtmp共用的目标端口可以统一地由http进行监听,这样,进入该目标端口的连接请求,通常是由http的监听处理函数(ngx_http_init_connection)接收到的。
27.请参阅图2,在一个实施方式中,http的监听处理函数接收到连接请求后,首先可以判断该连接请求是否为ssl(secure sockets layer,安全套接字协议)请求,如果是ssl请求,那么会先执行ssl的握手阶段。在完成ssl的握手之后,为了利用正确的协议对该连接请求进行处理,需要对连接请求实际对应的目标协议进行检测。具体地,在nginx架构中可以新增协议检测模块,该协议检测模块可以采用nginx的core模块来实现,在该协议检测模块中,可以提供钩子注入接口和钩子链执行接口。其中,钩子注入接口可以由不同的协议调用,当该钩子注入接口被调用时,不同的协议可以将各自新增的协议检测函数通过该钩子注入接口挂入钩子(hook)。在实际应用中,对于除了http以外的其它协议,都可以新增各自
的协议检测函数,然后通过调用钩子注入接口,可以将各自的协议检测函数挂入钩子。例如,http/2和rtmp模块可以通过ngx_array_push方式将对应的协议检测函数的句柄压入钩子链表里,从而完成协议检测函数的添加过程。
28.在本实施方式中,在完成了协议检测函数的添加过程后,钩子链执行接口在被调用时,可以遍历挂入钩子的各个协议检测函数,并依次执行这些协议检测函数,从而对连接请求实际对应的目标协议进行检测。
29.在实际应用中,为了应对上述的协议检测过程,在完成ssl握手之后,需要对原始的轮询读写处理函数进行改写。具体地,可以将epoll的读写处理函数recv/send分别改写为ssl的读写处理函数ngx_ssl_recv/ngx_ssl_write,这样,底层的数据读写便可以通过改写后的函数来执行,通过改写后的函数,可以对数据完成接收、解密、加密、发送等一系列操作,这些操作对于上层而言都是透明的。
30.在本实施方式中,在完成了底层读写处理函数的改写后,为了执行协议检测过程,还可以设置协议检测处理函数ngx_http_protocol_detect,通过该协议检测处理函数,便可以检测连接请求对应的目标协议。
31.具体地,ngx_http_protocol_detect在执行时,首先可以调用上述的钩子链执行接口,并通过该钩子链执行接口依次执行预先设置的多个协议检测函数。其中,若当前的协议检测函数检测到所述连接请求对应的目标协议,则可以返回检测完成的指示符ngx_done,表示已经识别出连接请求对应的目标协议。而如果当前的协议检测函数未检测到所述连接请求对应的目标协议,则可以返回检测待续的指示符ngx_declined,表示连接请求无法通过当前的协议检测函数识别出目标协议,此时可以通过下一个协议检测函数检测所述连接请求对应的目标协议。如果所述多个协议检测函数均执行完毕,并且依然未检测到所述连接请求对应的目标协议,此时可以返回检测结束的指示符ngx_ok,后续,可以由http来处理该连接请求。此外,在进行协议检测的过程中,如果出现异常,可以返回检测失败的指示符ngx_error,从而结束本次的协议检测过程。
32.在本实施方式中,在进行协议检测时,通常只需要获取连接请求的部分数据即可。例如,对于rtmp的协议检测函数,只需要检测连接请求的第一个字节的数据即可,而对于http/2的协议检测函数,需要检测连接请求的前四个字节的数据。鉴于此,在判断出连接请求是否为ssl请求后,可以采用与判断结果相匹配的数据读取方式,读取连接请求的部分数据。其中,对于ssl请求而言,可以采用ssl_peek方式来进行数据读取;而对于非ssl请求而言,可以采用msg_peek方式来进行数据读取。其中,对于ssl请求而言,可以采用改写后的ssl的读写处理函数来获取连接请求的部分数据。这样,通过读取的部分数据,便可以检测连接请求对应的目标协议。
33.在本实施方式中,在对部分数据进行协议检测时,可以根据当前的协议检测函数的类型,确定所需读取的所述部分数据的目标长度。例如,rtmp只需读取第一个字节的数据,而http/2需要读取前四个字节的数据。这样,若当前读取的数据长度未达到所述目标长度,可以返回继续探测的指示符ngx_again,以等待读取更多的数据,直至读取的数据长度达到所述目标长度为止。
34.在一个实施方式中,若连接请求不是ssl请求,则可以不用执行ssl握手过程,可以直接进行协议检测过程。
35.s5:若所述目标协议为rtmp,从所述指定字段中读取所述rtmp的监听结构,以获取rtmp的配置信息,并通过所述rtmp的配置信息处理所述连接请求。
36.请参阅图3,在本实施方式中,rtmp模块在利用rtmp协议检测函数检测所述连接请求对应的目标协议时,首先可以判断http的指定字段是否为空,如果该指定字段为空,则表示rtmp的监听结构并没有写入该指定字段中,进而表明当前的端口不存在rtmp和http共用的情况,此时,可以直接判定所述连接请求对应的目标协议不是rtmp,返回检测待续的指示符ngx_declined,从而可以继续利用下一个协议检测函数检测所述连接请求对应的目标协议。如果该指定字段非空,则表示当前的端口存在多协议共用的情况,此时可以进一步判断该连接请求实际对应的是哪一个协议。
37.在本实施方式中,在确定该指定字段为非空时,依然可以先判断该连接请求是否为ssl请求,并采用与判断结果相匹配的数据读取方式读取所述连接请求的部分数据,以通过读取的所述部分数据检测所述连接请求对应的目标协议。具体地,如果是ssl请求,那么可以通过ssl_peek的方式获取一个字节的数据,而如果是非ssl请求,那么可以通过msg_peek的方式获取一个字节的数据。然后可以判断该字节的数据是否为0x03,如果是,则表明该连接请求对应的目标协议为rtmp,此时可以返回ngx_done的指示符,表示已经识别出连接请求对应的目标协议。后续,则可以调用rtmp的初始化函数对该连接请求进行处理。在该rtmp的初始化函数中,为了获取rtmp的配置信息,可以从指定字段中读取rtmp的监听结构,从而获取到rtmp的配置信息,后续便可以通过该配置信息对连接请求进行处理。
38.在本实施方式中,如果一个字节的数据没有获取完,那么可以返回ngx_again的指示符,以继续获取数据。如果获取的该字节的数据不是0x03,那么可以返回ngx_declined的指示符,以通过下一个协议检测函数进行检测。
39.在一个实施方式中,http/2模块在进行协议检测时,首先可以判断当前的监听结构中是否具备http/2的配置信息,若不具备http/2的配置信息,则可以直接返回ngx_declined的指示符,表示所述连接请求对应的目标协议不是http/2,并继续利用下一个协议检测函数检测所述连接请求对应的目标协议。而如果当前的监听结构中具备http/2的配置信息,则可以按照类似的协议检测过程,读取连接请求的部分数据,以通过读取的所述部分数据检测所述连接请求对应的目标协议。需要说明的是,对于ssl请求而言,由于在ssl握手阶段已经将http/2设置为ssl请求所支持的协议,因此可以省略检测所述连接请求对应的目标协议的步骤,直接利用http/2的初始化函数对所述ssl请求进行处理。例如,http/2over ssl的方式是直接在ssl握手阶段通过alpn/npn的方式将协议设置为http/2,此时在ssl握手完成时就已经将控制权交给http/2,那么可以直接调用http/2的初始化函数ngx_http_v2_init对该连接请求进行处理,无需进行协议检测过程。
40.在本实施方式中,当新增的协议检测函数都无法检测到连接请求对应的目标协议时,最终可以交由http对连接请求进行处理。
41.请参阅图4,本技术还提供一种多协议端口的共用系统,在http的监听结构中新增用于保存监听结构的指定字段;所述系统包括:
42.监听结构填写单元,用于若http与rtmp存在共用的目标端口,针对所述目标端口,将rtmp的监听结构写入http的所述指定字段中;
43.协议检测单元,用于当所述目标端口接收到连接请求时,检测所述连接请求对应
的目标协议;
44.配置信息读取单元,用于若所述目标协议为rtmp,从所述指定字段中读取所述rtmp的监听结构,以获取rtmp的配置信息,并通过所述rtmp的配置信息处理所述连接请求。
45.请参阅图5,本技术还提供一种服务器,所述服务器中部署有nginx系统,所述服务器包括存储器和处理器,所述存储器用于存储计算机程序,所述计算机程序被所述处理器执行时,可以实现上述的多协议端口的共用方法。
46.在本技术中,所述存储器可以包括用于存储信息的物理装置,通常是将信息数字化后再以利用电、磁或者光学等方法的媒体加以存储。所述存储器又可以包括:利用电能方式存储信息的装置,如ram或rom等;利用磁能方式存储信息的装置,如硬盘、软盘、磁带、磁芯存储器、磁泡存储器或u盘;利用光学方式存储信息的装置,如cd或dvd。当然,还有其他方式的存储器,例如量子存储器或石墨烯存储器等等。
47.在本技术中,所述处理器可以按任何适当的方式实现。例如,所述处理器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式等等。
48.由上可见,本技术一个或者多个实施方式提供的技术方案,可以在http的监听结构中新增用于保存监听结构的指定字段。当http与rtmp共用同一目标端口时,可以将rtmp的监听结构写入该指定字段中,这样,目标端口接收到的连接请求可以统一先由http监听。后续,针对http监听到的连接请求,可以检测该连接请求对应的目标协议。如果该目标协议为http,那么就可以通过http正常处理。如果该目标协议为rtmp,那么应当交由rtmp处理该连接请求。具体地,由于rtmp的监听结构写入了指定字段中,因此可以从指定字段中读取rtmp的监听结构,从而可以获取到rtmp的配置信息,通过该配置信息,rtmp便可以处理该连接请求。通过以上的方案,可以利用http统一监听共用的目标端口,然后加入协议检测的步骤,可以将连接请求交由对应的协议进行处理,避免了数据异常的发生。
49.本说明书中的各个实施方式均采用递进的方式描述,各个实施方式之间相同相似的部分互相参见即可,每个实施方式重点说明的都是与其他实施方式的不同之处。尤其,针对系统和服务器的实施方式来说,均可以参照前述方法的实施方式的介绍对照解释。
50.本领域内的技术人员应明白,本发明的实施方式可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施方式、完全软件实施方式、或结合软件和硬件方面的实施方式的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
51.本发明是参照根据本发明实施方式的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
52.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
53.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
54.在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
55.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
56.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
57.还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
58.以上所述仅为本技术的实施方式而已,并不用于限制本技术。对于本领域技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本技术的权利要求范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1