CN102339234B - 一种协议栈运行装置和方法 - Google Patents

一种协议栈运行装置和方法 Download PDF

Info

Publication number
CN102339234B
CN102339234B CN 201110193797 CN201110193797A CN102339234B CN 102339234 B CN102339234 B CN 102339234B CN 201110193797 CN201110193797 CN 201110193797 CN 201110193797 A CN201110193797 A CN 201110193797A CN 102339234 B CN102339234 B CN 102339234B
Authority
CN
China
Prior art keywords
protocol stack
socket layer
descriptor
global profile
module
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN 201110193797
Other languages
English (en)
Other versions
CN102339234A (zh
Inventor
林茂
王佑刚
戴俊文
李永合
罗向征
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Maipu Communication Technology Co Ltd
Original Assignee
Maipu Communication Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Maipu Communication Technology Co Ltd filed Critical Maipu Communication Technology Co Ltd
Priority to CN 201110193797 priority Critical patent/CN102339234B/zh
Publication of CN102339234A publication Critical patent/CN102339234A/zh
Application granted granted Critical
Publication of CN102339234B publication Critical patent/CN102339234B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Communication Control (AREA)
  • Computer And Data Communications (AREA)

Abstract

本发明公开了一种协议栈运行装置和方法,所述装置包括:应用程序进程模块,用于在用户空间中运行应用程序进程;协议栈用户进程模块,用于协议栈独立于应用程序进程运行在用户空间中;套接字层协议代理模块,在系统初始化时注册于内核空间,用于应用程序进程与协议栈用户进程间的通信。所述方法包括:协议栈用户进程独立于应用程序进程运行在用户空间中,并在系统初始化时,在内核空间内注册套接字层协议代理模块;应用程序进程和协议栈用户进程之间通过所述套接字层协议代理模块进行通信。利用本发明,可以提高协议栈的可靠性、信息共享度和兼容性,降低软件平台移植的调试、维护、和开发难度。

Description

一种协议栈运行装置和方法
技术领域
本发明涉及计算机信息处理及通信技术,尤其涉及一种计算机网络协议栈的运行装置和方法。 
背景技术
在计算机信息处理及通信领域,由于嵌入式操作系统不统一,例如目前通常采用的嵌入式操作系统有VxWorks、Unix、Linux等,因此软件平台有时会需要跨操作系统的移植操作,在跨操作系统的移植过程中常常需要做特殊的处理。例如当软件平台从其它操作系统移植到Linux操作系统后,需要将相关协议栈业务移植到Linux网络协议栈上。 
Linux操作系统自身分为两部分,一部分为核心软件,也称作内核空间,另一部分为普通应用程序,这部分称为用户空间。但是,Linux操作系统的协议栈运行在内核空间,当软件平台移植时,将相关协议栈业务移植到Linux的处于内核空间的协议栈上,导致这个软件平台的开发、调试、维护难度很大,同时如果现有的业务是基于伯克利软件套件(BSD,Berkeley SoftwareDistribution)操作系统协议栈的,业务模块无法容易地在两者之间移植。 
所以为了解决这个问题,目前现有的方案通常是将协议栈运行在Linux操作系统的用户空间。但是,现有的方案中,所述协议栈运行在应用程序进程的地址空间内,也就是说每个应用程序进程中都会有一个协议栈,这样就会有很多问题: 
首先,每个应用程序进程都存在协议栈,但是他们之间不能相互访问,导致路由信息、套接字(socket)信息、TCP连接等信息无法共享。 
其次,类似系统调用的读(read)、写(write)、选择(select)操作无法和这些协议栈交互,也就是说这些协议栈不支持这些标准的函数,兼容性不高。
发明内容
有鉴于此,本发明提供一种协议栈运行装置和方法,以提高协议栈的信息共享度和兼容性。 
本发明的技术方案是这样实现的: 
一种协议栈运行装置,包括: 
用于在用户空间中运行应用程序进程的应用程序进程模块; 
用于在用户空间中独立于应用程序进程运行协议栈用户进程的协议栈用户进程模块,所述协议栈用户进程中运行有协议栈; 
套接字层协议代理模块,在系统初始化时注册于内核空间,用于应用程序进程模块的应用程序进程与协议栈用户进程模块的协议栈用户进程间的通信; 
所述套接字层协议代理模块通过标准套接字SOCKET函数接口或标准I/O函数接口与应用程序进程模块的应用程序进程进行通信,通过进程间通信机制与所述协议栈用户进程模块的协议栈用户进程进行通信。 
优选的,所述套接字层协议代理模块用于应用程序进程模块的应用程序进程与协议栈用户进程模块的协议栈用户进程间的通信具体是指,所述套接字层协议代理模块用于将应用程序进程模块的应用程序进程对应某一协议的操作请求转发到协议栈用户进程模块的协议栈用户进程;并用于接收来自协议栈用户进程模块的协议栈用户进程的所述操作请求处理结果或通知事件并进行处理,并将处理结果返回给应用程序进程模块的应用程序进程。 
优选的,所述协议栈用户进程中具有与应用程序进程所调用的标准SOCKET函数接口对应的SOCKET函数接口。 
一种协议栈运行方法,协议栈用户进程独立于应用程序进程运行在用户空间中,并在系统初始化时,在内核空间内注册套接字层协议代理模块;应用程序进程和协议栈用户进程之间通过所述套接字层协议代理模块进行通信;所述套接字层协议代理模块通过标准套接字SOCKET函数接口或标准I/O函数接口与应用程序进程进行通信,通过进程间通信机制与所述协议栈用户进程进行通信。 
优选的,应用程序进程和协议栈用户进程之间通过所述套接字层协议代理模块进行通信的具体步骤如下:A、应用程序进程调用SOCKET函数接口或标准I/O函数接口发起操作请求;B、所述函数接口触发应用程序进程进入内核空间,并将所述操作请求交由套接字层协议代理模块处理;C、所述套接字层协议代理模块将所述操作请求封装为请求消息,并通过进程间通信消息传递给协议栈用户进程;D、所述协议栈用户进程对所述操作请求进行处理,并通过进程间通信消息返回处理结果给所述套接字层协议代理模块;E、所述套接字层协议代理模块将处理结果返回给应用程序进程。
优选的,所述步骤D中,所述协议栈用户进程在当前条件不能满足所述操作请求时,在返回的处理结果中包括需要等待的信息;当套接字层协议代理模块收到的处理结果中包括需要等待的信息时,则暂时不封装和返回处理结果给应用程序进程,而是阻塞应用程序进程等待通知事件;所述协议栈用户进程在当前条件满足所述操作请求时,向所述套接字层协议代理模块返回通知事件;所述套接字层协议代理模块将该通知事件中对应的应用程序进程唤醒。 
优选的,所述步骤A中,在应用程序进程发起操作请求时,首先判断是否存在对应的全局文件描述符,如是则直接调用SOCKET函数接口或标准I/O函数接口发起操作请求,所述操作请求中包含对应的全局文件描述符;否则执行如下步骤: 
A11、应用程序进程向套接字层协议代理模块请求创建全局文件描述符; 
A12、套接字层协议代理模块通过进程间通信机制发送文件描述符创建请求到所述协议栈用户进程; 
A13、所述协议栈用户进程根据文件描述符创建请求生成一个唯一的私有文件描述符,并将所述私有文件描述符返回给所述套接字层协议代理模块; 
A14、套接字层协议代理模块生成一个对应的全局文件描述符并将该全局文件描述符和所述私有文件描述符绑定存储,返回该全局文件描述符给应用程序进程; 
之后执行步骤A至步骤E,应用程序进程发起包含有全局文件描述符的操作请求;其中:应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述私有文件描述符标识连接信息,套接字层协议代理模块根据所保存的绑定关系,将所述私有文件描述符和所述全局文件描述符进行转换。 
优选的,所述步骤A中,在应用程序进程发起操作请求时,首先判断是否 存在对应的全局文件描述符,如是则直接调用SOCKET函数接口或标准I/O函数接口发起操作请求,所述操作请求中包含对应的全局文件描述符;否则执行如下步骤: 
A21、应用程序进程向套接字层协议代理模块发送全局文件描述符创建请求; 
A22、套接字层协议代理模块根据收到的全局文件描述符创建请求生成一个全局文件描述符; 
A23、套接字层协议代理模块通过进程间通信机制发送文件描述符创建请求和生成的全局文件描述符到所述协议栈用户进程; 
A24、所述协议栈用户进程根据收到的文件描述符创建请求生成对应的唯一的私有文件描述符;并将该私有文件描述符和收到的全局文件描述符绑定存储;套接字层协议代理模块将全局文件描述符返回给应用程序进程; 
之后执行步骤A至步骤E,应用程序进程发起包含有全局文件描述符的操作请求;其中:应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述全局文件描述符标识连接信息,协议栈用户进程根据所保存的绑定关系,将所述全局文件描述符和私有文件描述符进行转换,以私有文件描述符标识连接信息。 
优选的,所述步骤A中,在应用程序进程发起操作请求时,首先判断是否存在对应的全局文件描述符,如是则直接调用SOCKET函数接口或标准I/O函数接口发起操作请求,所述操作请求中包含对应的全局文件描述符;否则执行如下步骤: 
A31、应用程序进程向套接字层协议代理模块发送全局文件描述符创建请求; 
A32、套接字层协议代理模块根据收到的全局文件描述符创建请求生成一个全局文件描述符; 
A33、套接字层协议代理模块通过进程间通信机制发送文件描述符创建请求和生成的全局文件描述符到所述协议栈用户进程; 
A34、所述协议栈用户进程根据收到的文件描述符创建请求,将收到的全局文件描述符传入对应的SOCKET函数接口中,并将该全局文件描述符保存在数据结构中;所述套接字层协议代理模块将全局文件描述符返回给应用程序进程; 
之后执行步骤A至步骤E,应用程序进程发起包含有全局文件描述符的操作请求;其中:应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述全局文件描述符标识连接信息,协议栈用户进程中也用所传入的全局文件描述符标识连接信息。 
优选的,该方法进一步包括:判断应用程序进程采用的通信协议是否为所述协议栈支持且所述套接字层协议代理模块注册过的协议,如果是则利用所述套接字层协议代理模块进行通信;否则不利用所述套接字层协议代理模块进行通信。 
与现有技术相比,本发明将协议栈运行在Linux操作系统的处于用户空间的独立用户进程之中,并通过在内核空间注册套接字层协议代理模块,通过该套接字层协议代理模块实现应用程序与协议栈用户进程之间的通信。因此本发明可以使不同的应用程序使用相同的协议栈进程,可以解决路由信息、socket信息、TCP连接等信息无法共享的问题,提高协议栈的信息共享度;另外,由于协议栈运行在独立进程中,因此可以支持系统调用的操作,提高了协议栈的兼容性。 
由于本发明的协议栈运行在用户空间,因此能够降低软件平台移植的调试、维护、和开发难度。由于协议栈用户进程独立于应用程序,因此协议栈出现故障后能够单独重新启动,避免影响应用程序和操作系统。 
进一步的,本发明还利用内核管理文件描述符(FD,File Desocketriptor),标准的I/O函数接口都可以操作该FD保证应用程序不做修改,另外使用内核管理FD之后,系统管理操作可以保持和前原有Linux操作系统的一致性,例如dup函数可以复制一个现存的FD,该功能无需特殊修改即可支持。另外,本发明所述协议栈用户进程中具有与应用程序所调用的标准SOCKET函数接口对应的SOCKET函数接口,相当于使用了双层套接字层结构,避免对Linux原生套接字层的修改,也避免了对协议栈套接字层的修改。另外,本发明通过注册操作,注册协议栈支持的特定协议,并利用所述套接字层协议代理模块对这些特定协议进行通信,因此运行在用户空间独立进程中的协议栈和Linux原生的协议栈并存,不需要对Linux原有协议栈进行修改。因此,综上所述,采用本发明后,减少了对原有Linux操作系统及应用程序的修改,进一步降低软件的调试、维护和开发难度。
另外,本发明还在应用进程和协议栈进程之间采用共享内存的方式提高效率。 
附图说明
图1为本发明所述协议栈运行的示意图; 
图2为本发明所述协议栈运行装置的另一示意图; 
图3为本发明所述方法创建socket的一种流程图; 
图4为本发明所述应用程序发起请求操作以及接收通知事件的一种流程图。 
具体实施方式
下面结合附图及具体实施例对本发明再作进一步详细的说明。 
图1为本发明所述协议栈运行装置的一种示意图。参见图1,该协议栈运行装置包括: 
应用程序进程模块,用于在用户空间中运行应用程序进程; 
协议栈用户进程模块101,用于在用户空间中独立于应用程序进程运行协议栈用户进程,所述协议栈用户进程中运行有协议栈; 
套接字层协议代理模块103,在系统初始化时注册于内核空间,用于应用程序进程模块的应用程序进程与协议栈用户进程模块的协议栈用户进程间的通信。 
套接字层协议代理模块103,通过标准SOCKET函数接口或标准I/O函数接口102与应用程序进程模块的应用程序进行通信,通过进程间通信机制与所述协议栈用户进程模块101的协议栈用户进程进行通信。所述标准SOCKET函数接口或标准I/O函数接口102,位于用户空间且被应用程序调用。
所述套接字层协议代理模块用于将应用程序进程模块的应用程序进程对应某一协议的操作请求转发到协议栈用户进程模块的协议栈用户进程;并用于接收来自协议栈用户进程模块的协议栈用户进程的所述操作请求处理结果或通知事件并进行处理。 
如图1所示,所述协议栈用户进程模块101中具有与应用程序进程所调用的标准SOCKET函数接口对应的SOCKET函数接口,相当于使用了双层套接字层结构,避免对Linux原生套接字层架构的修改,也避免了对用户空间协议栈socket的修改。 
图2为本发明所述协议栈运行装置的另一示意图。如图2所示,本发明所述套接字层协议代理模块可以采用阻塞等待的方式处理协议栈用户进程模块101返回的处理结果,因此该装置还进一步包括发送通知模块104,用于将协议栈用户进程的通知事件发送给所述套接字层协议代理模块以唤醒阻塞队列中阻塞进程。 
基于所述的协议栈运行装置,本发明公布了一种协议栈运行方法,协议栈用户进程独立于应用程序进程运行在用户空间中,并在内核空间内注册套接字层协议代理模块,该注册操作可以在操作系统初始化时进行;应用程序和协议栈用户进程之间通过所述套接字层协议代理模块进行通信,其中应用程序和所述套接字层协议代理模块之间通过标准SOCKET函数接口或标准I/O函数接口进行通信,所述套接字层协议代理模块和所述协议栈用户进程之间通过进程间通信机制进行通信,具体步骤如下: 
A、应用程序进程调用SOCKET函数接口或标准I/O函数接口发起操作请求; 
B、所述函数接口触发应用程序进程进入内核空间,并将所述操作请求交由套接字层协议代理模块处理; 
C、所述套接字层协议代理模块将所述操作请求封装为请求消息,并通过进程间通信消息传递给协议栈用户进程; 
D、所述协议栈用户进程对所述操作请求进行处理,并通过进程间通信消息返回处理结果给所述套接字层协议代理模块; 
E、所述套接字层协议代理模块将处理结果返回给应用程序进程。 
应用程序如果需要通过协议栈与网络上的其它应用程序通信而发起操作请求时,首先判断是否存在对应的socket,更具体一点就是判断是否存在全局文件描述符,如果存在则直接调用SOCKET函数接口或标准I/O函数接口发起操作请求,所述操作请求中包含对应的全局文件描述符,否则需要请求创建socket。图3为本发明所述方法创建socket的一种流程图,参见图3,该流程包括: 
步骤301、应用程序调用socket函数接口,向套接字层协议代理模块发送用于创建socket的请求,即发送全局文件描述符创建请求,用于请求创建全局文件描述符。 
此处,为了实现本发明所述运行在用户空间独立进程中的协议栈和Linux原生的协议栈并存,可以进一步在步骤301之前判断应用程序采用的通信协议是否为所述协议栈支持且所述套接字层协议代理模块注册过的协议,如果是则利用所述套接字层协议代理模块进行通信;否则不利用所述套接字层协议代理模块进行通信,而是利用现有的方法调用Linux操作系统原生协议栈进行通信。从而实现运行在用户空间独立进程中的协议栈和Linux原生的协议栈并存,不需要对Linux原有协议栈进行修改,降低了开发、调试和维护难度。 
步骤302、创建socket的请求被套接字层协议代理模块获取,套接字层协议代理模块创建协议相关管理结构并且封装创建socket的请求消息,并将该请求消息通过进程间通信机制发送到协议栈用户进程进行处理,此时套接字层协议代理模块被阻塞等待结果。 
此处所述创建socket请求消息的内容包括: 
协议族(domain),用于指定应用程序使用的通信协议的协议族,例如对于TCP/IP协议族,该参数置AF_INET。 
类型(type),用于指定要创建的套接字类型。其中,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW。 
协议号(protocol),用于指定应用程序所使用的通信协议的协议号。 
步骤303~304、协议栈用户进程收到通过进程间机制收到所述创建socket的请求消息后,进行解封装后,调用协议栈内部对应的socket函数接口创建socket,生成该socket对应的文件描述符,该文件描述符可命名为私有文件描述符,又由于该文件描述符仅仅在用户空间的协议栈用户进程内部使用,也可以称之为内部文件描述符,除此之外还需要创建协议控制块(PCB)等必要信息;然后将所述私有文件描述符封成进程间消息返回给套接字层协议代理模块。所述私有文件描述符只要唯一即可,可以是整数、小数、字符串等。 
步骤305~306、套接字层协议代理模块收到来自协议栈用户进程的响应消息后被唤醒,将所述私有文件描述符保存在之前创建的一私有结构中,同时生成一个全局文件描述符,并与所述私有文件描述符绑定存储在所述私有结构中,使得所述私有文件描述符和全局文件描述符具有映射关系。之后套接字层协议代理模块将创建socket的结果返回给应用程序,其中包括所述全局文件描述符。 
步骤307、应用程序和协议栈用户进程利用所创建的socket进行通信,即应用程序进程发起包含有全局文件描述符的操作请求;其中:应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述私有文件描述符标识连接信息,套接字层协议代理模块根据所保存的绑定关系,将所述私有文件描述符和所述全局文件描述符进行转换。 
通过上述流程,应用程序得到的全局文件描述符和协议栈的私有文件描述符通过套接字层协议代理模块的私有结构形成一个对应关系。利用这个对应关系就可以方便的将全局文件描述符转换成私有文件描述符,使用私有文件描述符在协议栈用户进程中进行报文收发/控制操作;也可以将私有文件描述符转化得到全局文件描述符,这样套接字层协议代理模块在收到协议栈用户进程通知的时候能够找到对应的应用程序进程进行通知操作。 
在本发明的另一种实施例中,所述全局文件描述符也可以在步骤302中由套接字层协议模块生成,并发送给协议栈用户进程,在协议栈用户进程中形成私有文件描述符和全局文件描述符之间的对应关系,由协议栈用户进程进行私有文件描述符和全局文件描述符之间的转换。 
本发明中,所述全局文件描述符的生成位置和全局文件描述符与私有文件描述符对应关系的存储位置可以由本领域技术人员根据需要选择是在套接字层协议代理模块中还是在协议栈用户进程中。 
上述两种生成私有文件描述符的实施例,由于全局文件描述符和私有文件描述符之间的转换,因此协议栈用户进程中对应的原生的SOCKET函数接口不必进行修改,可以直接使用。另外,在另一种实施例中,也可以不必生成所述私有文件描述符,而是直接利用全局文件描述符同样可以完成本发明的目的,该全局文件描述符在所述套接字层协议代理模块生成后,在该实施例中需要修改协议栈用户进程中的SOCKET函数接口,如在SOCKET函数接口中不但传入协议族(domain)、类型(type)、和协议号(protocol)等参数,还要包括一全局文件描述符参数(globle-file-descriptor),接下来在整个连接信息的创建过程中,在生成文件描述符部分还需要做修改,将传入的所述全局文件描述符保存在数据结构中,并且返回该全局文件描述符。 
所述应用程序进程和协议栈用户进程之间利用所创建的全局的文件描述符及私有的文件描述符进行通信,主要包括应用程序主动发起请求操作的流程以及协议栈发出通知操作的流程。 
图4为本发明所述应用程序发起请求操作以及接收通知事件的一种流程图。参见图4,该流程包括: 
步骤401、在应用程序进程发起操作请求时,首先判断是否存在对应的全局文件描述符,由于上述图3的流程已经创建了socket并返回了全局文件描述符,因此此处通过标准SOCKET函数接口或者标准I/O函数接口(例如read/write)发起操作请求,该操作请求中包括所创建socket的全局文件描述符,以该全局文件描述符标识连接信息。所述函数接口调用会触发应用程序 进入内核空间,并且将操作请求交由对应的套接字层协议代理模块处理。 
步骤402~403、套接字层协议代理模块根据私有结构中所保存的全局文件描述符和私有文件描述符之间的绑定关系,将操作请求中的所述全局文件描述符转换为对应的私有文件描述符,以该私有文件描述符标识连接信息,将该操作请求封装成操作请求消息,通过进程间通信机制将该操作请求消息传递给协议栈用户进程。此时套接字层协议代理模块阻塞等待协议栈返回结果。在一种优选实施方式中,为了提高效率,消息及其内部封装的数据可以使用共享内存的方式进行传递以减少内存拷贝。 
步骤404、协议栈用户进程收到操作请求消息之后,将消息解封装,根据其中的私有文件描述符将该操作请求交给对应的处理流程进行处理。此时的协议栈处理不能为阻塞方式,不管是否成功必须立刻将结果返回给套接字层协议代理模块。 
步骤405、协议栈用户进程处理完请求之后封装包括该私有文件描述符的处理结果,将该处理结果返回到所述套接字层协议代理模块。 
步骤406~407、套接字层协议代理模块收到返回的处理结果后,根据私有结构中所保存的私有文件描述符和全局文件描述符的绑定关系,将该处理结果中的所述私有文件描述符转换为对应的全局文件描述符。之后根据具体情况进行处理:如果返回的是成功的处理结果,那么将处理结果返回给应用程序;如果返回的是失败的处理结果,那么设置错误号之后将处理结果返回给应用程序以表示处理失败。 
在另一种情况中,如果所述协议栈用户进程在当前条件不能满足所述操作请求时,在返回的处理结果中包括需要等待的信息。例如当应用程序调用recv函数接口发出期望接收数据的请求时,所述协议栈用户进程收到请求后会判断当前条件下是否有数据可以返回,如果没有数据则会返回需要等待的信息。因此,如果套接字层协议代理模块收到的处理结果中包括需要等待的信息,则暂时不封装和返回处理结果给应用程序,而是将对应的应用程序进程阻塞等待。具体处理步骤请参见以下步骤408~步骤411。 
步骤408、在需要等待的情况下,套接字层协议代理模块将对应的应用程序进程阻塞等待,等待协议栈用户进程的通知事件。 
步骤409~410、所述协议栈用户进程在当前条件满足所述操作请求时,封装包含所述私有文件描述符的通知事件,将该通知事件返回到所述套接字层协议代理模块。例如,当底层接收到报文并送入协议栈进程,如果判断该报文为本机报文后则满足所述recv函数接口请求,因此将报文送入套接字层的缓冲队列,并且向套接字层协议代理模块发送包含该私有文件描述符的通知事件,通知对应的进程唤醒。 
步骤411、所述套接字层协议代理模块将收到的通知事件中的私有文件描述符转换为对应的全局文件描述符,唤醒对应的应用程序进程,返回步骤403重新发送所述操作请求到所述协议栈用户进程,并继续执行后续步骤。即,继续等待返回结果,如果返回的是成功的处理结果,那么该次请求成功;如果返回的是失败的处理结果则向应用程序返回错误号;如果仍然需要阻塞等待,那么继续阻塞等待通知事件。 
在另一实施例中,如果所述全局文件描述符和私有文件描述符的对应关系保存在所述协议栈用户进程中,则应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块直接将包含全局文件描述符的操作请求发送给协议栈用户进程,由协议栈用户进程根据所保存的绑定关系,将所述全局文件描述符和私有文件描述符进行转换,以私有文件描述符标识连接信息,并且协议栈用户进程返回给套接字层协议代理模块的处理结果中包括的是全局文件描述符。 
在另一实施例中,如果只使用全局文件描述符标识连接信息,则应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述全局文件描述符标识连接信息,协议栈用户进程中的SOCKET函数接口以及下层协议也用所传入的全局文件描述符标识连接信息。 
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。 

Claims (10)

1.一种协议栈运行装置,包括用于在用户空间中运行应用程序进程的应用程序进程模块,其特征在于,还包括:
用于在用户空间中独立于应用程序进程运行协议栈用户进程的协议栈用户进程模块,所述协议栈用户进程中运行有协议栈;
套接字层协议代理模块,在系统初始化时注册于内核空间,用于应用程序进程模块的应用程序进程与协议栈用户进程模块的协议栈用户进程间的通信;
所述套接字层协议代理模块通过标准套接字SOCKET函数接口或标准I/O函数接口与应用程序进程模块的应用程序进程进行通信,通过进程间通信机制与所述协议栈用户进程模块的协议栈用户进程进行通信。
2.根据权利要求1所述的装置,其特征在于,所述套接字层协议代理模块用于应用程序进程模块的应用程序进程与协议栈用户进程模块的协议栈用户进程间的通信具体是指,所述套接字层协议代理模块用于将应用程序进程模块的应用程序进程对应某一协议的操作请求转发到协议栈用户进程模块的协议栈用户进程;并用于接收来自协议栈用户进程模块的协议栈用户进程的所述操作请求处理结果或通知事件并进行处理,并将处理结果返回给应用程序进程模块的应用程序进程。
3.根据权利要求1或2所述的装置,其特征在于,所述协议栈用户进程中具有与应用程序进程所调用的标准SOCKET函数接口对应的SOCKET函数接口。
4.一种协议栈运行方法,其特征在于,协议栈用户进程独立于应用程序进程运行在用户空间中,并在系统初始化时,在内核空间内注册套接字层协议代理模块;应用程序进程和协议栈用户进程之间通过所述套接字层协议代理模块进行通信;
所述套接字层协议代理模块通过标准套接字SOCKET函数接口或标准I/O函数接口与应用程序进程进行通信,通过进程间通信机制与所述协议栈用户进 程进行通信。
5.根据权利要求4所述的方法,其特征在于,应用程序进程和协议栈用户进程之间通过所述套接字层协议代理模块进行通信的具体步骤如下: 
A、应用程序进程调用SOCKET函数接口或标准I/O函数接口发起操作请求; 
B、所述函数接口触发应用程序进程进入内核空间,并将所述操作请求交由套接字层协议代理模块处理; 
C、所述套接字层协议代理模块将所述操作请求封装为请求消息,并通过进程间通信消息传递给协议栈用户进程; 
D、所述协议栈用户进程对所述操作请求进行处理,并通过进程间通信消息返回处理结果给所述套接字层协议代理模块; 
E、所述套接字层协议代理模块将处理结果返回给应用程序进程。 
6.根据权利要求5所述的方法,其特征在于,所述步骤D中, 
所述协议栈用户进程在当前条件不能满足所述操作请求时,在返回的处理结果中包括需要等待的信息;当套接字层协议代理模块收到的处理结果中包括需要等待的信息时,则暂时不封装和返回处理结果给应用程序进程,而是阻塞应用程序进程等待通知事件; 
所述协议栈用户进程在当前条件满足所述操作请求时,向所述套接字层协议代理模块返回通知事件;所述套接字层协议代理模块将该通知事件中对应的应用程序进程唤醒。 
7.根据权利要求5所述的方法,其特征在于,所述步骤A中,在应用程序进程发起操作请求时,首先判断是否存在对应的全局文件描述符,如是则直接调用SOCKET函数接口或标准I/O函数接口发起操作请求,所述操作请求中包含对应的全局文件描述符;否则执行如下步骤: 
A11、应用程序进程向套接字层协议代理模块请求创建全局文件描述符; 
A12、套接字层协议代理模块通过进程间通信机制发送文件描述符创建请求到所述协议栈用户进程; 
A13、所述协议栈用户进程根据文件描述符创建请求生成一个唯一的私有文件描述符,并将所述私有文件描述符返回给所述套接字层协议代理模块; 
A14、套接字层协议代理模块生成一个对应的全局文件描述符并将该全局文件描述符和所述私有文件描述符绑定存储,返回该全局文件描述符给应用程序进程; 
之后执行步骤A至步骤E,应用程序进程发起包含有全局文件描述符的操作请求;其中:应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述私有文件描述符标识连接信息,套接字层协议代理模块根据所保存的绑定关系,将所述私有文件描述符和所述全局文件描述符进行转换。 
8.根据权利要求5所述的方法,其特征在于,所述步骤A中,在应用程序进程发起操作请求时,首先判断是否存在对应的全局文件描述符,如是则直接调用SOCKET函数接口或标准I/O函数接口发起操作请求,所述操作请求中包含对应的全局文件描述符;否则执行如下步骤: 
A21、应用程序进程向套接字层协议代理模块发送全局文件描述符创建请求; 
A22、套接字层协议代理模块根据收到的全局文件描述符创建请求生成一个全局文件描述符; 
A23、套接字层协议代理模块通过进程间通信机制发送文件描述符创建请求和生成的全局文件描述符到所述协议栈用户进程; 
A24、所述协议栈用户进程根据收到的文件描述符创建请求生成对应的唯一的私有文件描述符;并将该私有文件描述符和收到的全局文件描述符绑定存储;套接字层协议代理模块将全局文件描述符返回给应用程序进程; 
之后执行步骤A至步骤E,应用程序进程发起包含有全局文件描述符的操作请求;其中:应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述全局文件描述符标识连接信息,协议栈用户进程根据所保存的绑定关系,将所述全局文件描述符和私有文件描述符进行转换,以私有文件描述符标识连接信 息。 
9.根据权利要求5所述的方法,其特征在于,所述步骤A中,在应用程序进程发起操作请求时,首先判断是否存在对应的全局文件描述符,如是则直接调用SOCKET函数接口或标准I/O函数接口发起操作请求,所述操作请求中包含对应的全局文件描述符;否则执行如下步骤: 
A31、应用程序进程向套接字层协议代理模块发送全局文件描述符创建请求; 
A32、套接字层协议代理模块根据收到的全局文件描述符创建请求生成一个全局文件描述符; 
A33、套接字层协议代理模块通过进程间通信机制发送文件描述符创建请求和生成的全局文件描述符到所述协议栈用户进程; 
A34、所述协议栈用户进程根据收到的文件描述符创建请求,将收到的全局文件描述符传入对应的SOCKET函数接口中,并将该全局文件描述符保存在数据结构中;所述套接字层协议代理模块将全局文件描述符返回给应用程序进程; 
之后执行步骤A至步骤E,应用程序进程发起包含有全局文件描述符的操作请求;其中:应用程序进程和套接字层协议代理模块之间利用所述全局文件描述符标识连接信息,套接字层协议代理模块和协议栈用户进程之间利用所述全局文件描述符标识连接信息,协议栈用户进程中也用所传入的全局文件描述符标识连接信息。 
10.根据权利要求4所述的方法,其特征在于,该方法进一步包括:判断应用程序进程采用的通信协议是否为所述协议栈支持且所述套接字层协议代理模块注册过的协议,如果是则利用所述套接字层协议代理模块进行通信;否则不利用所述套接字层协议代理模块进行通信。 
CN 201110193797 2011-07-12 2011-07-12 一种协议栈运行装置和方法 Active CN102339234B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 201110193797 CN102339234B (zh) 2011-07-12 2011-07-12 一种协议栈运行装置和方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 201110193797 CN102339234B (zh) 2011-07-12 2011-07-12 一种协议栈运行装置和方法

Publications (2)

Publication Number Publication Date
CN102339234A CN102339234A (zh) 2012-02-01
CN102339234B true CN102339234B (zh) 2013-04-17

Family

ID=45514978

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 201110193797 Active CN102339234B (zh) 2011-07-12 2011-07-12 一种协议栈运行装置和方法

Country Status (1)

Country Link
CN (1) CN102339234B (zh)

Families Citing this family (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102622557B (zh) * 2012-02-22 2014-12-24 清华大学 x协议图形用户系统及将该系统写入内核态的方法
CN103731291A (zh) * 2012-10-16 2014-04-16 无锡云捷科技有限公司 一种网络服务器池系统数据传输结构及其程序开发方法
CN102984025B (zh) * 2012-11-23 2015-09-30 华为技术有限公司 网关设备虚拟隧道性能的测试方法、装置及系统
CN103268305B (zh) * 2013-04-23 2017-07-25 上海斐讯数据通信技术有限公司 一种oam协议栈移植方法
CN108268328B (zh) 2013-05-09 2022-04-22 华为技术有限公司 数据处理装置及计算机
CN103905466B (zh) * 2014-04-22 2017-01-11 郭伟 一种存储系统数据访问控制系统及其方法
CN104092570B (zh) * 2014-07-08 2018-01-12 重庆金美通信有限责任公司 一种在linux操作系统上实现路由节点模拟的方法
CN105357266B (zh) * 2015-09-30 2018-11-16 山东乾云启创信息科技股份有限公司 适合多种场景的socket通信与进程管理通用平台及方法
CN107872431B (zh) * 2016-09-27 2021-11-12 中兴通讯股份有限公司 一种数据收发方法、装置及基站
CN107026767B (zh) * 2017-03-30 2019-10-18 上海七牛信息技术有限公司 业务协议指标数据收集方法及系统
CN110535813B (zh) * 2018-05-25 2022-04-22 网宿科技股份有限公司 内核态协议栈与用户态协议栈并存处理方法和装置
CN109189718B (zh) * 2018-09-04 2020-07-10 上海睿赛德电子科技有限公司 一种支持多种网络接口的套接字组件及方法
CN109684232B (zh) * 2018-10-23 2021-09-14 许继集团有限公司 一种嵌入式协议栈内存管理方法
CN111176855B (zh) * 2018-11-09 2023-10-27 微软技术许可有限责任公司 在用户空间中建立线程之间的队列
CN111182008B (zh) 2018-11-09 2023-03-07 微软技术许可有限责任公司 在用户空间中建立套接字连接
CN111580792B (zh) * 2020-04-29 2022-07-01 上海航天计算机技术研究所 一种基于操作系统的高可靠星载软件架构设计方法
CN112346792B (zh) * 2020-06-11 2021-09-21 广州锦行网络科技有限公司 一种基于Linux系统的端口复用方法
CN111740972B (zh) * 2020-06-15 2022-06-21 中国第一汽车股份有限公司 一种通信协议栈信息的更新方法、装置、设备及存储介质
CN112637329B (zh) * 2020-12-21 2022-08-23 网络通信与安全紫金山实验室 一种多应用程序的标识方法、装置、设备及存储介质
CN113505007A (zh) * 2021-07-12 2021-10-15 北京鲸鲮信息系统技术有限公司 基于Linux系统的协议栈数据传输方法、计算机设备和存储介质
CN114928660B (zh) * 2022-05-16 2023-10-31 北京计算机技术及应用研究所 一种嵌入式操作系统透明进程间通信的方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1313562A (zh) * 2001-05-15 2001-09-19 北京慧讯信息技术有限公司 嵌入式开放平台的体系结构
CN1466328A (zh) * 2002-09-18 2004-01-07 联想(北京)有限公司 节点装置及其实现家庭网络中控制子网设备间互通的方法
CN1725757A (zh) * 2004-07-21 2006-01-25 三星电子株式会社 管理和检查套接字连接
CN101087314A (zh) * 2007-05-15 2007-12-12 华为技术有限公司 一种应用程序跨进程使用套接字服务的系统及方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1313562A (zh) * 2001-05-15 2001-09-19 北京慧讯信息技术有限公司 嵌入式开放平台的体系结构
CN1466328A (zh) * 2002-09-18 2004-01-07 联想(北京)有限公司 节点装置及其实现家庭网络中控制子网设备间互通的方法
CN1725757A (zh) * 2004-07-21 2006-01-25 三星电子株式会社 管理和检查套接字连接
CN101087314A (zh) * 2007-05-15 2007-12-12 华为技术有限公司 一种应用程序跨进程使用套接字服务的系统及方法

Also Published As

Publication number Publication date
CN102339234A (zh) 2012-02-01

Similar Documents

Publication Publication Date Title
CN102339234B (zh) 一种协议栈运行装置和方法
US10700979B2 (en) Load balancing for a virtual networking system
US11146665B2 (en) Methods and apparatus for sharing and arbitration of host stack information with user space communication stacks
JP4503225B2 (ja) 適応ディスパッチャを有する仮想ネットワーク
CN111131193B (zh) 支持多协议异构非代码侵入的分布式服务治理的方法
US7899047B2 (en) Virtual network with adaptive dispatcher
EP0485252B1 (en) Apparatus and method for providing decoupling of data exchange details for providing high performance communication between software processes
US5257369A (en) Apparatus and method for providing decoupling of data exchange details for providing high performance communication between software processes
WO2017113231A1 (zh) 一种报文传输的方法、装置和系统
CN106663033B (zh) 在事务中间件机器环境支持绕域和代理模型并更新服务信息以跨域消息传送的系统和方法
US20110153834A1 (en) Transparent Recovery of Transport Connections Using Packet Translation Techniques
RU2496278C2 (ru) Способ связи между платформами
CN101764843A (zh) 远程过程调用的处理方法、系统及客户端、服务器
CN112631788B (zh) 数据传输方法及数据传输服务器
WO2009097776A1 (zh) 一种实现业务升级的系统、装置及方法
US9438670B2 (en) Data replication for a virtual networking system
AU2015369925A1 (en) Computer readable storage media for dynamic service deployment and methods and systems for utilizing same
JP2023543831A (ja) マイクロサービスベースのサービスメッシュシステムおよびサービス指向アーキテクチャ管理方法
US20240039923A1 (en) Method and apparatus for deploying network device, device, system, and storage medium
Khan et al. Software architecture and algorithm for reliable RPC for geo-distributed mobile computing systems
US20080056263A1 (en) Efficient transport layer processing of incoming packets
CN110875910B (zh) 一种获取网络传输信息的方法、装置及系统
CN115208739B (zh) 跨多网络区对接方法及安全运维区对接单向网络区的方法
WO2022022313A1 (zh) 传输路由信息的方法、装置和通信系统
WO2024114645A1 (zh) 一种虚拟化网络功能vnf的实例化方法及装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant