发明内容
本申请提供一种获取网络传输信息的方法、装置及系统,以解决现有技术中用户获取内核的网路传输信息效率低下的问题。
本申请提供的获取网络传输信息的方法,包括:
用户进程构建用于获取网络传输信息的请求信息;
所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;
所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。
可选的,还包括:
所述用户进程将所述netlink文件描述符注册到监控线程;
所述用户进程获取所述监控线程发出的网络传输信息更新通知;
根据所述网络传输信息更新通知,获取更新的网络传输信息。
可选的,还包括:
在所述用户进程构建用于获取网络传输信息的请求信息之前,所述用户进程调用系统函数;
所述系统函数用于所述内核进程的网络传输信息的更新。
可选的,还包括:
所述用户进程获取所述netlink文件描述符;
所述用户进程将所述文件描述符的地址类型设置为第一地址类型;
所述用户进程将所述文件描述符的消息类型设置为第一消息类型。
可选的,所述用户进程构建用于获取网络传输信息的请求信息,包括:
所述用户进程将所述请求信息的属性标志设置为第一属性标志;
所述用户进程将所述请求信息的请求类型设置为第一请求类型。
可选的,所述网络传输信息包括route表、arp表中的至少一种。
可选的,所述用户进程将所述netlink文件描述符注册到监控线程,包括:
将所述netlink文件描述符的读事件注册到所述监控线程中的epoll驱动中,所述epoll驱动用于支持所述监控线程的并发处理。
本申请还提供一种获取网络传输信息的装置,包括:
构建单元,用于用户进程构建用于获取网络传输信息的请求信息;
发送单元,用于所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;
获取单元,用于所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。
可选的,还包括:
注册单元,用于所述用户进程将所述netlink文件描述符注册到监控线程;
通知获取单元,用于所述用户进程获取所述监控线程发出的网络传输信息更新通知;
信息获取单元,用于根据所述网络传输信息更新通知,获取更新的网络传输信息。
可选的,还包括:
调用单元,用于在所述用户进程构建用于获取网络传输信息的请求信息之前,所述用户进程调用系统函数;
设置单元,用于设置所述系统函数,所述系统函数用于所述内核进程的网络传输信息的更新。
可选的,还包括:
获取单元,用于所述用户进程获取所述netlink文件描述符;
第一设置单元,用于所述用户进程将所述文件描述符的地址类型设置为第一地址类型;
第二设置单元,用于所述用户进程将所述文件描述符的消息类型设置为第一消息类型。
可选的,所述构建单元,具体用于:
所述用户进程将所述请求信息的属性标志设置为第一属性标志;
所述用户进程将所述请求信息的请求类型设置为第一请求类型。可选的,所述网络传输信息包括route表、arp表中的至少一种。
可选的,所述注册单元,具体用于:
将所述netlink文件描述符的读事件注册到所述监控线程中的epoll驱动中,所述epoll驱动用于支持所述监控线程的并发处理。
本申请提供
一种包括特定设备的装置,所述装置包括:
至少一个处理器;
存储器,其用于存储程序,所述处理器执行所述程序以用于:
用户进程构建用于获取网络传输信息的请求信息;
所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;
所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。
本申请提供一种计算机可读取存储介质,其上存储有计算机程序,该程序被处理器执行时,实现以下步骤:
用户进程构建用于获取网络传输信息的请求信息;
所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;
所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。
本申请提供一种计算设备通信系统,包括至少两个计算设备,其中至少一个计算设备用于运行至少一个用户进程和至少一个内核进程;
所述用户进程用于,构建用于获取网络传输信息的请求信息;将所述请求信息通过用于所述用户进程与所述内核进程通信的netlink文件描述符发送至所述内核进程;获取所述内核进程通过所述netlink文件描述符返回的网络传输信息;
所述内核进程用于,通过用于所述用户进程与所述内核进程通信的netlink文件描述符接收所述用户进程发送的请求信息;通过所述netlink文件描述符返回所述请求信息对应的网络传输信息。
可选的,所述用户进程还用于,将所述netlink文件描述符注册到监控线程;获取所述监控线程发出的网络传输信息更新通知;根据所述网络传输信息更新通知,获取更新的网络传输信息;
所述内核进程还用于,向所述监控线程通知所述内核进程的网络传输信息的更新;向所述用户进程提供更新的网络传输信息。
可选的,所述用户进程,还用于,在所述用户进程构建用于获取网络传输信息的请求信息之前,调用系统函数;所述系统函数用于所述内核进程的网络传输信息的更新;
所述内核进程还用于,根据所述用户进程调用的系统函数,更新所述内核进程的网络传输信息。
本申请还提供一种提供网络传输信息的方法,其特征在于,包括:
内核进程通过用于用户进程与所述内核进程通信的netlink文件描述符接收所述用户进程发送的获取网络传输信息的请求信息;
所述内核进程将所述网络传输信息通过所述netlink文件描述符提供给所述用户进程。
可选的,还包括:
所述内核进程将所述网络传输信息的更新通知监控线程;
所述内核进程将更新后的网络传输信息通过所述netlink文件描述符提供给所述用户进程。
可选的,还包括:
根据用户进程调用的系统函数,获取更新的网络传输信息;
将所述更新的网络传输信息通过所述netlink文件描述符提供给所述用户进程。
与现有技术相比,本申请具有如下优点:
本申请提供的获取网络传输信息的方法,包括:用户进程构建用于获取网络传输信息的请求信息;所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。采用本申请提供的方法,通过netlink来获取内核的网络传输信息,用户既不用定时读取route表和arp表,也不用在用户态发送和接收arp表,从而解决了现有技术中用户进程获取内核进程的网络传输信息效率低下的问题。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
本申请第一实施例提供一种获取网络传输信息的方法。请参看图1,该图为本申请第一实施例的流程图。以下结合图1对本申请第一实施例进行详细说明。所述方法的实施包括如下步骤:
步骤S101:用户进程构建用于获取网络传输信息的请求信息。
本步骤用于用户进程构建用于获取网络传输信息的请求信息,可以通过netlink来构建用于获取网络传输信息的请求信息。
netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC),也是网络应用程序与内核通信的最常用的接口。
netlink是一种特殊的socket,它是Linux所特有的,类似于BSD中的AF_ROUTE,但又远比它的功能强大,目前在Linux内核中使用netlink进行应用与内核通信的应用很多。
用户态应用中使用的netlink的socket API有sendto(),recvfrom(),sendmsg(),recvmsg等。
可以使用类似于如下的代码片段来创建用于用户进程和内核进程通信的netlink文件描述符,skfd即netlink文件描述符。
skfd=socket(AF_NETLINK,SOCK_RAW,NETLINK_TEST)。
所述网络传输信息包括route表、arp表中的至少一种。
所述arp表用于描述ip地址和mac之间的对应关系。
所述route表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。
所述获取网络传输信息的方法,还包括:
所述用户进程获取所述netlink文件描述符;
所述用户进程设置所述文件描述符的地址类型,将其设置为符合要求的某一地址类型;
所述用户进程设置所述文件描述符的消息类型,将其设置为符合要求的某一消息类型。
首先利用上面所述的socket函数来创建socket套接字,然后获取所述套接字的文件描述符skfd,然后将所述skfd的地址类型设置为符合要求的某一地址类型,将所述文件描述符的消息类型设置为符合要求的某一消息类型。该消息类型可以用来处理arp消息,或者处理route消息。
所述用户进程构建用于获取网络传输信息的请求信息,包括:
所述用户进程设置所述请求信息的属性标志,将其设置为符合要求的某一属性标志;
所述用户进程设置所述请求信息的请求类型,将其设置为符合要求的某一请求类型。
上述步骤用于构建获取route表信息的请求消息,请求类型分别获取路由表对应的请求类型,调用系统函数sendmsg往fd上发送该dump请求。
所述用户进程构建用于获取网络传输信息的请求信息,包括:
所述用户进程设置所述请求信息的属性标志,将其设置为符合要求的某一属性标志;
所述用户进程设置所述请求信息的请求类型,将其分别设置为符合要求的某一请求类型。
上述步骤用于构建获取arp表信息的请求消息,请求类型为获取arp表对应的请求类型,调用系统函数sendmsg往fd上发送该dump请求。
步骤S102:所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程。
本步骤用于将所述请求信息通过netlink套接字对应的文件描述符发送至内核进程。
可以使用如下的程序片段来将所述请求信息通过所述netlink文件描述符发送至内核进程。
ret=sendto(skfd,nlh,nlh->nlmsg_len,0,(struct sockaddr*)&daddr,sizeof(struct sockaddr_nl));
步骤S103:获取所述netlink文件描述符返回的网络传输信息。
本步骤用于获取所述netlink文件描述符返回的网络传输信息。
可以使用如下代码片段所示的recvfrom函数来获取所述netlink文件描述符返回的网络传输信息。
ret=recvfrom(skfd,&u_info,si,eof(user_msg_info),0,(structsockaddr*)&daddr,&len);
所述获取网络传输信息的方法,还包括:
所述用户进程将所述netlink文件描述符注册到监控线程;
所述用户进程获取所述监控线程发出的网络传输信息更新通知;
根据所述网络传输信息更新通知,获取更新的网络传输信息。
为了实时监控内核中网络传输信息的更新,创建了监控线程。用户首先要将所述netlink文件描述符向监控线程进行注册,在注册之后,一旦内核中网络传输信息发生了更新,就会向用户发送网络传输信息更新通知,用户收到这个通知后,就可以读取更新后的网络传输信息,从而获取更新的网络传输信息。
所述获取网络传输信息的方法,还包括:
在所述用户进程构建用于获取网络传输信息的请求信息之前,所述用户进程调用系统函数;
所述系统函数用于所述内核进程的网络传输信息的更新。
例如用户进程发现一个IP不在arp表中,则调用内核的接口,往该IP发送ICMP请求。内核协议栈在发送ICMP请求时,需要填充对端IP的物理地址,则会先发送arp请求获取对端的mac地址,并更新到arp表。内核在更新arp表时,会将此次更新数据发送给监控线程上注册的原生文件描述符fd,唤醒线程来读取该数据,并由应用层解析后更新到所述用户进程的内存arp表。
所述用户进程将所述netlink文件描述符注册到监控线程,包括:
将所述netlink文件描述符的读事件注册到所述监控线程中的epoll驱动中,所述epoll驱动用于支持所述监控线程的并发处理。
epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
在linux没有实现epoll事件驱动机制之前,一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等应用场景,select和poll的使用越来越少,epoll的使用越来越多。
图2是采用本申提供的获取网络传输信息的方法的读取并监控内核进程中route表和arp表信息的一个应用实例的流程图。下面对于这个流程图进行说明。
用户进程启动后,创建监控线程,在线程上创建IO复用的epoll驱动,让线程等在epoll_wait上,提高线程的并发处理效率。
将原生文件描述符fd的读事件注册到epoll中,一旦fd上有数据可读时,epoll会唤醒线程来调用读事件的回调函数,应用层可在回调函数里读取fd上的数据。
构建获取route表信息的请求消息,调用系统函数sendmsg往fd上发送该dump请求。
内核处理dump请求后,会将route表里所有的item按照固定格式封装,然后发送给fd。epoll感知到fd有可读事件时,唤醒线程来读取fd上的数据。应用层读到数据后,对route信息进行解析,其中每个route item包括目的IP、掩码、网关、网卡名等,根据需要保存有用的item到内存上。
同理构建获取arp表信息的请求消息,调用系统函数sendmsg往fd上发送该dump请求。
解析arp item包括目的IP、目的MAC、网卡名、item的状态等。其中arp item的状态会因为一段时间未用被内核从可用状态切换为过期状态,因而需要在内存上记录其对应状态。
用户进程的初始化阶段,监控线程会dump route和arp表,完成后监控线程就回到epoll_wait,等待新的可读事件。当route表和arp表里出现新增或删除item时,内核会将更新信息发送给fd,监控线程会及时读取到。
图3是采用本申提供的获取网络传输信息方法的结合netlink逻辑的IO线程组包的一个应用实例的流程图。下面对于这个流程图进行说明。
IO线程在进行TCP/IP组包时,需要填充TCP/IP报文里的目的IP和目的物理地址,而目的IP不一定直接可达,则需要网关进行数据报文转发,此时报文里填充的目的物理地址是下一跳可达的物理地址。下一条的物理地址是在route表和arp表中做匹配而拿到的。
在内存里保存的route表中,根据目的IP做最长匹配选择下一跳可达的设备,若目的IP和源IP是同一网段,则直接可达,不用网关转发;否则下一跳为网关。
最长匹配拿到下一跳的IP后,在内存里保存的arp表中查询该IP是否存在,存在则可拿到对应的物理地址,作为目的MAC地址进行组包。
若下一跳IP不在arp表中,则调用内核的接口,往该IP发送ICMP请求。内核协议栈在发送ICMP请求时,需要填充对端IP的物理地址,则会先发送arp请求获取对端的mac地址,并更新到arp表。
内核在更新arp表时,会将此次更新数据发送给监控线程上注册的原生文件描述符fd,唤醒线程来读取该数据,并由应用层解析后更新到内存arp表。这样用户态协议栈就可以完成TCP/IP报文的组包。
在上述的实施例中,提供了一种获取网络传输信息的方法,与之相对应的,本申请还提供一种获取网络传输信息的装置。请参看图4,其为本申请的一种获取网络传输信息的装置实施例的流程图。由于本实施例,即第二实施例,基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种获取网络传输信息的装置,包括:
构建单元401,用于用户进程构建用于获取网络传输信息的请求信息;
发送单元402,用于所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;
获取单元403,用于所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。
本实施例中,所述获取网络传输信息的装置,还包括:
注册单元,用于所述用户进程将所述netlink文件描述符注册到监控线程;
通知获取单元,用于所述用户进程获取所述监控线程发出的网络传输信息更新通知;
信息获取单元,用于根据所述网络传输信息更新通知,获取更新的网络传输信息。
本实施例中,所述获取网络传输信息的装置,还包括:
调用单元,用于在所述用户进程构建用于获取网络传输信息的请求信息之前,所述用户进程调用系统函数;
设置单元,用于设置所述系统函数用于所述内核进程的网络传输信息的更新。
本实施例中,所述获取网络传输信息的装置,还包括:
获取单元,用于所述用户进程获取所述netlink文件描述符;
第一设置单元,用于所述用户进程将所述文件描述符的地址类型设置为符合要求的某一地址类型;
第二设置单元,用于所述用户进程将所述文件描述符的消息类型设置为符合要求的某一消息类型。
本实施例中,所述构建单元,具体用于:
所述用户进程将所述请求信息的属性标志设置为符合要求的某一属性标志;
所述用户进程将所述请求信息的请求类型设置为符合要求的某一请求类型。本实施例中,所述构建单元,具体用于:
所述用户进程将所述请求信息的属性标志设置为符合要求的某一属性标志;
所述用户进程将所述请求信息的请求类型分别为符合要求的某一请求类型。
本实施例中,所述网络传输信息包括route表、arp表中的至少一种。
本实施例中,所述注册单元,具体用于:
将所述netlink文件描述符的读事件注册到所述监控线程中的epoll驱动中,所述epoll驱动用于支持所述监控线程的并发处理。
本申请第三实施例提供一种计算设备通信系统,该计算设备通信系统用于实现上述第一实施例提供的方法。
所述计算设备通信系统包括至少两个计算设备,其中至少一个计算设备用于运行至少一个用户进程和至少一个内核进程;
所述用户进程用于,构建用于获取网络传输信息的请求信息;将所述请求信息通过用于所述用户进程与所述内核进程通信的netlink文件描述符发送至所述内核进程;获取所述内核进程通过所述netlink文件描述符返回的网络传输信息;
所述内核进程用于,通过用于所述用户进程与所述内核进程通信的netlink文件描述符接收所述用户进程发送的请求信息;通过所述netlink文件描述符返回所述请求信息对应的网络传输信息。
本实施例中,所述用户进程还用于,将所述netlink文件描述符注册到监控线程;获取所述监控线程发出的网络传输信息更新通知;根据所述网络传输信息更新通知,获取更新的网络传输信息;
所述内核进程还用于,通知所述监控线程所述内核进程的网络传输信息的更新;向所述用户进程提供更新的网络传输信息。
本实施例中,所述用户进程,还用于,在所述用户进程构建用于获取网络传输信息的请求信息之前,调用系统函数;所述系统函数用于所述内核进程的网络传输信息的更新;
所述内核进程还用于,根据所述用户进程调用的系统函数,更新所述内核进程的网络传输信息。
本申请第四实施例提供一种包括特定设备的装置,所述装置包括:
至少一个处理器;
存储器,其用于存储程序,所述处理器执行所述程序以用于:
用户进程构建用于获取网络传输信息的请求信息;
所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;
所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。
本申请第五实施例提供一种计算机可读取存储介质,其上存储有计算机程序,所述程序被处理器执行时,实现以下步骤:
用户进程构建用于获取网络传输信息的请求信息;
所述用户进程将所述请求信息通过用于所述用户进程与内核进程通信的netlink文件描述符发送至所述内核进程;
所述用户进程获取所述内核进程通过所述netlink文件描述符返回的网络传输信息。
本申请第六实施例提供一种提供网络传输信息的方法,请参看图5,该图为本申请第六实施例的流程图。以下结合图5对本申请第六实施例进行详细说明。所述方法包括如下步骤:
步骤S501,内核进程通过用于用户进程与所述内核进程通信的netlink文件描述符接收所述用户进程发送的获取网络传输信息的请求信息。
本步骤用于内核进程通过用于用户进程与所述内核进程通信的netlink文件描述符接收所述用户进程发送的获取网络传输信息的请求信息。
例如,用户进程在需要获得arp表信息时,可以通过netlink文件描述符向内核进程发送获取arp表信息的请求信息。
步骤S502,所述内核进程将所述网络传输信息通过所述netlink文件描述符提供给所述用户进程。
本步骤用于所述内核进程将所述网络传输信息通过所述netlink文件描述符提供给所述用户进程。
内核进程在接收到这个请求信息后,可以通过netlink文件描述符向所述用户进程提供arp表信息。
本实施例中,所述提供网络传输信息的方法,还包括:
所述内核进程将所述网络传输信息的更新通知监控线程;
所述内核进程将更新后的网络传输信息通过所述netlink文件描述符提供给所述用户进程。
在内核进程的网络传输信息,如arp表信息获得更新之后,可以将所述更新通知所述监控线程。监控线程将所述更新发送给用户进程,用户进程可以通过netlink文件描述符获取更新后的arp表信息。
本实施例中,所述提供网络传输信息的方法,还包括:
根据用户进程调用的系统函数,获取更新的网络传输信息;
将所述更新的网络传输信息通过所述netlink文件描述符提供给所述用户进程。
例如用户进程发现一个IP不在arp表中,则调用内核的接口,往该IP发送ICMP请求。内核协议栈在发送ICMP请求时,需要填充对端IP的物理地址,则会先发送arp请求获取对端的mac地址,并更新到arp表。内核在更新arp表时,会将此次更新数据发送给监控线程上注册的原生文件描述符fd,唤醒线程来读取该数据,并由应用层解析后更新到内存arp表。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。