一种转发报文的方法及装置的制造方法

文档序号:8475058阅读:173来源:国知局
一种转发报文的方法及装置的制造方法
【技术领域】
[0001]本发明涉及通信领域,尤其涉及一种转发报文的方法及装置。
【背景技术】
[0002]在网络通信技术领域中,经常需要从网络中接收报文,然后根据系统功能对报文进行相应的处理。处理完成后,对于中间设备,报文需要从另一个端口中转发。这就涉及同一个系统中多个网卡间的报文转发技术,在对现有报文转发技术进行研宄的过程中,发现采用基于socket的应用程序实现方法。该方法基于现有操作系统平台,在用户空间中采用socket技术完成对网络报文的接收、处理、转发的过程。在整个过程中,网络报文在到达应用程序之前,需要经过以下处理环节:网卡驱动处理、内核协议栈处理、报文从内核空间到应用空间的拷贝、内核协议栈、网卡驱动。而拷贝是一种很耗系统资源的过程,从而导致报文转发的处理速率低下。

【发明内容】

[0003]本发明实施例提供一种转发报文的方法及装置,用以实现在转发报文的过程中,能够避免将报文从内核空间到应用空间的拷贝,从而在提高报文转发速度的同时,也能够提高系统的资源利用率。
[0004]本发明实施例提供一种转发报文的方法,该方法包括:内核态接收进程将网卡接收到的报文存储于共享内存中并通知用户态进程;
[0005]所述用户态进程将所述共享内存的物理地址映射到所述用户态进程的虚拟地址后,从所述共享内存中提取所述报文并对所述报文进行处理;
[0006]所述用户态进程将处理后的报文存储于所述共享内存中并通知内核态发送进程;
[0007]所述内核态发送进程将所述处理后的报文通过相应的网卡发送。
[0008]较佳的,所述内核态接收进程将网卡接收到的报文存储于共享内存并通知用户态进程,具体为:
[0009]所述内核态接收进程从内存池中申请内存块,将网卡接收到的所述报文存储于所述内存块中,并将所述内存块的地址插入接收队列队尾;
[0010]所述用户态进程轮询所述接收队列,从接收队列头部读取所述内存块的地址,直至所述接收队列为空;
[0011]在所述接收队列为空时,所述用户态进程进入睡眠状态,直至所述接收队列非空时唤醒所述用户态进程。
[0012]较佳的,将所述内存块的地址插入接收队列,具体为:
[0013]根据所述报文的源IP地址和目的IP地址进行哈希运算;
[0014]根据哈希运算后所得到的值,确定内核态接收队列的队列值;
[0015]根据确定的内核接收队列的队列值,将所述报文的内存块地址存储至相应的接收队列中。
[0016]较佳的,所述用户态进程从所述共享内存中提取所述报文并对所述报文进行处理,具体为:所述用户态进程从所述共享内存的接收队列队头中读出存储所述报文的内存块的地址,根据所述内存块的地址到内存池的相应位置处读取所述报文的内容并对所述报文进行处理。
[0017]较佳的,所述用户态进程将处理后的报文存储于所述共享内存中并通知所述内核态发送进程,具体为:
[0018]所述用户态进程将所述处理后的报文的内存块的地址插入到发送队列队尾,并调用系统函数通知所述内核态发送进程。
[0019]较佳的,所述共享内存为所述内核态在初始化时分配的,包括:
[0020]由多内存块组成的内存池;
[0021]用于保存所述内存块的地址的接收队列和发送队列所使用到的内存;
[0022]用于保存所述接收队列的头指针和尾指针以及用于保存所述发送队列的头指针和尾指针所使用到的内存。
[0023]本发明实施例提供一种转发报文的装置,装置包括:
[0024]接收模块,用于指示内核态接收进程将网卡接收到的报文存储于共享内存中并通知用户态进程;
[0025]处理模块,用于在所述用户态进程将所述共享内存的物理地址映射到所述用户态进程的虚拟地址后,从所述共享内存中提取所述报文并对所述报文进行处理;
[0026]通知模块,用于在所述用户态进程将处理后的报文存储于所述共享内存后,通知内核态发送进程;
[0027]发送模块,用于指示所述内核态发送进程将所述处理后的报文通过相应的网卡发送。
[0028]较佳的,所述接收模块,具体用于:
[0029]指示所述内核态接收进程从内存池中申请内存块,将网卡接收到的所述报文存储于所述内存块中,并将所述内存块的地址插入接收队列队尾;
[0030]指示所述用户态进程轮询所述接收队列,从接收队列头部读取所述内存块地址,直至所述接收队列为空;
[0031]在所述接收队列为空时,指示所述用户态进程进入睡眼状态,直至所述接收队列非空时唤醒所述用户态进程。
[0032]较佳的,所述接收模块,具体用于:
[0033]根据所述报文的源IP地址和目的IP地址进行哈希运算;
[0034]根据哈希运算后所得到的值,确定内核态接收队列的队列值;
[0035]根据确定的内核接收队列的队列值,将所述报文的内存块地址存储至相应的接收队列中。
[0036]较佳的,所述处理模块,具体用于:
[0037]指示所述用户态进程从所述共享内存的接收队列队头中读出保存了所述报文的内存块的地址,根据所述内存块地址到内存池中读取所述报文的内容并对所述报文进行处理。
[0038]较佳的,所述通知模块,具体用于:
[0039]指示所述用户态进程将所述处理后的报文的内存块地址插入到发送队列队尾,并调用系统函数通知所述内核态发送进程。
[0040]较佳的,所述共享内存为所述内核态在初始化时分配的,包括:
[0041]由多个所述内存块组成的内存池;
[0042]用于保存所述内存块的地址的接收队列和发送队列所使用到的内存;
[0043]用于保存所述接收队列的头指针和尾指针以及用于保存所述发送队列的头指针和尾指针所使用到的内存。
[0044]上述实施例提供的转发报文的方法及装置,包括:内核态接收进程将网卡接收到的报文存储于共享内存中并通知用户态进程;所述用户态进程将所述共享内存的物理地址映射到所述用户态进程的虚拟地址后,从所述共享内存中提取所述报文并对所述报文进行处理;所述用户态进程将处理后的报文存储于所述共享内存中并通知内核态发送进程;所述内核态发送进程将所述处理后的报文通过相应的网卡发送。可以看出,首先,内核态接收进程将网卡接收到的报文存储于共享内存中;然后,用户态进程将共享内存的物理地址与用户态进程的虚拟地址建立映射关系,用户态进程根据所建立的映射关系对网卡接收到的报文进行处理,并将处理后的报文存储于共享内存中;最后,由内核态发送进程将处理后的报文通过相应的网卡发送,因此,避免了将报文从内核空间到应用空间的拷贝,从而在提高报文转发速度的同时,也能够提高系统的资源利用率。
【附图说明】
[0045]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1