基于F-Stack和Nginx实现动态代理的方法和系统与流程
发布时间: 2022-04-30 10:39:14
阅读量: 2005 人次
涉及互联网通信技术领域,尤其涉及一种基于f‑stack和nginx实现动态代理的方法和系统。传统linux 内核alg方式支持sip、ftp、rtsp协议代理,但由于kernel本身实现机制的锁\中断\上下文切换等导致性能低下,不适合大并发、高吞吐应用场景。dpdk采用大页、ring无锁队列、轮询方式数据包处理,以及网卡多队列结合多核等提升数据包转发性能,但其没有对tcp/ip协议栈提供支持。而开源的f‑stack集成了dpdk和用户态协议栈freebsd以及nginx等,方便用户实现自身业务逻辑。另外sip、ftp、rtsp协议的共同点是由信令协议和数据协议组成,信令中协商数据传输使用ip+port,数据传输时使用信令中协商的ip+port通信。基于上述,亟需一种新的代理方案,以实现sip、ftp、rtsp等协议的代理功能,且能满足大并发、高吞吐应用场景。针对传统linux内核alg方式不适合大并发、高吞吐应用场景的问题,本发明提供一种基于f‑stack和nginx实现动态代理的方法和系统。一方面,本发明提供一种基于f‑stack和nginx实现动态代理的方法,包括:步骤1:接收数据包,将所述数据包放到网卡的对应队列上;所述数据包包括来自客户端的请求数据包和来自服务端的响应数据包;步骤2:针对队列上的每个数据包,使所述数据包先经过ipfw机制的hook函数处理,根据所述数据包中五元组信息查找是否存在连接跟踪表:如果存在所述连接跟踪表,则按照代理规则改写所述数据包中的源地址和目的地址;如果不存在所述连接跟踪表,则按照代理规则新建连接跟踪表,以使处理后续数据包查找连接跟踪表时所用;步骤3:将改写源地址和目的地址成功的数据包交由freebsd协议栈处理;并进一步判断数据包是否交由nginx处理,具体为:将匹配到nginx侦听地址vip+vport的数据包交由nginx处理,nginx处理完毕后的数据包再次交由freebsd协议栈转发;对于数据协议的数据包,无需交由nginx处理,直接由freebsd协议栈做路由查找转发处理。进一步地,在步骤2之前还包括:采用共享内存方式将所述代理规则下发给所有worker进程;对应的worker进程收到客户端或服务端的数据协议的数据包时,按照所述代理规则改写所述数据包中源地址和目的地址后再交由freebsd协议栈做转发处理。进一步地,还包括:步骤a1:预设服务端查看视频时的视频查看信令数据包携带的媒体接收地址为serip+recv_media_port;步骤a2:nginx改写服务端发送的视频查看信令数据包中媒体接收地址为vip+recv_media_vport,并将其转发给客户端;步骤a3:客户端响应200‑ok信令中携带客户端的推流地址cip+push_media_port;步骤a4:nginx改写客户端响应200‑ok信令中媒体推流地址为lip+push_media_lport,同时采用共享内存方式下发代理规则给所有worker进程。