版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c6deefb3fb1edeb5343902a8c4632431.pdf通信中间件概要设计说明书 目 录1引言11.1文档用途11.2阅读对象11.3名词术语11.4参考资料22概述32.1系统概述32.1.1可靠通信和不可靠通信32.1.2异步发送和乱序接收42.1.3选择多播42.1.4按组名多播42.2设计约束42.3设计策略53方案选择63.1备选方案1通信函数库63.2备选方案2通信守护进程+函数库63.3选定的方案及理由74系统体系结构94.1系统总体结构94.2关键技术与算法104.2.1可靠通信技术和算法104.2.2选择多播技术和算法134.2.3日志记录技术和算法144.2
2、.4通信中间件的整体工作流程154.3关键数据结构174.3.1first_frame174.3.2data_frame174.3.3ack_frame184.3.4nak_frame184.3.5node、segment和config_file184.3.6sys_session194.3.7request_frame_header和sys_task204.3.8response_frame_header和sys_recv_task215子模块功能235.1系统配置子模块235.2会话管理子模块245.3事件管理子模块245.4数据传输子模块255.5日志记录和调试相关子模块255.6上层应
3、用编程接口(API函数)266非功能需求分配277接口设计287.1外部接口287.1.1通信相关函数287.1.2辅助性函数297.1.3通信守护进程的命令行接口307.2内部接口307.2.1系统配置子模块中的内部接口307.2.2会话管理子模块中的内部接口307.2.3事件管理子模块中的内部接口317.2.4数据传输子模块中的内部接口327.2.5日志记录和调试相关子模块中的内部接口337.2.6其他内部接口348开发环境的配置359运行环境的配置3610系统出错处理设计3710.1出错信息3710.2补救措施39 I 1 引言1.1 文档用途本概要设计主要描述的是在“PDSA冗余系统”
4、通信中间件子系统的解决方案。预期读者为系统与具体到本子系统的设计与开发人员。1.2 阅读对象此文档在PDSA冗余系统项目中适用,适合以下人员阅读:设计工程师开发工程师测试工程师1.3 名词术语缩写或术语解释机群机群是指以高速网络连接起来的高性能工作站或PC机组成的系统。由于其组成构件都是市场上可以买到的产品,因此它的实现可做到十分灵活、且价格也比较低廉。网络协议网络协议用于协调不同网络设备之间的信息交换,他们建立了网络上主机、设备之间互相识别,互相通信的机制。常用的网络协议有TCP/IP协议族等。TCP/IP一个用于网际互联的协议族,在因特网上使用得非常广泛。主要包括网际协议(IP),传输控制
5、协议(TCP)和用户数据报协议(UDP)。服务网络协议通常是分层设计的,所谓服务就是下层协议为上层协议提供的各种功能。单播一对一通信,数据的接收者是一台唯一的主机(更准确的说是一个唯一的接口地址)广播一对多通信,数据的接收者是子网上的所有主机。多播一对多通信,数据的接收者是子网上加入了某一个多播组的一部分主机。选择多播本系统中提出的概念,建立在多播的基础上,通过掩码选择,接收者是子网上加入了某个多播组的那部分主机的一个子集。它的接收对象个数比普通的多播更少。通信中间件通信中间件是一个协议层,它建立在已有的传输层协议(TCP或UDP)的基础之上。为应用层提供API接口,实现数据收发等功能,但是它
6、提供比传输层更多的特征。比如传输可靠多播、消息排序、选择多播等等。Spread一个比较成熟的开源通信中间件,它由一个Daemon进程和一个API函数库构成。支持六种消息的可靠性和顺序性级别,支持单源、多源的消息排序。1.4 参考资料编号资料名称简介作者日期出版单位001PDSA冗余系统用户需求说明书1.0.1陈勇07.06.08002第 38 页 共 39 页2 概述2.1 系统概述通信中间件是一个协议层,它建立在已有的传输层协议(TCP或UDP)的基础之上,如图2-1所示。中间件为应用层提供API接口,实现数据收发等功能,但是它提供比传输层更多的特征。在本系统中,通信中间件模块提供了大数据传
7、输(单次传输最多可达20M字节)、可靠多播、选择多播等等。图2-1 通信中间件在协议栈中的位置及其功能通信中间件模块的功能需求主要有以下几项:2.1.1 可靠通信和不可靠通信通信中间件需要实现两种可靠性级别的通信方式,这两种通信方式都建立在不可靠的传输层协议(UDP)之上。不可靠通信需要把大块数据(在下文中,如果不至于引起混淆,我们可能将“大块数据”不太严格地称之为“文件”或“消息”)进行分片传输,因此每小片数据都必须带有序列号,以便接收端能够重新组装。可靠通信除了要进行数据分片处理外,还要求接收端在收到首片数据和收齐整个文件后向发送端发出ACK确认。如果出现数据分片丢失,则两种级别的通信方式
8、都需要向发送端发送NAK,以便发送端重传丢失的数据。2.1.2 异步发送和乱序接收通信中间件的数据传输模式是异步发送和乱序接收。所谓异步发送,是指发送端的应用程序将大块数据(文件)交给中间件以后便立即返回,继续处理应用层的事务逻辑。中间件自身维护着一个发送任务列表,真正的数据发送过程由中间件控制,与应用层无关。所谓乱序接收,指的是同一时间允许多个发送端向接收端发送数据,因为数据是分片的,所以接收端在一段时间内收到的数据可能属于不同的发送者,这些数据片是互相交叉的。因此中间件必须维护一个接收缓冲池,将属于不同任务的数据放到各自的地方,而不至于互相混淆。2.1.3 选择多播通信中间件需要实现一对多
9、的通信方式,即一个发送者对应多个接收者。通常可以利用IP多播技术达到这一目的,但是本系统对中间件提出了更高的要求,期望达到这样一种效果:接收者并不是所有加入了某一个多播组的所有成员,而是其中的一个子集,并且这个子集是可以任意指定的。在本系统当中,这种通信方式被称为选择多播。2.1.4 按组名多播 IP多播技术是借助D类IP地址实现的,每个多播组都用一个D类IP地址(224.0.0.0 239.255.255.255)来标识。显然,IP地址不方便人们记忆,也不利于实现多播通信对应用层的完全透明,因此中间件必须实现一种类似于域名的机制,用一个字符串形式的多播组名来代替多播IP地址。2.2 设计约束
10、功能需求约束:从整体上看,通信中间件的设计必须实现用户需求说明书中所要求的所有功能,如通信的可靠性级别、异步发送、乱序接收、选择多播、按组名多播等。其实现方式则可由开发人员自由选择。独立性和通用性约束:通信中间件应当是一个相对独立的子系统,不应当向具体的应用层程序提出过多要求,不应当实现明显只针对特定应用的函数接口。整个中间件必须是一个尽可能通用的平台,各种不同的应用程序能够在上面运行良好。模块化约束:通信中间件本身是一个比较大的子系统,为了方便开发和调试,中间件必须有良好的模块化。模块之间尽量独立,模块之内功能尽量单一。2.3 设计策略扩展策略:因为通信中间件是一个相对独立和通用的子系统,为
11、了更好地实现通用性,各个功能模块和函数接口都应当是可扩展的。一些功能函数应当定义一些将来可能用到的参数,尽管这些参数所规定的功能在当前版本中不需要实现,但是必须考虑到以后的扩充。3 方案选择3.1 备选方案1通信函数库这种方案的思路是将所有通信功能实现为一个函数库,中间件向应用层开发者提供API(声明各个外部接口的头文件)、静态库(.a文件)和运行时动态链接库(.so文件)。应用层的程序经过编译链接以后,通信中间件将成为应用程序的一部分,整个系统运行的时候只有一个进程。这样做的优点是内存拷贝次数比较少,效率相对较高。缺点是应用层与中间件层结合太过紧密,不利于实现通信中间件的通用化,并且一旦应用
12、程序运行时出现故障,难以查找故障点出在应用层还是中间件里面。图3-1描绘了本方案的数据传输过程,图中用通信中间件提供的两个典型函数COM_unicast()和 COM_receive()为例进行说明。图3-1 方案1的数据传输过程3.2 备选方案2通信守护进程+函数库这种方案的思路是仿照Spread的实现方法,将通信中间件做成两大部分。一部分是一个独立运行的通信守护进程(Daemon),守护进程维护着发送任务队列和接收任务缓冲池,负责主机之间的数据传输。这种方案同时也提供一个函数库(包括相应的头文件,静态库和动态库),但是与方案1不同的是,这个函数库的功能比较简单,它不负责实际的数据传输工作,
13、它只是将应用层请求发送的数据交给守护进程,和从守护进程提取接收完成的大块数据(文件)。图3-2描绘了方案2的数据传输过程,同样用中间件API提供的COM_unicast()和COM_receive()为例进行说明。图3-2 方案2的数据传输过程与方案1相比,本方案在层次上多了一层,因此在整个“应用层-应用层”数据传输过程中,多了两次内存拷贝,显然,这对效率是有一定影响的。但是这种方案也有它的优点,它实现了具体通信过程(即中间件的守护进程部分)与应用层逻辑的完全分离,使得“异步发送”和“乱序接收”得以方便的实现。同时使中间件本身获得了更好的独立性和通用性。最后一点,在软件故障发生时,它让开发人员
14、能够准确地定位到底是应用程序还是中间件本身存在BUG。3.3 选定的方案及理由本系统在功能方面提出了“异步发送”和“乱序接收”的需求,如果采用方案1,会让中间件这个子系统变得异常复杂,而用方案2则可以很方便地实现,因为通信守护进程维护了发送任务列表和接收任务缓冲池。本系统注重通信中间件的独立性、通用性和扩展性。采用的设计策略是扩展策略,选用方案2能够更好地实现这些特性。当然,方案2会带来一些效率上的损失,但是我们可以采用一些策略来进行优化,让效率的损失降低到最低限度。比如,应用程序和通信守护进程通常运行在同一台主机上面,因此可以使用效率比较高的Unix域协议(Unix Socket API)代
15、替因特网域协议来进行本地数据传输。综上所述,我们选定了通信守护进程+函数库的实现方案。4 系统体系结构4.1 系统总体结构在整个PDSA冗余系统里面,除人工监控操作台所在的主机外,其他每一台主机(包括调度服务器、应用服务器和计算节点等)的系统均可用图4-1的左边部分来表示,从图中我们可以清楚地看出整个通信中间件子系统所处的位置:图4-1 通信中间件在系统中所处的位置通信中间件本身是一个相对独立的子系统,包括通信守护进程和函数库两大部分,其中守护进程又可以细分为若干个小模块。它的总体结构如图4-2所示:图4-2 通信中间件总体结构图以下简单介绍一下会话、事件、发送任务和接收任务的概念。会话(Se
16、ssion):一个上层应用在请求通信中间件为其进行数据传输之前,必须先与通信守护进程建立连接,这种连接被称为会话。有了会话的概念,便可以实现多个上层应用同时请求通信守护进程为其进行数据传输。当上层应用不再需要守护进程为其服务的时候,应当断开与守护进程的连接,这时候守护进程就会将会话注销。通信守护进程维护着一个会话列表。事件(Event):通信守护进程有一个用于监听会话的Socket描述符,每一个会话对应了一个Socket描述符(Unix Socket或Internet Socket),各台主机的守护进程间通信有一个用于读的Socket描述符和一个用于写的Socket描述符。在这些Socket描
17、述符上可能发生各种各样的行为,比如:上层应用与守护进程建立连接,会话Socket上送来了一个数据传输请求,上层应用断开了与守护进程的连接,数据读Socket上面有了从其他守护进程送来的数据等。我们把这些行为统称为事件。发送任务与接收任务:对于上层应用来说,数据的传输通常都是一整块的(最高可达20M字节),大块数据(文件)的分片和重组由通信中间件来负责。文件在应用层看来是一个不可分割的整体。在本系统中,我们将一个要传输的文件称作为一个任务。在中间件里面,任务除了文件数据本身以外还有一些附加信息,比如文件的大小,任务的发送者和接收者的地址,任务的编号等等。根据附加信息的不同,我们将任务细分称为发送
18、任务和接收任务。通信守护进程维护着一个发送任务列表和一个接收任务缓冲池。4.2 关键技术与算法4.2.1 可靠通信技术和算法通信中间件的数据传输建立在不可靠的UDP/IP基础之上,为了实现可靠通信,需要实现一套可靠的用户层协议。实现可靠通信的两个基本方法是序列号和丢帧重传。序列号的作用是实现大块数据(文件)的分片和重组。因为UDP协议不保证数据报文的按序到达,因此接收端便不能以接收到报文的顺序作为真正的顺序来进行重组。但是如果我们给文件的每一个分片一个递增的序列号,那么接收端无论以什么顺序接收,只要它收到了每一片数据,就可以正确地重构出原来的文件。UDP协议不保证它发出的每一个报文都能够到达目
19、的地,这意味着数据有可能在网络上丢失。因此,为了实现可靠传输,必须有丢帧(这里所说的帧实际上是用户层对数据分片的片,不是数据链路层的帧)重传的机制。数据的接收端应当在适当的时机检查数据是否接收完全(是否有丢失的数据片),如果发现有数据片丢失,就向发送端发送NAK,告知丢失的部分。发送端收到NAK后,将丢失的部分重新发送给接收端。上文提到,中间件必须实现两种可靠性级别的通信:可靠通信和不可靠通信。这里所说的不可靠通信并不是说它跟IP协议一样完全是一种Best effort的通信,而是说它与另一种可靠性级别相比,其要求稍微低一点。具体表现在:收到首片数据后和收全所有数据以后不需要向发送端发送ACK
20、确认。大块数据(文件)的传输大致分为三个阶段:即传输“首片数据”,传输“正常数据”和传输“尾片数据”。“首片数据”是“正常数据”的元数据,它包括了任务号、文件大小、传输方式(单播、多播或选择多播)、服务类型(可靠或不可靠)以及主机掩码(用于选择多播)等信息。“正常数据”和“尾片数据”都是文件数据,不过“正常数据”的数据区大小是固定的,而“尾片数据”的数据区通常要小于“正常数据”。图4-3是不可靠通信的工作流程图。左边表示数据的正常发送流程,右边表示接收流程,值得注意的是,右图中对NAK的处理实际上是属于数据发送的工作。图4-3 不可靠通信的工作流程图图4-4是可靠通信的工作流程图。左边表示数据
21、的正常发送流程,右边表示接收流程,同样值得注意的是,右图中对NAK和ACK的处理实际上是属于数据发送的工作。图4-4 可靠通信的工作流程图从图4-4中可以看出可靠通信使用了定时器,定时器的作用主要有三点。第一,发送端发出“首片数据”以后,可能得不到ACK,这时候可能有两种情况,要么是接收端出现故障,要么是数据出现了丢失。等预设时间一到,如果没有收到ACK,发送端就应当查询接收端的状态,如果有响应,那么重发“首片数据”,如果无响应,更新节点列表。第二,发送端发送完所有数据以后,可能收不到ACK,这时候也要查询接收端状态,如果无响应,更新节点列表。第三,接收端可能收不到“尾片数据”,这时候,收到最
22、后一片“正常数据”后所更新的定时器数据就可以发挥作用,等预设时间一到,接收端检查哪些数据片没有接收完成,并且构造NAK发送给发送端。定时器是借助Linux的信号机制实现的,在预设的超时时限到达以后,就会向本进程发送SIGALRM信号,系统捕获到这个信号以后就可以进行相应的处理。4.2.2 选择多播技术和算法选择多播技术是借助IP多播技术和主机掩码实现的。除了单播和广播支持,IP协议还提供一种发送和接收IP多播流的机制。IP多播流发送到单个目标IP地址,但是由多个IP主机接收和处理。一个主机侦听一个特定的IP多播地址,并接收发送到该IP地址的所有数据包。对于一对多的数据传输,IP多播要比IP单播
23、和广播更为高效。与单播不同,多播仅发送数据的一个副本。与广播不同,多播仅由正在侦听它的计算机进行接收和处理。侦听特定IP多播地址的那一组主机称为一个主机组。主机组的成员关系是动态的,主机可以在任何时候加入或离开该组。主机组的成员数量没有限制。主机组可以跨越多个网段。这种配置需要IP路由器上的IP多播支持,并要求主机能够将它们对接收多播流量的意愿注册到该路由器。主机注册是使用“Internet组管理协议(Internet Group Management Protocol,IGMP)”来完成的。IP 多播地址(也称为组地址)在224.0.0.0到239.255.255.255的D类地址范围内,这
24、是通过将前四个高序位设置为1110来定义的。在网络前缀或无类别域间路由(Classless Inter-Domain Routing,CIDR)表示法中,IP多播地址缩写为224.0.0.0/4。 从224.0.0.0到224.0.0.255 (224.0.0.0/24)范围的多播地址保留用于本地子网,而IP报头中的生存时间(Time to Live,TTL)可忽略,它们都不会被IP路由器转发。本系统对通信中间件提出了“选择多播”要求,期望达到这样一种效果:接收者并不是所有加入了某一个多播组的所有成员,而是其中的一个子集,并且这个子集是可以任意指定的。为了支持选择多播,我们定义了一种叫“主机掩
25、码”的数据结构,它包含256个位,每个位唯一对应一个C类局域网的256台主机,某个位为1表示对应的主机属于接收对象。发送数据的时候,如果传输类型是选择多播,则“首片数据”中会携带有一个主机掩码,属于接收多播组的每一台主机均可以收到这个“首片数据”。这些主机收到首片数据后,会根据主机掩码判断自身是否属于接收对象,如果是,那么新建一个接收任务项,加入接受任务缓冲池并分配相应的数据空间。否则将首片数据丢弃。4.2.3 日志记录技术和算法通信守护进程在运行的时候可能出现各种情况,有时候我们希望能将这些信息记录下来以便管理人员分析,因此我们设计了日志记录子模块。我们可以让通信守护进程在运行的时候向控制台
26、输出各种信息,但是有几点理由让我们没有采用这种方式。第一,向屏幕输出信息是一种比较“昂贵”的IO操作,它会引发系统调用,降低整个系统的效率。第二,我们的通信守护进程被设计成为一个可以以Daemon模式运行的程序,这个时候守护进程可能关闭标准IO设备,使得这些信息无法输出。第三,即便通信守护进程没有以Daemon模式运行,它也可能是无人值守的,也就是说,系统管理员可能在运行守护进程以后退出登录,这时也会使得信息无法输出。写日志文件本身也是一种费时的IO操作,因此我们不能在每一处需要记录的地方都直接对日志文件进行读写。我们专门创建了一个日志记录线程负责将日志项写入文件,同时设计了一个日志项环形缓冲
27、池。日志记录线程一开始处于睡眠状态,程序每到一处需要记录的时候就将日志项写入环形缓冲池,同时唤醒日志记录线程,日志记录线程将缓冲池中的每一项写入文件以后,继续睡眠,等待下一次被唤醒。4.2.4 通信中间件的整体工作流程 上层应用调用通信中间件进行数据传输的过程主要是三大步:与通信守护进程建立会话请求数据传输注销与通信守护进程的会话。通信守护进程是通信中间件的主体。图4-5是通信守护进程启动和退出时的工作流程:图4-5 通信守护进程启动和退出流程图通信守护进程进入事件循环以后,会接收并处理各种各样的事件,比如:上层应用与守护进程建立连接,会话Socket上送来了一个数据传输请求,上层应用断开了与
28、守护进程的连接,数据读Socket上面有了从其他守护进程送来的数据等等。除非接收到了SIGINT、SIGQUIT和SIGTERM三种信号,守护进程将启动正常的退出流程外,系统将一直运行于事件循环中。SIGKILL信号无法被捕获和注册信号处理函数,因此一旦管理员向守护进程发送SIGKILL信号,将造成系统非正常退出。4.3 关键数据结构4.3.1 first_frametypedef struct dummy_first_frameu_char flag;/ 在本系统中必须为0x51u_char type;/ 对于“首片数据”,必须为F_FLAG_BEGINshort task_number;/
29、 任务号,用于唯一标识一个任务inttask_size;/ 本任务对应的文件大小int total_frame_num; / 本任务的分片总数int xmit_type; / 传输模式:单播、多播或选择多播int service_type;/ 服务类型:可靠或不可靠int16 mess_type;/ 用户自定义host_mask group_mask; /主机掩码,用于选择多播 first_frame;First_frame就是前面提到的“首片数据”的结构。它在正常的数据前发送,接收端根据它来构造一个“接收任务”。4.3.2 data_frametypedef struct dummy_dat
30、a_frameu_char flag; / 在本系统中必须为0x51u_char type; / 本字段必须为F_FLAG_DATA、F_FLAG_END或F_FLAG_PATCHshort task_number; /任务号,用于唯一标识一个任务short data_length; /本小片内数据区长度short ser_number; /片序列号,用于大文件的分片与重组char dataMAX_DATA_LEN; /数据区指针 data_frame;Data_frame这个数据结构就是上文提到的“正常数据”和尾片数据。接收端会根据任务号和片序列号将数据区拷至接收任务缓冲池中正确的位置。4.
31、3.3 ack_frametypedef struct dummy_ack_frameu_char flag;/ 在本系统中必须为0x51u_char type;/ 对于ACK报文,本字段必须为F_FLAG_ACKint command;/本ACK报文的含义short task_number; /本ACK报文所确认的任务号 ack_frame;Ack_frame是“ACK报文”的数据结构,在本系统中ACK报文有4种用途:1、告诉发送端“首片数据”已经收到;2、告诉发送端一个任务已经收全;3、回应发送端的状态查询报文,告知“一个任务不存在或已经收全”;4、回应发送端的状态查询报文,告知“我还活着
32、”。对应这4种用途,command字段有4种取值,分别是ACK_CONFIRM_HEADER、ACK_CONFIRM_TASK、ACK_TASK_NOT_EXSIT和ACK_I_AM_ALIVE。4.3.4 nak_frametypedef struct dummy_nak_frameu_char flag;/ 在本系统中必须为0x51u_char type;/ 对于NAK报文,本字段必须为F_FLAG_NAKshort service; / 服务类型:可靠或不可靠short task_number; /本NAK报文所报告的任务号short lost_num; /总共丢失的数据片数short
33、lost_listMAX_LOST_NUM; /丢失的数据片序列号列表 nak_frame;Nak_frame是“NAK报文”的数据结构,它告诉发送端哪个任务的数据有丢失、丢失了多少个数据片以及丢失的都是哪一些数据片。4.3.5 node、segment和config_filetypedef struct dummy_nodecharnameIP_STR_NAME_LEN; /主机名charip_addrIP_STR_NAME_LEN; /IP地址node;typedefstruct dummy_segmentcharsegment_nameSEG_NAME_LEN; /多播组组名charse
34、gment_ip_addrIP_STR_NAME_LEN; /多播组IP地址unsigned segment_port_number; /多播组监听端口charif_nameIF_NAME_LEN; /接口(网卡)名字u_charneed_verify; /是否需要校验存活性unsigned num_of_nodes; /组内主机数目nodenode_listMAX_NODE_IN_SEGMENT; /主机列表segment;typedef struct dummy_configure_file unsigned max_ip_frame_size; /最大数据片长度unsigned num_
35、of_segments; /多播组个数segmentsegment_listMAX_SEGMENT_NUM; /多播组列表 configure_file;这三个数据结构是跟系统配置有关的。其中configure_file包含了从一个文件读取的所以信息,这些信息包括一个全局起作用的“最大数据片长度”和一个多播组列表。结构segment就是一个表示多播组的数据结构,它包括了组名、组IP、网卡编号等信息和一个主机列表。而node则表示一台主机,包括IP地址和主机名。4.3.6 sys_sessiontypedef struct dummy_sys_sessionintflag; / 为1表示这个会话
36、在使用,0表示没有被使用intconnection_type;/ 连接类型:AF_UNIX或AF_INETmailboxmbox; / 本会话对应的Socket描述符 struct sockaddr_in source_addr_in; / AF_INET方式下的连接者地址struct sockaddr_un source_addr_un; / AF_UNIX方式下的连接者地址 sys_session;Sys_session是“会话”的数据结构,上层应用可以用两种方式与守护进程建立会话,即通过Unix域协议(AF_UNIX)和Internet域协议(AF_INET)。4.3.7 request
37、_frame_header和sys_tasktypedef struct dummy_request_frame_dataint direction; / 传输方向(收/发),当前保留不用struct sockaddraddr; / 接收者地址int xmt_type; / 传输类型:单播、多播或选择多播int service_type; / 服务类型:可靠或不可靠int mess_len; / 消息(数据块)长度int16 mess_type; / 消息类型,用户自定义chargroup_nameMAX_GROUP_NAME;/ 多播组组名host_maskmask; / 主机掩码,用于选择
38、多播 request_frame_header;typedef struct dummy_sys_taskintflag;/状态标志,0表示未初始化,1表示正在使用,2表示传输完成 intsession_index; / 该任务所属的会话short task_number; / 任务号,用于唯一标识一个发送任务first_frameheader_frame; / 首片数据struct sockaddr_in dest_addr; / 接收者地址intstatus; / 传输状态:“已发完首片数据”或者“已发完全部数据”struct timevallast_op_time; / 最后操作时间in
39、tmillisec_time_out; / 超时值,以毫秒为单位request_frame_header*p_request_header; / 请求消息头char*data; / 数据区指针 sys_task;这两个数据结构是跟“发送任务”有关的。通信守护进程在从上层应用接收请求的时候,会先接收一个“请求消息头”,然后接收需要传输的数据。数据结构request_frame_header就是“请求消息头”,它包含了接收者地址、传输类型、服务类型、数据大小等消息。而sys_task就表示一个“发送任务”,它包含了所属会话号、任务号、请求消息头、首片数据、数据区指针等消息。将首片数据作为sys_t
40、ask的一个成员是为可靠通信而设计的,因为可靠通信可能需要多次发送首片数据,这样可以避免每次都重新构造一次首片数据,以提高效率。最后操作时间和超时值是为了配合定时器而使用的。每当收到SIGALRM信号以后,就会用当前时间减去最后操作时间,如果时间差大于超时值,就会进行相应的处理。4.3.8 response_frame_header和sys_recv_tasktypedef struct dummy_response_frame_datastruct sockaddraddr;/ 发送者地址int service_type; / 服务类型:可靠或不可靠int mess_len; / 消息(数据
41、块)长度int16 mess_type; / 消息类型,用户自定义 response_frame_header;typedef struct dummy_sys_recv_taskint flag;/状态标志,0表示未初始化,1表示正在使用,2表示传输完成short task_number; / 任务号,用于唯一标识一个接收任务struct sockaddr_in sourece_addr; / 发送者地址int task_size; / 此任务的数据块大小int service_type; / 服务类型:可靠或不可靠int16 mess_type; / 消息类型,用户自定义int last_
42、ser_number; / 最后一片数据的序列号intstatus; / 接收状态:收到首片数据、收到部分数据或收到尾片数据struct timevallast_op_time; / 最后操作时间intmillisec_time_out; / 超时值,以毫秒为单位u_char*bit_mask; / 位图,用于判断文件是否收全void*data; / 数据区指针sys_recv_task;这两个数据结构是跟“接收任务”有关的。通信守护进程向上层应用递交数据时,会先发送一个“响应消息头”然后发送数据。数据结构response_frame_header就是“响应消息头”,它包含了源地址、服务类型、
43、数据块长度等信息。而sys_recv_task则表示一个“接收任务”,跟“发送任务”类似,“接收任务”也包含了任务号、数据块大小、服务类型、最后操作时间、数据区指针等信息。与“发送任务”的最大区别是“接收任务”包含了一个位图结构,位图的作用是用于判断一个文件是否接收完全。一个文件有多少个数据片,位图里面就有多少个位与之对应。位图初始化为全0,然后每收到一片数据,就将位图里面的相应位置1,如果文件接收完全,那么位图中的每一位将会是1。如果有数据片丢失,用位图还可以很方便地查找到究竟是丢失的是哪一些。5 子模块功能5.1 系统配置子模块系统配置子模块的功能是读取一个配置文件,把里面的信息放置到co
44、nfig_file类型的全局变量g_sys_config中。下面是一个典型配置文件的内容:#pdsa_mw.confMaxDataBlockSize=1400 #这个参数定义了最大的数据分片长度#下面定义了一个多播组Test_Segment1Test_Segment1 202.112.0.132 225.0.1.1:3333 VERIFY c0101 192.168.2.1 c0109 192.168.2.9 c0110 192.168.2.10 c0111 192.168.2.11 c0112 192.168.2.12#下面定义了另一个多播组Test_Segment2Test_Segment
45、2 202.112.0.131 225.0.1.2:4444 c0101 192.168.2.1 c0113 192.168.2.13 c0114 192.168.2.14 c0115 192.168.2.15 c0116 192.168.2.16配置文件里面以“#”开头的行和一行中“#”以后的部分是注释。除了注释以外,配置文件提供了两种信息:第一种是整个系统中的最大数据分片长度,它由参数MaxDataBlockSize指定;另一种是多播组信息,它包括组名(如Test_Segment1)、加入组的网卡接口(如eth0)、多播地址和端口(如225.0.1.1:3333)以及一个机器列表(里面包含
46、的部分,由主机名和IP地址组成)。定义多播组的时候可以加上可选参数VERIFY,如果加上了这个参数,那么在通信守护进程初始化的时候需要校验机器列表里面每台机器的存活性。配置文件里面最多可定义MAX_SEGMENT_NUM个多播组。5.2 会话管理子模块会话是上层应用与通信守护进程在数据传输之前建立的Socket连接。会话管理子模块包括以下几个功能:1、 会话子模块初始化:主要工作是建立两个监听Socket,一个是Unix域协议类型,另一个是Internet域协议类型。2、 从上层应用接收会话:如果上层应用连接守护进程的时候指定了主机名或IP地址,则使用Internet域协议与上层应用建立会话,
47、否则用Unix域协议建立会话。3、 通过某个会话从上层应用接收一个发送任务。4、 关闭、撤销一个会话。5.3 事件管理子模块事件循环中,select()函数操作的Socket描述符集的状态改变称为一个事件。这些描述符集包括会话监听Socket、会话Socket和数据读写Socket,select()函数所操作的描述符集是fd_set类型的全局变量g_event_read_fd_set(读描述符集)和g_event_write_fd_set(写描述符集)。事件管理子模块包括以下几个功能:1、 事件子模块初始化:主要工作是初始化(清空)g_event_read_fd_set和g_event_wri
48、te_fd_set。2、 将一个描述符加入g_event_read_fd_set或g_event_write_fd_set,从描述符集里面删除一个描述符。3、 事件循环体:一个无限循环,每次循环的开始都用select()函数等待事件,事件发生以后,根据不同情况做不同处理。5.4 数据传输子模块数据传输子模块包括数据发送、数据接收、发送任务管理和接受任务管理。它包括以下几项功能:1、 发送任务和接收任务初始化:清空发送任务队列和接收任务缓冲池,将发送任务和接收任务的任务号初始化为0。2、 发送一个任务:对于不同的可靠性级别,要做不同的处理。在不可靠通信的情况下,发送完首片数据后就开始发送正常数据
49、;在可靠通信的情况下,发送完首片数据需要等待接收端的ACK回馈到达以后才几项发送正常数据。3、 处理各种接收到的数据片:任务的接收是以数据片为单位的,接收到首片数据、正常数据、尾片数据、ACK报文、NAK报文或状态查询报文以后,要进行各种相应的处理。4、 向上层应用递交数据:当一个接收任务接收完成以后,需要将数据递交给上层应用。5、 销毁任务并释放资源:在一个发送任务发送完成以后(收到了接收端的ACK确认或发出最后一帧以后若干时间内未收到NAK)需要销毁一个发送任务。在一个接收任务接收完成以后也需要销毁一个接收任务。在通信守护进程启动正常退出流程的时候,需要销毁所有的发送任务和接收任务。5.5
50、 日志记录和调试相关子模块日志记录和调试相关子模块用于记录一些通信守护进程的运行时信息,让系统管理员能够掌握系统的运行状态。此外本模块还用于为开发人员输出一些运行时的调试信息和错误信息。本模块包括了以下几项功能:1、 日志模块初始化:日志记录使用单独的线程来进行处理,日志模块的初始化包括日志记录线程等待的条件变量的初始化,保护这个条件变量的互斥变量的初始化,日志项环形缓冲区的初始化和日志记录线程的创建工作。2、 错误、调试、日志信息的处理:通信守护进程运行时的所有出错信息都会即时输出到屏幕上,调试信息是否输出取决于启动守护进程的时候是否带上了-debug参数,日志信息则会输出到日志项环形缓冲区
51、里面。3、 日志文件备份:通信守护进程每次启动的时候,如果打开了日志功能,则会把日志信息写入到/var/log/pdsa_mw.log之中,如果没有日志备份功能,上一次的记录就会被覆盖,本系统设计了日志备份,会保留最近的5个日志记录文件,即/var/log目录下的pdsa_mw.log.1pdsa_mw.log.5。4、 守护进程退出时的处理:当守护进程启动正常退出流程时,要保证所有的日志项都被写入了日志文件,并且日志文件在退出去被正常关闭。5.6 上层应用编程接口(API函数)API函数提供以下几项功能:1、 提供接口让上层应用与通信中间件建立连接(建立会话)与断开连接(销毁会话)。2、 提
52、供接口让上层应用进行数据传输:数据传输包括数据发送和数据接收,其中数据的发送支持单播、多播和选择多播三种方式。3、 提供接口让上层应用能方便地操作主机掩码:如清空主机掩码、将主机加入掩码、从掩码删除主机、反转掩码、显示当前掩码状态等。4、 规范API调用中的各类出错信息,提供接口让上层应用能够方便地解析各种错误码。6 非功能需求分配No.非功能需求关联的子系统实现要求1性能需求数据传输子模块系统中的各子部分在加入容错功能后,性能的损耗总体不超过20%。系统中的各子部分主机发送故障时,故障切换总时间应小于30秒。系统中各主备系统在切换过程中,除数据网关正在下发数据时刻外,其他子系统的任何时刻的故
53、障切换,允许故障发生的周期内的状态、数据、文件丢失。故障切换时间小于30秒,冗余系统应保证30秒后主机系统无故障的PDSA能在接受到EMS下发的周期数据后正常工作。2易用性需求跟每一个子模块(系统配置、会话管理、事件管理、数据传输和日志记录等)均有关联系统中的各个子系统在去除容错设计后仍然是一个可以正常运行的系统。3可移植性需求跟每一个子模块(系统配置、会话管理、事件管理、数据传输和日志记录等)均有关联系统能够兼顾IA-32和IA-64平台,所有代码在跨平台的情况下,只需要重新编译即可7 接口设计本部分简单介绍了通信中间件的外部接口和内部接口。7.1 外部接口外部接口主要指的是通信中间件为上层
54、应用提供的API函数接口,主要包括两大类:第一类是直接跟通信有关的建立连接、断开连接、数据发送、数据接收等函数;第二类是辅助的工具性函数如清空主机掩码、往主机掩码加入主机、从主机掩码删除主机、反转主机掩码、输出掩码状态和解析输出错误码等函数。7.1.1 通信相关函数通信相关函数包括以下六个:int COM_connect(const char *daemon_name, int priority, ps_time time_out, mailbox *mbox);与通信守护进程建立连接(会话),其参数分别是守护进程名字(端口号+主机名)、消息优先级(当前保留未使用)、超时时限和建立连接产生的Socket描述符。连接建立成功时返回0,建立失败时返回一个负值(错误码)。int COM_disconnect(mailbox mbox);与通信守护进程断开连接,其参数是建立连接时产生的Socket描述符。正常断开连接时返回0,如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 托管班消防责任制度
- 扬尘治理工作责任制度
- 技术员质量责任制度范本
- 押运队消防安全责任制度
- 挤奶厅岗位责任制度
- 推土机工岗位责任制度
- 攀岩场地责任制度
- 放射科岗位安全责任制度
- 故障注入岗位责任制度
- 教师微腐败责任制度
- GA/T 148-2019法医学病理检材的提取、固定、取材及保存规范
- 《山东省房屋修缮工程消耗量定额》建筑分册交底资料
- 材料科学与工程专业外语文章
- 煤矿安全活动反“三违”培训讲座最终课件
- 保洁培训手册电梯保养
- 工装工具设备管理办法
- 明朝皇帝列表及简介
- 新部编版六年级下册道德与法治全册教案(教学设计)
- 输送血液的泵——心脏PPT课件15(说课)
- 华沙社区自留发展用地合作开发协议
- T∕CEPPEA 5006.1-2021 工程总承包项目文件收集与档案整理规范 第1部分:通则_
评论
0/150
提交评论