一种报文处理方法、装置、设备及介质与流程

未命名 09-01 阅读:98 评论:0


1.本发明涉及报文处理领域,特别涉及一种报文处理方法、装置、设备及介质。


背景技术:

2.当前,接收tcp(即transmission control protocol,传输控制协议)报文的过程是,网络协议栈收到报文后,将报文中的载荷放在tcp socket(即套接字)的接收缓冲区中,等待app(即application program,应用程序)从接收缓冲区中取出载荷。因为存放载荷和取出载荷两个过程中使用的数据字段较多、逻辑复杂,为了保证数据一致性,通常会把接收缓冲区作为临界区来处理,访问时对它加锁,保证一个时刻只有一个线程能够操作接收缓冲区。当tcp吞吐量很大时,网络协议栈线程和app线程对临界区竞争得非常激烈,锁碰撞会导致严重的性能损耗。


技术实现要素:

3.有鉴于此,本发明的目的在于提供一种报文处理方法、装置、设备及介质,能够避免在tcp吞吐量很大时,网络协议栈以及应用程序对锁竞争激烈而产生的性能损耗,从而提升网络性能。其具体方案如下:第一方面,本发明公开了一种报文处理方法,包括:通过网络协议栈,接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据;所述过渡队列为无锁队列。
4.可选的,所述通过网络协议栈,接收传输控制协议报文,包括:与对端设备建立传输控制协议连接;基于所述传输控制协议连接,并通过网络协议栈,接收传输控制协议报文。
5.可选的,所述将传输控制协议报文挂接到报文分段链表中,包括:如果传输控制协议报文的报文序列号落在所述传输控制协议连接的接收窗口之中,则将传输控制协议报文挂接到报文分段链表中。
6.可选的,所述将传输控制协议报文挂接到报文分段链表中,包括:将所述传输控制协议报文的元数据放置到该传输控制协议报文对应的分段描述符;所述元数据包括所述传输控制协议报文中载荷数据的载荷指针;将所述分段描述符挂接至报文分段链表中。
7.可选的,所述元数据还包括报文序列号和长度。
8.可选的,在所述将所述报文分段链表分裂为第一子链表和第二子链表之前,还包括:比较所述报文分段链表中目标描述符中的报文序列号与接收缓冲区的接收期待序列号;所述目标描述符为所述报文分段链表中首个分段描述符;当目标描述符中的报文序列号与接收缓冲区的接收期待序列号相等,则触发所述将所述报文分段链表分裂为第一子链表和第二子链表的步骤。
9.可选的,比较所述报文分段链表中目标描述符中的报文序列号与接收缓冲区的接收期待序列号,包括:从第一预设辅助字段中读取接收缓冲区的接收期待序列号;比较所述报文分段链表中目标描述符中的报文序列号与接收期待序列号。
10.可选的,所述将所述第一子链表的头结点指针推送到过渡队列之后,还包括:将传输控制协议套接字设置为可读状态。
11.可选的,所述通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据,包括:通过应用程序监听传输控制协议套接字的状态,当传输控制协议套接字为可读状态,则基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
12.可选的,所述将所述第一子链表的头结点指针推送到过渡队列,包括:基于内存屏障技术将所述第一子链表的头结点指针推送到过渡队列。
13.可选的,基于所述过渡队列从所述接收缓冲区读取报文载荷数据,包括:调用读接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
14.可选的,基于所述过渡队列读取报文数据,包括:调用消息接收接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
15.可选的,基于所述过渡队列从所述接收缓冲区读取报文载荷数据,包括:从过渡队列中读取头结点指针;将所述头结点指针追加至已合并分段链表的尾部,并增加已合并长度;基于所述已合并长度从所述接收缓冲区读取报文载荷数据并拷贝至应用程序的内存中。
16.可选的,基于所述已合并长度从所述接收缓冲区读取报文载荷数据,包括:基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。
17.可选的,基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据,包括:基于所述已合并长度与预设限制内存长度二者之中的较小值,在已合并分段链表中根据分段描述符读取报文荷载数据,直到读取到的报文荷载数据达到所述较小值。
18.可选的,所述基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据,包括:从第二预设辅助字段中读取已合并长度;基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。
19.可选的,还包括:在读取过程中,修改已合并分段链表中分段描述符中的载荷指针和长度。
20.可选的,还包括:当分段描述符中的长度减为0,则释放该分段描述符和报文载荷数据对应的内存。
21.可选的,所述从过渡队列中读取头结点指针,包括:基于内存屏障技术从过渡队列中读取头结点指针。
22.可选的,还包括:当接收到新的传输控制协议报文,则将所述第二子链表作为新的报文分段链表,并将该传输控制协议报文挂接至该报文分段链表中。
23.第二方面,本发明公开了一种报文处理装置,包括:协议报文接收模块,用于通过网络协议栈,接收传输控制协议报文;协议报文挂接模块,用于将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;分段链表分裂模块,用于将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;结点指针推送模块,用于将所述第一子链表的头结点指针推送到过渡队列;所述过渡队列为无锁队列载荷数据读取模块,用于通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
24.第三方面,本发明公开了一种电子设备,包括存储器和处理器,其中:所述存储器,用于保存计算机程序;所述处理器,用于执行所述计算机程序,以实现前述的报文处理方法。
25.第四方面,本发明公开了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时前述的报文处理方法。
26.可见,本发明先通过网络协议栈,接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据;所述过渡队列为无锁队列。也即,本发明中,网络协议栈先接收报文,将报文数据存储至接收缓冲区,数据结构采用链表的形式,并进行链表拆分,将承载连续字节流的子链表的头结点指针推送到无锁的过渡队列,应用程序基于无锁的过渡队列中的指针从接收缓冲区读取报文载荷数据。
27.本发明的有益效果在于:引入无锁的过渡队列,实现了无锁的接收缓冲区,能够避免在tcp吞吐量很大时,网络协议栈以及应用程序对锁竞争激烈而产生的性能损耗,从而提升网络性能。
附图说明
28.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
29.图1为本发明实施例公开的一种报文处理方法示意图;图2为本发明实施例公开的一种传输控制协议报文处理示意图;图3为本发明实施例公开的一种报文处理装置结构示意图;图4为本发明实施例公开的一种电子设备结构图。
具体实施方式
30.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
31.当前,tcp已经成为ict(即information and communications technology,信息与通信技术)不可缺少的底层技术,在绝大部分的cpu(即central processing unit,中央处理器)上都会运行着tcp/ip(即internet protocol,指网际互连协议)网络协议栈软件,用户态的应用程序以socket的方式使用tcp功能,收发网络报文。通常,tcp接收缓冲区是单生产者单消费者:由网络协议栈放入载荷,由app取出载荷。接收报文的过程是,网络协议栈收到报文后,将报文中的载荷放在tcp socket的接收缓冲区中,等待app从接收缓冲区中取出载荷。因为存放载荷和取出载荷两个过程中使用的数据字段较多、逻辑复杂,为了保证数据一致性,通常会把接收缓冲区作为临界区来处理,访问时对它加锁,保证一个时刻只有一个线程能够操作接收缓冲区。但现有方案的临界区比较大,cpu指令比较多,cpu开销比较大,这个临界区内做的事情比较多,甚至是还包含在临界区内做内存拷贝。在高性能场景中,当tcp吞吐量很大时,网络协议栈线程和app线程对临界区竞争得非常激烈,尤其是那些基于dpdk(即data plane development kit,数据平面开发套件)的用户态协议栈,它们采用高速轮询的方式,锁碰撞会导致严重的性能损耗。为此,本发明提供了一种传输控制协议报文处理方案,能够避免在tcp吞吐量很大时,网络协议栈以及应用程序对锁竞争激烈而产生的性能损耗,从而提升网络性能。
32.参见图1所示,本发明公开了一种报文处理方法,包括:步骤s11:通过网络协议栈,接收传输控制协议报文。
33.本发明实施例中,网络协议栈可以linux、freebsd(一种类unix操作系统)等。并且,在具体的实施方式中,可以与对端设备建立传输控制协议连接;基于所述传输控制协议连接,并通过网络协议栈,接收传输控制协议报文。也即先进行三次握手,建立传输控制协议连接。另外,可以开启一个线程,即网络协议栈线程,通过网络协议栈线程接收传输控制协议报文。
34.步骤s12:将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于
传输控制协议的接收缓冲区中。
35.在具体的实施方式中,如果传输控制协议报文的报文序列号落在所述传输控制协议连接的接收窗口之中,则将传输控制协议报文挂接到报文分段链表中。也即,本发明实施例中,会先判断传输控制协议报文的报文序列号是否落在所述传输控制协议连接的接收窗口之中,如果传输控制协议报文的报文序列号落在所述传输控制协议连接的接收窗口之中,则将传输控制协议报文挂接到报文分段链表中。
36.进一步的,在具体的实施方式中,可以将所述传输控制协议报文的元数据放置到该传输控制协议报文对应的分段描述符;所述元数据包括所述传输控制协议报文中载荷数据的载荷指针;将所述分段描述符挂接至报文分段链表中。另外,所述元数据还包括报文序列号和长度。长度为载荷数据的长度。可以理解的是,载荷指针即为载荷数据在接收缓冲区的地址。本发明实施例可以预先分配内存,将载荷数据存入相应的内存中。并且,可以基于报文序列号在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流。
37.步骤s13:将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表。
38.在具体的实施方式中,在所述将所述报文分段链表分裂为第一子链表和第二子链表之前,本发明实施例可以比较所述报文分段链表中目标描述符中的报文序列号与接收缓冲区的接收期待序列号;所述目标描述符为所述报文分段链表中首个分段描述符;当目标描述符中的报文序列号与接收缓冲区的接收期待序列号相等,则触发所述将所述报文分段链表分裂为第一子链表和第二子链表的步骤。也即,将报文分段链表分裂成两部分:一个是已经组装好的、承载连续字节流的链表;另一个是剩下的还没有完成组装的链表。
39.其中,从第一预设辅助字段中读取接收缓冲区的接收期待序列号;比较所述报文分段链表中目标描述符中的报文序列号与接收期待序列号。可以理解的是,当发现第一个分段描述符中的报文序列号与接收缓冲区的接收期待序列号相等时,说明已经收到了期待接收的字节。网络协议栈可以操作报文分段链表和第一预设辅助字段。
40.另外,在具体的实施方式中,当接收到新的传输控制协议报文,则将所述第二子链表作为新的报文分段链表,并将该传输控制协议报文挂接至该报文分段链表中。也即,每次分裂得到的第二子链表均为下次收到新的传输控制协议报文对应的报文分段链表。
41.步骤s14:将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据;所述过渡队列为无锁队列。
42.需要指出的是,本发明实施例将头结点指针推送到过渡队列,而非将数据推送到过渡队列,因为指针所占字节较少,能够进一步提升性能。并且,在具体的实施方式中,可以基于内存屏障技术将所述第一子链表的头结点指针推送到过渡队列。本发明实施例使用内存屏障技术实现过渡队列的入队和出队,可以保证数据一致性。
43.可以理解的是,本发明实施例中,可以通过网络协议栈执行以下步骤:接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列。具体的,通过网络协议栈线程执行。
44.进一步的,在具体的实施方式中,在将所述第一子链表的头结点指针推送到过渡队列之后,可以将传输控制协议套接字设置为可读状态。进一步的,可以通过应用程序监听传输控制协议套接字的状态,当传输控制协议套接字为可读状态,则基于所述过渡队列从所述接收缓冲区读取报文载荷数据。具体的,通过应用程序线程监听传输控制协议套接字的状态,当传输控制协议套接字为可读状态,则基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
45.在一种实施方式中,可以调用读接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。在另一种实施方式中,可以调用消息接收接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。也即,应用程序监听传输控制协议套接字的状态,当传输控制协议套接字为可读状态,则调用读接口或消息接收接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。可以理解的是,调用读接口或消息接收接口,可以进行入协议栈,在协议栈代码中基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
46.进一步的,在具体的实施方式中,基于所述过渡队列从所述接收缓冲区读取报文载荷数据,具体可以包括以下步骤:步骤00:从过渡队列中读取头结点指针。
47.步骤01:将所述头结点指针追加至已合并分段链表的尾部,并增加已合并长度。
48.可以理解的是,已合并长度为已合并分段链表中所有载荷数据的总长度,已合并分段链表在最开始时是空的,随着报文数据的接收,将所述头结点指针追加至已合并分段链表的尾部。
49.步骤02:基于所述已合并长度从所述接收缓冲区读取报文载荷数据并拷贝至应用程序的内存中。
50.在具体的实施方式中,可以基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。可以从第二预设辅助字段中读取已合并长度;基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。也即,应用程序可以读取已合并链表和第二预设辅助字段。
51.其中,预设限制内存长度为读接口或消息接收接口输入参数中的一个参数,用于限制拷贝至应用程序内存中的载荷数据的长度。
52.并且,可以基于所述已合并长度与预设限制内存长度二者之中的较小值,在已合并分段链表中根据分段描述符读取报文荷载数据,直到读取到的报文荷载数据达到所述较小值。
53.另外,在读取过程中,修改已合并分段链表中分段描述符中的载荷指针和长度。当分段描述符中的长度即载荷数据的长度减为0,则释放该分段描述符和报文载荷数据对应的内存。及时释放内存,能够提升性能。
54.可见,本发明实施例先通过网络协议栈,接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷
数据;所述过渡队列为无锁队列。也即,本发明实施例中,网络协议栈先接收报文,将报文数据存储至接收缓冲区,数据结构采用链表的形式,并进行链表拆分,将承载连续字节流的子链表的头结点指针推送到无锁的过渡队列,应用程序基于无锁的过渡队列中的指针从接收缓冲区读取报文载荷数据,这样,引入无锁的过渡队列,实现了无锁的接收缓冲区,能够避免在tcp吞吐量很大时,网络协议栈以及应用程序对锁竞争激烈而产生的性能损耗,从而提升网络性能。
55.进一步的,参见图2所示,图2为本发明实施例公开的一种传输控制协议报文处理示意图。针对接收缓冲区的操作分为两部分:在app线程中操作包括app可以读取的已合并分段链表和一些辅助字段;在协议栈线程中操作,包括报文分段链表和一些辅助字段。
56.其中,网络协议栈放入载荷数据的过程可以包括:与对端设备建立tcp连接,当网络协议栈收到来自外部的tcp报文后,如果报文的tcp序列号落在当前tcp连接的接收窗口之中,那么将报文挂到当前tcp连接的报文分段链表中,在报文分段链表中对报文中做重组、合并的处理,组装出连续的tcp字节流,当发现第一个分段的序列号与接收缓冲区的接收期待序列号相等时,说明已经收到了期待接收的字节,那么将已经组装好的若干个连续的分段从报文分段链表中分离,也就是,此时将分段链表分裂成两部分:一个是已经组装好的、承载连续字节流的链表;另一个是剩下的还没有完成组装的链表。网络协议栈将前者的头结点指针推送到过渡队列中,并将socket设置为可读状态。
57.app取出载荷数据的过程具体可以包括:当app接收到socket可读事件后,它调用read(读)或recvmsg(消息接收)接口,进入协议栈,在协议栈代码中,首先,从过渡队列中取出分段链表的头结点指针,将它追加到已合并分段链表的尾部,增加已合并长度。然后,使用接收缓冲区的已合并长度和“app输入参数中的内存长度二者中的较小值作为要读取的长度,从接收缓冲区中将载荷数据拷贝到app内存中,减小接收缓冲区的已合并长度。修改分段中的载荷指针和长度字段,当长度减为0后释放报文分段。如果一个报文分段中的载荷长度小于要读取的长度,那么继续读取下一个报文分段,直到满足要读取的长度为止。在读取后,增加读期待序列号,可以基于读期待序列号进行载荷数据读取。
58.过渡队列可以使用无锁队列来实现,因为是单生产者单消费者模式,所以只要使用内存屏障即可保证数据一致性,不会在网络协议栈线程和app线程 之间产生竞争。这样,对整个接收缓冲区的读写操作都是无锁的。本发明实施例提供了一种tcp接收缓冲区无锁的实现方法,采用了消除临界区的方式来避免竞争导致的性能损耗,在高性能场景中,避免了当tcp吞吐量很大时网络协议栈线程和app线程对锁的激烈竞争而产生的性能损耗,提高了网络性能。另外,本发明提供的方案也适用于与tcp类似的字节流方法的实体通信场景中。
59.参见图3所示,本发明实施例公开了一种报文处理装置,包括:协议报文接收模块11,用于通过网络协议栈,接收传输控制协议报文;协议报文挂接模块12,用于将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;分段链表分裂模块13,用于将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之
外的链表;结点指针推送模块14,用于将所述第一子链表的头结点指针推送到过渡队列;所述过渡队列为无锁队列载荷数据读取模块15,用于通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
60.可见,本发明实施例先通过网络协议栈,接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据;所述过渡队列为无锁队列。也即,本发明实施例中,网络协议栈先接收报文,将报文数据存储至接收缓冲区,数据结构采用链表的形式,并进行链表拆分,将承载连续字节流的子链表的头结点指针推送到无锁的过渡队列,应用程序基于无锁的过渡队列中的指针从接收缓冲区读取报文载荷数据,这样,引入无锁的过渡队列,实现了无锁的接收缓冲区,能够避免在tcp吞吐量很大时,网络协议栈以及应用程序对锁竞争激烈而产生的性能损耗,从而提升网络性能。
61.其中,协议报文接收模块11,具体包括:协议连接建立子模块,用于与对端设备建立传输控制协议连接;协议报文接收子模块,用于基于所述传输控制协议连接,并通过网络协议栈,接收传输控制协议报文。
62.协议报文挂接模块12,具体用于:如果传输控制协议报文的报文序列号落在所述传输控制协议连接的接收窗口之中,则将传输控制协议报文挂接到报文分段链表中。
63.并且,在具体的实施方式中,协议报文挂接模块12,具体用于将所述传输控制协议报文的元数据放置到该传输控制协议报文对应的分段描述符;所述元数据包括所述传输控制协议报文中载荷数据的载荷指针;将所述分段描述符挂接至报文分段链表中。
64.其中,所述元数据还包括报文序列号和长度。
65.所述装置还包括期待序列号比较模块,用于在所述将所述报文分段链表分裂为第一子链表和第二子链表之前,比较所述报文分段链表中目标描述符中的报文序列号与接收缓冲区的接收期待序列号;所述目标描述符为所述报文分段链表中首个分段描述符;当目标描述符中的报文序列号与接收缓冲区的接收期待序列号相等,则触发分段链表分裂模块13执行所述将所述报文分段链表分裂为第一子链表和第二子链表的步骤。
66.并且,期待序列号比较模块,具体可以包括:接收期待序列号读取子模块,具体用于从第一预设辅助字段中读取接收缓冲区的接收期待序列号;期待序列号比较模块,具体用于比较所述报文分段链表中目标描述符中的报文序列号与接收期待序列号。
67.在具体的实施方式中,结点指针推送模块14,具体用于基于内存屏障技术将所述第一子链表的头结点指针推送到过渡队列。
68.进一步的,所述装置还包括套接字状态设置模块,用于在结点指针推送模块14所述将所述第一子链表的头结点指针推送到过渡队列之后,将传输控制协议套接字设置为可读状态。
69.相应的,载荷数据读取模块15,具体包括:套接字状态设置模块监听子模块,用于通过应用程序监听传输控制协议套接字的状态;载荷数据读取子模块,用于当套接字状态设置模块监听子模块监听到传输控制协议套接字为可读状态,则基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
70.在一种实施方式中,载荷数据读取子模块,具体用于调用读接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
71.在另一种实施方式中,载荷数据读取子模块,具体用于调用消息接收接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
72.进一步的,载荷数据读取子模块,具体包括:头结点指针读取单元,用于从过渡队列中读取头结点指针;已合并分段链表操作单元,用于将所述头结点指针追加至已合并分段链表的尾部;已合并长度增加单元,用于增加已合并长度;载荷数据读取单元,用于基于所述已合并长度从所述接收缓冲区读取报文载荷数据并拷贝至应用程序的内存中。
73.其中,载荷数据读取单元,具体用于基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。进一步的,具体的,基于所述已合并长度与预设限制内存长度二者之中的较小值,在已合并分段链表中根据分段描述符读取报文荷载数据,直到读取到的报文荷载数据达到所述较小值。
74.并且,载荷数据读取单元,具体用于从第二预设辅助字段中读取已合并长度;基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。
75.所述装置还包括:分段描述符修改模块,用于在读取过程中,修改已合并分段链表中分段描述符中的载荷指针和长度。
76.内存释放模块,用于当分段描述符中的长度减为0,则释放该分段描述符和报文载荷数据对应的内存。
77.另外,所述装置还用于:当接收到新的传输控制协议报文,则将所述第二子链表作为新的报文分段链表,并将该传输控制协议报文挂接至该报文分段链表中。
78.参见图4所示,本发明实施例公开了一种电子设备20,包括处理器21和存储器22;其中,所述存储器22,用于保存计算机程序;所述处理器21,用于执行所述计算机程序,以实现以下步骤:通过网络协议栈,接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文
分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据;所述过渡队列为无锁队列。
79.可见,本发明实施例先通过网络协议栈,接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据;所述过渡队列为无锁队列。也即,本发明实施例中,网络协议栈先接收报文,将报文数据存储至接收缓冲区,数据结构采用链表的形式,并进行链表拆分,将承载连续字节流的子链表的头结点指针推送到无锁的过渡队列,应用程序基于无锁的过渡队列中的指针从接收缓冲区读取报文载荷数据,这样,引入无锁的过渡队列,实现了无锁的接收缓冲区,能够避免在tcp吞吐量很大时,网络协议栈以及应用程序对锁竞争激烈而产生的性能损耗,从而提升网络性能。
80.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:与对端设备建立传输控制协议连接;基于所述传输控制协议连接,并通过网络协议栈,接收传输控制协议报文。
81.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:如果传输控制协议报文的报文序列号落在所述传输控制协议连接的接收窗口之中,则将传输控制协议报文挂接到报文分段链表中。
82.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:将所述传输控制协议报文的元数据放置到该传输控制协议报文对应的分段描述符;所述元数据包括所述传输控制协议报文中载荷数据的载荷指针;将所述分段描述符挂接至报文分段链表中。所述元数据还包括报文序列号和长度。
83.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:在所述将所述报文分段链表分裂为第一子链表和第二子链表之前,比较所述报文分段链表中目标描述符中的报文序列号与接收缓冲区的接收期待序列号;所述目标描述符为所述报文分段链表中首个分段描述符;当目标描述符中的报文序列号与接收缓冲区的接收期待序列号相等,则触发所述将所述报文分段链表分裂为第一子链表和第二子链表的步骤。
84.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:从第一预设辅助字段中读取接收缓冲区的接收期待序列号;比较所述报文分段链表中目标描述符中的报文序列号与接收期待序列号。
85.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:将传输控制协议套接字设置为可读状态。
86.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具
体实现以下步骤:通过应用程序监听传输控制协议套接字的状态,当传输控制协议套接字为可读状态,则基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
87.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:基于内存屏障技术将所述第一子链表的头结点指针推送到过渡队列。
88.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:调用读接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
89.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:调用消息接收接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。
90.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:从过渡队列中读取头结点指针;将所述头结点指针追加至已合并分段链表的尾部,并增加已合并长度;基于所述已合并长度从所述接收缓冲区读取报文载荷数据并拷贝至应用程序的内存中。
91.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。
92.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:基于所述已合并长度与预设限制内存长度二者之中的较小值,在已合并分段链表中根据分段描述符读取报文荷载数据,直到读取到的报文荷载数据达到所述较小值。
93.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:从第二预设辅助字段中读取已合并长度;基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。
94.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:在读取过程中,修改已合并分段链表中分段描述符中的载荷指针和长度。
95.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:当分段描述符中的长度减为0,则释放该分段描述符和报文载荷数据对应的内存。
96.本实施例中,所述处理器21执行所述存储器22中保存的计算机子程序时,可以具体实现以下步骤:当接收到新的传输控制协议报文,则将所述第二子链表作为新的报文分段链表,并将该传输控制协议报文挂接至该报文分段链表中。
97.并且,所述存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,存储方式可以是短暂存储或者永久存储。
98.另外,所述电子设备20还包括电源23、通信接口24、输入输出接口25和通信总线26;其中,所述电源23用于为所述电子设备20上的各硬件设备提供工作电压;所述通信接口24能够为所述电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本发明技术方案的任意通信协议,在此不对其进行具体限定;所述输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
99.进一步的,本发明实施例还公开了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述实施例公开的报文处理方法。
100.关于上述报文处理方法的具体过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
101.本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
102.结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
103.以上对本发明所提供的一种报文处理方法、装置、设备及介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

技术特征:
1.一种报文处理方法,其特征在于,包括:通过网络协议栈,接收传输控制协议报文;将所述传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;将所述第一子链表的头结点指针推送到过渡队列,通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据;所述过渡队列为无锁队列。2.根据权利要求1所述的报文处理方法,其特征在于,所述通过网络协议栈,接收传输控制协议报文,包括:与对端设备建立传输控制协议连接;基于所述传输控制协议连接,并通过网络协议栈,接收传输控制协议报文。3.根据权利要求2所述的报文处理方法,其特征在于,所述将所述传输控制协议报文挂接到报文分段链表中,包括:如果所述传输控制协议报文的报文序列号落在所述传输控制协议连接的接收窗口之中,则将所述传输控制协议报文挂接到报文分段链表中。4.根据权利要求1所述的报文处理方法,其特征在于,所述将所述传输控制协议报文挂接到报文分段链表中,包括:将所述传输控制协议报文的元数据放置到该传输控制协议报文对应的分段描述符;所述元数据包括所述传输控制协议报文中载荷数据的载荷指针;将所述分段描述符挂接至报文分段链表中。5.根据权利要求4所述的报文处理方法,其特征在于,所述元数据还包括报文序列号和长度。6.根据权利要求1所述的报文处理方法,其特征在于,在所述将所述报文分段链表分裂为第一子链表和第二子链表之前,还包括:比较所述报文分段链表中目标描述符中的报文序列号与所述接收缓冲区的接收期待序列号;所述目标描述符为所述报文分段链表中首个分段描述符;当目标描述符中的报文序列号与所述接收缓冲区的接收期待序列号相等,则触发所述将所述报文分段链表分裂为第一子链表和第二子链表的步骤。7.根据权利要求6所述的报文处理方法,其特征在于,比较所述报文分段链表中目标描述符中的报文序列号与所述接收缓冲区的接收期待序列号,包括:从第一预设辅助字段中读取所述接收缓冲区的接收期待序列号;比较所述报文分段链表中目标描述符中的报文序列号与接收期待序列号。8.根据权利要求1所述的报文处理方法,其特征在于,所述将所述第一子链表的头结点指针推送到过渡队列之后,还包括:将传输控制协议套接字设置为可读状态。9.根据权利要求8所述的报文处理方法,其特征在于,所述通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据,包括:
通过应用程序监听传输控制协议套接字的状态,当所述传输控制协议套接字为可读状态,则基于所述过渡队列从所述接收缓冲区读取报文载荷数据。10.根据权利要求1所述的报文处理方法,其特征在于,所述将所述第一子链表的头结点指针推送到过渡队列,包括:基于内存屏障技术将所述第一子链表的头结点指针推送到过渡队列。11.根据权利要求1所述的报文处理方法,其特征在于,基于所述过渡队列从所述接收缓冲区读取报文载荷数据,包括:调用读接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。12.根据权利要求1所述的报文处理方法,其特征在于,基于所述过渡队列读取报文数据,包括:调用消息接收接口,并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。13.根据权利要求1所述的报文处理方法,其特征在于,基于所述过渡队列从所述接收缓冲区读取报文载荷数据,包括:从所述过渡队列中读取头结点指针;将所述头结点指针追加至已合并分段链表的尾部,并增加已合并长度;基于所述已合并长度从所述接收缓冲区读取报文载荷数据并拷贝至所述应用程序的内存中。14.根据权利要求13所述的报文处理方法,其特征在于,基于所述已合并长度从所述接收缓冲区读取报文载荷数据,包括:基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。15.根据权利要求14所述的报文处理方法,其特征在于,基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据,包括:基于所述已合并长度与预设限制内存长度二者之中的较小值,在已合并分段链表中根据分段描述符读取报文荷载数据,直到读取到的报文荷载数据达到所述较小值。16.根据权利要求14所述的报文处理方法,其特征在于,所述基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据,包括:从第二预设辅助字段中读取已合并长度;基于所述已合并长度与预设限制内存长度二者之中的较小值从所述接收缓冲区读取报文载荷数据。17.根据权利要求13所述的报文处理方法,其特征在于,还包括:在读取过程中,修改已合并分段链表中分段描述符中的载荷指针和长度。18.根据权利要求17所述的报文处理方法,其特征在于,还包括:当分段描述符中的长度减为0,则释放该分段描述符和报文载荷数据对应的内存。19.根据权利要求1至18任一项所述的报文处理方法,其特征在于,还包括:当接收到新的传输控制协议报文,则将所述第二子链表作为新的报文分段链表,并将该传输控制协议报文挂接至该报文分段链表中。20.一种报文处理装置,其特征在于,包括:协议报文接收模块,用于通过网络协议栈,接收传输控制协议报文;
协议报文挂接模块,用于将所述传输控制协议报文挂接到报文分段链表中,并在所述报文分段链表中进行报文重组及合并处理,得到连续的字节流;所述报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;分段链表分裂模块,用于将所述报文分段链表分裂为第一子链表和第二子链表,其中,所述第一子链表为承载连续字节流的链表,所述第二子链表为所述第一子链表之外的链表;结点指针推送模块,用于将所述第一子链表的头结点指针推送到过渡队列;所述过渡队列为无锁队列载荷数据读取模块,用于通过应用程序并基于所述过渡队列从所述接收缓冲区读取报文载荷数据。21.一种电子设备,其特征在于,包括存储器和处理器,其中:所述存储器,用于保存计算机程序;所述处理器,用于执行所述计算机程序,以实现如权利要求1至19任一项所述的报文处理方法。22.一种计算机可读存储介质,其特征在于,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现如权利要求1至19任一项所述的报文处理方法。

技术总结
本发明公开了一种报文处理方法、装置、设备及介质,应用于报文处理技术领域,包括:通过网络协议栈,接收传输控制协议报文;将传输控制协议报文挂接到报文分段链表中,并在报文分段链表中进行报文重组及合并处理,得到连续的字节流;报文分段链表中的报文数据均存储于传输控制协议的接收缓冲区中;将报文分段链表分裂为第一子链表和第二子链表,第一子链表为承载连续字节流的链表将第一子链表的头结点指针推送到过渡队列,通过应用程序并基于过渡队列从接收缓冲区读取报文载荷数据;过渡队列为无锁队列。能够解决在TCP吞吐量很大时,网络协议栈以及应用程序对锁竞争激烈而产生的性能损耗问题,从而提升网络性能。从而提升网络性能。从而提升网络性能。


技术研发人员:刘富海 陈翔
受保护的技术使用者:苏州浪潮智能科技有限公司
技术研发日:2023.07.26
技术公布日:2023/8/28
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐