一种Linux模块化PRP协议栈系统的制作方法

文档序号:31512920发布日期:2022-09-14 11:30阅读:292来源:国知局
一种Linux模块化PRP协议栈系统的制作方法
一种linux模块化prp协议栈系统
技术领域
1.本发明属于实时、高速、高可靠的以太网数据通信领域,涉及一种并行冗余以太网传输协议实现方法,具体为一种linux模块化prp协议栈系统。


背景技术:

2.并行冗余以太网适用于对可靠性和容错性要求较高的以太网数据通信领域。
3.(1)目前针对并行冗余以太网产品有keyland的并行冗余模块,内部采用操作系统结合协议栈的方式实现,价格昂贵。并行冗余的实现需要结合外部特定的硬件模块来实现,没有软件直接集成到操作系统中的并行冗余产品。
4.(2)目前针对并行冗余的算法主要是基于滑窗算法,窗口移动算法在多路径和多核心处理的环境中上会出现乱序现象,进而导致丢包。
5.(3)目前没有直接针对linux操作系统,通过软件的方式在协议栈中实现并行冗余特性;基本都是直接修改网络控制器驱动以实现prp功能。采用现有的方法,实时处理性能低,对内存的消耗大。


技术实现要素:

6.本发明的目的在于提供一种linux模块化prp协议栈系统,以克服现有技术的不足。
7.一种linux模块化prp协议栈系统,包括节点管理模块、接收管理模块、发送管理模块和统计管理模块;
8.节点管理模块和接收管理模块用于实现并行冗余的节点和序列号管理;发送管理模块和统计管理模块用于实现对网络设备和以太网数据接口的对接。
9.优选的,节点管理模块用于管理prp协议栈需要和网络上的诸外部节点通信的网络节点数据信息。
10.优选的,采用hash查找算法,结合链表rcu读写锁。
11.优选的,获取节点链表的rcu读锁进行节点hash查找,如果未命中该节点,则需要释放链表读锁,然后获取链表写锁对链表进行新节点的添加操作,操作完成后释放写锁。
12.优选的,接收管理模块采用序列号滑窗算法,接收到新序列号时滑窗向前移动并对下一个要到来的新序列号进行预测。
13.优选的,还包括用于监控多路冗余网络链路的健康状态的通道状态探测模块。
14.优选的,采用rcu记录所有指向共享数据的指针的使用者,当要修改该共享数据时,首先创建一个副本,在副本中修改,所有读访问线程都离开读临界区之后,指针指向新的修改副本的指针,并且删除旧数据。
15.优选的,在prp的tx方向,判断待发送数据是否为sg数据,如果是sg数据,并且nic不具备sg发送能力,需要在发送前进行一次线性化处理,如果nic具备sg发送能力,则将skb分解成bdma数据的线性化数据逐个进行线性化发送。
16.优选的,将l3的报文先根据nic的设备能力进行线性化处理,并留有6个字节的prp报文尾部内存空间,然后通过递减skb的引用计数将skb不断通过修改prp尾部数据后,在各个nic通道进行发送,直到这个序列号数据帧发送完成。
17.优选的,对于发送来说,如果链路出现问题,该链路则不进行冗余发送,对于接收来说,如果链路出现问题,则该链路上无法接收到相应健康链路上的报文,则会对其进行统计。
18.与现有技术相比,本发明具有以下有益的技术效果:
19.本发明一种linux模块化prp协议栈系统,在linux系统内核中采用虚拟网络设备模块的方式实现了一个桥阶层的协议栈,利用虚拟层的处理达到了无需修改网络设备驱动即可实现对并行冗余网络设备收发流程的复杂处理,对各种网络设备兼容性很好,高效实现了在并行冗余数据到来时的实时处理性能、极大程度降低了原有算法对内存的消耗,能很好满足并行冗余协议的指标要求。
20.优选的,结合链表rcu读写锁,由于tx在发送时需要获取特定节点的序列号,所以通过获取节点链表的rcu读锁进行节点hash查找,如果未命中该节点,则需要释放链表读锁,然后获取链表写锁对链表进行新节点的添加操作,操作完成后释放写锁;保证了rx和tx能够进行双工数据传输。
21.本发明利用散列表、滑窗算法数据结构实现了对节点数据及序列数据的增删改查操作。配置方便,算法高效,可实现并行冗余对数据包实时处理的需求;
22.本发明针对linux所特有的套接字缓冲区内存机制的特征,及不同的网络设备dma传输的特点进行了很好的兼容,对sgdma和bdma数据的处理兼容。
附图说明
23.图1为本发明实施例中系统结构示意图。
24.图2为本发明实施例中并行冗余数据发送处理流程框图。
25.图3为本发明实施例中peer节点的创建于删除流程图。
26.图4为本发明实施例中链表节点的查找、创建、删除流程图。
27.图5为本发明实施例中网络控制器的中断号分配示意图。
28.图6为本发明实施例中列号顺序到达多核心cpu时导致的序列号乱序现象示意图。
具体实施方式
29.为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
30.本发明一种linux模块化prp协议栈系统,用于并行冗余以太网组网管理及数据传输管理,实现并行冗余实时以太网通信功能,提供标准的linux网络设备通信接口。
31.实时并行冗余协议管理的prp协议栈系统用于实现对端节点的管理,节点数据序列号的管理,并行冗余协议栈的发送流程,并行冗余协议栈的接收流程管理,并行冗余的设
备管理以及并行冗余协议数据的套接字缓冲区的内存兼容性。
32.如图1、图2所示,本发明一种linux模块化prp协议栈系统,基于hash和滑窗算法,具体包括节点管理模块1、接收管理模块2、发送管理模块3和统计管理模块4;
33.为实现以上功能,需要在设备驱动层之上的二层协议栈实现并行冗余协议处理功能;二层协议栈指网络设备驱动层,prp协议栈的实现在该网络设备驱动层l2之上并且在网络层l3之下进行,属于桥阶层l2.5实现方案,prp协议栈在该层处理两个方向的流量:网络发送流量(从网络层l3到来的经过prp协议栈l2.5发往网络设备驱动l2的出向报文(发送报文,发送报文需要prp协议栈处理冗余转发);从网络设备驱动l2经过prp协议栈进入网络层l3的入向报文(接收报文,接收报文需要prp协议栈进行冗余过滤)。
34.在linux内核协议栈中需要设计符合网络设备(l1)接口特征和符合以太网ipv4及ipv6(l3)接口特征的l2协议栈。
35.节点管理模块1和接收管理模块2用于实现并行冗余的节点和序列号管理;发送管理模块3和统计管理模块4用于实现对l1和l3数据接口的对接。以上这些模块的具体功能说明如下:
36.节点管理模块用于管理prp协议栈需要和网络上的诸外部节点通信的网络节点数据信息;
37.采用hash查找算法,结合链表rcu读写锁:由于发送管理模块tx在发送时需要获取节点的序列号,所以需要获取节点链表的rcu读锁进行节点hash查找,如果未命中该节点,则需要释放链表读锁,然后获取链表写锁对链表进行新节点的添加操作,操作完成后释放写锁。采用互斥设计保证了接收管理模块rx和发送管理模块tx能够进行双工数据传输。
38.接收管理模块采用序列号滑窗算法,接收到新序列号时滑窗向前移动并对下一个要到来的新序列号进行预测。
39.如图2所示,发送和接收时都需要对端节点链表进行hash查找,首先获取端节点链表的rcu读锁,然后进行hash查找,如果命中,则递增该节点的发送序列号,然后释放读锁,如果不命中,则首先释放读锁,然后获取端节点链表的写锁,再向链表中添加新节点并递增序列号,最后释放写锁。
40.还包括通道状态探测模块,用于监控多路冗余网络链路的健康状态。
41.在tx方向(发送方向)和rx方向(接收方向)均需要对nic的链路状态进行不间断监控,如果链路失败,则需要采取必要的措施。
42.统计管理模块4用于对数据传输过程中重要的状态参数进行统计。
43.本发明利用虚拟层的处理达到了无需修改网络设备驱动即可实现对并行冗余网络设备收发流程的复杂处理,对各种网络设备兼容性很好;本发明利用散列表、滑窗算法数据结构实现了对节点数据及序列数据的增删改查操作。配置方便,算法高效,可实现并行冗余对数据包实时处理的需求;本发明针对linux所特有的套接字缓冲区内存机制的特征,及不同的网络设备dma传输的特点进行了很好的兼容,对sgdma和bdma数据的处理兼容。
44.由于外部节点和本节点通信是动态和随机,利用节点管理模块对于不经常使用的外部节点定时清除,并且维护的节点的信息进行定时更新。
45.预先通过linux slab缓存池机制,申请足够的节点缓冲区放入节点缓冲池中备用,该机制有效降低了在高速数据传输的环境下,新节点加入网络对整个系统带来的瞬间
cpu压力和申请内存失败带来的不确定因素。
46.5s老化时间在节点内存管理上的影响,在5s内未收到对端节点的数据时,自动对该对端节点的窗口数据进行置位,待该节点有新数据时对该节点窗口重新进行adjust指针校正操作。
47.垃圾节点的清理,采用惰性清理方法,在节点内存充足时,不主动进行节点清理,在节点内存不足的情况下,即当节点内存低于设定阈值,新节点加入需要对链表中的节点时戳进行一次堆排序操作,对时戳最久远的节点进行清理,来存放新节点的数据。
48.节点临界资源的并发设计与优化:
49.由于tx方向和rx方向的流程均需要在节点列表中通过hash查找(链表的read操作)获取节点,如果未查找到节点,还需要动态添加新节点(链表的write操作)到hash链表中,任务的定时历程还需要通过判断节点链表是否已满,如果已满则删除(链表的write操作)长期不使用的节点,以保证节点添加的成功。该场景的多线程读写需求可以通过内核读写spinlock来保证,但是读写spinlock在一个线程进行写操作时,所有的线程均无法读,这会影响协议栈高速传输的情况下,创建节点和删除节点对prp栈数据传输带来的颠簸卡顿现象,甚至造成丢包;并且读写spinlock使用了原子操作指令,即原子的访问内存,多cpu争用共享的变量会让cache一致性变得很糟,使得性能下降。rcu机制要实现的目标是读者线程没有同步开销,或者同步开销很小,甚至可以忽略不计,不需要额外的锁,不需要使用原子操作指令和内存屏障,即可畅通无阻的访问;而需要把同步的任务交给写者线程,写者线程等待所有读者线程完成后才会把旧数据销毁。在rcu中,如果有多个写者同时存在,才需要额外的保护机制(自旋锁)。
50.linux内核即节点管理模块提供了一种rcu(read copy update)机制,该机制是linux内核中一种重要的同步机制。rcu机制的原理是:rcu记录了所有指向共享数据的指针的使用者,当要修改该共享数据时,首先创建一个副本,在副本中修改。所有读访问线程都离开读临界区之后,指针指向新的修改副本的指针,并且删除旧数据。
51.如图3、图4所示,在prp互斥资源时,考虑到涉及到存在3个读线程,3个写线程,其中写线程中2个为创建,1个为删除。
52.(1)tx的获取节点(查找r-》创建w);
53.(2)rx的获取节点(查找r-》创建w);
54.(3)定时历程删除老化节点(遍历r-》删除w)。
55.报文乱序现象的成因
56.(1)多径路由造成的乱序,端节点在顺序发送数据报文后,如果报文通过不同路由到达目的节点,有可能存在早发送的后到达,晚发送的先到达的情况,导致报文序列号乱序现象发生;
57.(2)cpu多核心、nic多通道造成的乱序,在序列号顺序到达目的节点的cpu上时,由于cpu的多核心和nic多通道的特性,不同cpu核心上对顺序序列号的处理的不确定性,可能导致报文序列号乱序现象。
58.如图5所示表示了在龙芯3a3000四核心cpu上,7a1000的两路gmac网络控制器的中断号分配,以及4个核心分别处理各个网络设备的中断统计数据,可以发现,同一时间,cpu的每个核心上都有处理不同网络控制器到达的数据的能力,该情况下,可能会造成报文prp
序列号乱序的情况发生。
59.图6表示了顺序达到的连续序列号报文seq11.12.13.14顺序达到cpu1.2.3.4上时,cpu2和cpu4由于负载的压力,导致上层接收的报文序列号可能会变成seq11.13.12.14,产生序列号乱序现象。
60.本发明采用序列号滑窗算法中处理乱序的措施:
61.序列号hash查找算法不存在乱序的问题,由于到达的序列号是统一存放在序列号数据库中,对序列号的顺序没有要求,到达的新序列号即可加入序列号数据库。
62.采用序列号滑窗算法,收到新的序列号,滑窗向前移动,准备接收下一个预测的新序列号,对序列号的顺序有要求,如果序列号乱序,不采取相关措施,乱序序列号到预测值之间的序列号就不再会进行接收,进而导致丢包发生。针对序列号滑窗算法,需要设计防止乱序的机制。本文中采用head指针对窗口划过的最新的一批旧帧(包括窗口滑过的乱序区间)进行临时缓存,以实现后续乱序新帧到达时,对这部分乱序新帧进行接收而不是丢弃,该方法可以有效解决乱序情况导致的丢包问题。
63.接收管理模块的滑窗指针的设计:head指针《
‑‑
》next指针《
‑‑
》tail指针。
64.(1)head指针:旧帧容忍接收域的最左边;
65.(2)tail指针:预测新帧指针的最右边;
66.(3)next指针:预测新帧指针的最左边;
67.(4)head回收指针移动定时器:该定时器每100ms启动一次,实现head指针追向next指针,判断当当前时戳与帧时戳差值小于1ms时(该帧还在1ms超差时间之内)停止向next指针移动。
68.注:1ms超差时间:相同端节点的相同序列号的数据帧的到达的有效时间为:从该帧的最新帧到达时间算起,1ms之内到达的相同序列号的数据帧作为超差时间内到达的有效旧帧,对该帧进行统计后丢弃,并且该帧在head《
‑‑
》next之间有效,1ms之后,该序列号的帧再到达已不在head《
‑‑
》next之间,统计1ms超差计数后直接丢弃。
69.窗口指针的初始化:5s老化时间和adjust过程,5s老化时间保证了对端节点在和本地进行初始通信时,窗口可进行首次校正,使得next指针在新帧首次到达本地时能正常接收,并以此帧的序列号预测下一帧的序列号,并开始进行窗口的滑动。
70.序列号帧的类型划分
71.(1)正常新帧(normal new frame):新序列号到达窗口时,如果命中窗口最左端的预测序列号,则为正常新帧。
72.(2)一次乱序新帧(out of order new frame):新序列号到达窗口时,如果落在了最左端预测帧和最右端预测帧之间的开区间内,则为一个一次乱序新帧。
73.(3)二次乱序新帧(loss new frame):新序列号达到窗口时,如果落在了最左端和一次乱序新帧的序列号开区间内,则为一个二次乱序新帧。
74.注意:丢失帧可以解释为一个超时未到达的二次乱序帧。
75.(4)旧帧(old frame):接收序列号的接收标记被重复记录的帧为旧帧。
76.(5)窗外帧(out of window frame):不再窗口域内的帧为窗外帧。
77.注意:超窗口的统计由于无法针对特定设备通道进行统计,所以对新帧和旧帧的统计是叠加的,统计的结果(叠加和除以通道总数)只能作为估计。
78.一次乱序新帧和二次乱序新帧以及head指针的设计优点:
79.(1)有效克服了上文描述的各种情况导致的数据帧乱序问题。
80.(2)为协议的数据统计提供了良好的基础。
81.发送管理模块:多通道原子化发送;
82.由于prp对发送的原子性要求,要求各个通道在发送同一报文时,必须保证原子性。该原子性的实现可以通过多种方式进行:
83.(1)关闭内核抢占的方式:在发送前,关闭内核抢占,各个通道发送完成后,开启内核抢占。
84.(2)针对各个网络节点结构设置发送自旋锁,在发送前首先通过节点的hash查找获取节点指针,然后通过该节点指针获取该节点的tx自旋锁,发送结束后释放该tx自旋锁。
85.linux socket buffer在协议栈中进行传递的关键处理环节:
86.sg数据的线性化处理:
87.linux网络设备和协议栈的处理过程中,可能会出现多个相关联的连续内存块数据进行传输的情况,这种多个相关联的连续内存块数据叫做sg(scatter-gether)(离散聚合)数据,这种数据在tx方向,进行nic传输之前,除非nic具备传输sg数据的能力,否则必须将sg进行线性化处理后,才能进行发送。大部分nic默认没有sg传输能力,并且具备sg传输能力的nic也需要开启该功能才可以使用。在prp的tx方向,判断待发送数据是否为sg数据,如果是sg数据,并且nic不具备sg发送能力,需要在发送前进行一次线性化处理,如果nic具备sg发送能力,则将skb分解成bdma数据的线性化数据逐个进行线性化发送。待发送数据的内存都是以连续的内存块放置到nic的dma通道进行发送的。
88.skb内存处理相关的接口:由于prp在发送协议l3下达的报文时,需要将l3的报文先根据nic的设备能力进行线性化处理,并留有6个字节的prp报文尾部内存空间,然后通过递减skb的引用计数将skb不断通过修改prp尾部数据后,在各个nic通道进行发送,直到这个序列号数据帧发送完成。期间涉及到的接口函数有:
89.(1)skb的线性化处理函数。
90.(2)为skb预留prp尾部内存空间的函数。
91.(3)通过引用计数的方式,实现skb的多次发送,而不是通过拷贝的方式对skb进行多次发送。引用计数的方式避免了skb的复制所消耗的时间。
92.(4)由于发送的原子性保障和skb可能因为线性化和prp尾部预留空间的要求需要内存拷贝的耗时性是一个矛盾两面。因此在处理发送过程的时候,需要将内存的拷贝放置在tx抢占内核进行发送之前进行完成,而不能在抢占内核期间进行内存拷贝,这样会造成内核中断性能急剧下降。可采取的措施即为,通过空间换取时间的方式,保证数据在发送时内存空间的可用性。
93.通道状态探测模块:对于发送来说,如果链路出现问题,该链路则不进行冗余发送,对于接收来说,如果链路出现问题,则该链路上无法接收到相应健康链路上的报文,则会对其进行统计。
94.rx方向:在rx方向上,通道探测任务需要实时更新nic活动链路的信息,并为滑窗算法提供一个活动通道掩码,链路失败则将该通道置位,在滑窗算法中即可理解为放弃该链路的数据统计和数据处理。
95.tx方向:在tx方向上,prp发送函数通过通道探测任务提供的活动通道掩码,来决定将数据只在活动的通道中进行发送,放弃在不活动通道的发送流程。
96.统计模块及参数更改接口模块:
97.统计管理模块4的设计分三个统计域进行统计,从大到小分别是:1.prp设备统计域(用于统计整个prp协议通信的状态信息,包括报文超窗口计数,报文超差统计和报文丢包统计);2.局域网对端节点统计域(用于统计局域网中针对对端节点的发送的报文和本地节点的统计信息,包括超窗口计数信息,报文超差统计信息和报文丢包统计信息);3.网络通道统计域(用于对本地为prp提供传输功能的网络通道设备进行统计,包括通道的错误统计,通道的链路连接和断开统计,通道的丢包统计,通道的超窗口统计)。
98.针对超窗口统计,通过接收报文序列号是否落在窗口里面进行递增统计;
99.针对丢包统计,通过在对端节点数据结构体中设计序列号预测窗口,并对接收报文的序列号上下文连续性进行判断,从而进行统计;
100.针对超差统计,通过在对端节点的发送报文满足连续两个相同序列号报文的到达本地节点的时间间隔是否超过1ms,进行统计;
101.针对链路状态统计,通过设计定时器,定时读取网络设备的链路信息的变化而实时更新链路信息的通断;
102.针对通道错误统计,通过解析报文是否在对应的通道被接收进行计数统计。
103.序列号状态标记域
104.统计对象:
105.106.[0107][0108]
通道统计域(特定网络控制器):
[0109]
统计对象:
[0110]
[0111][0112]
3.端节点统计域(特定网络端节点)
[0113]
统计对象:
[0114]
[0115]
[0116][0117]
4.prp设备统计域(总统计)
[0118]
统计对象:
[0119]
[0120][0121]
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1