当前位置: 技术问答>linux和unix
linux下有多少手段能提高实时性?
来源: 互联网 发布时间:2016-09-02
本文导语: 小弟当前用的Linux版本是2.6.23.1,在用户态写了一个从一个网口收包,然后从另一个网口发包的转发程序,由于数据包的量不是很大,不存在丢包的现象,但由于中间通过linux转了一下,使得数据包之间的时间间隔发生...
小弟当前用的Linux版本是2.6.23.1,在用户态写了一个从一个网口收包,然后从另一个网口发包的转发程序,由于数据包的量不是很大,不存在丢包的现象,但由于中间通过linux转了一下,使得数据包之间的时间间隔发生了很大的变化,在应用上这是不可接受的,我现在想知道如果还是在应用层做这个程序的话,linux有多少手段能提高转发包的实时性,待我将这些手段都尝试之后,要还是不行的话,再考虑在驱动上面动刀。希望得到高手指点,谢谢!
|
其实不关实时性的问题,是效率瓶颈的问题。越往应用程序上走,消耗的时间片越多,实习性也就越差。
这个功能实际上就是路由器和交换机做的事,所以参考路由和交换的设计理念,无非就是二层交换和三层交换。
二层交换就可以理解为在驱动里动刀子了,三层交换对linux而言有很多方法,比较通用简单的就直接用Netfilter框架就可以很好很快的实现了。
这个功能实际上就是路由器和交换机做的事,所以参考路由和交换的设计理念,无非就是二层交换和三层交换。
二层交换就可以理解为在驱动里动刀子了,三层交换对linux而言有很多方法,比较通用简单的就直接用Netfilter框架就可以很好很快的实现了。
|
使用libpcap抓包虽然是捕获到了数据链路层的报文,但是不要忘了,这时候已经是用户空间的数据,这里面已经经过了内核空间到用户空间的复制,而恰恰这段复制就是性能上的瓶颈。
因此想要高效快速的转发报文,就要避免内核态到用户态的数据拷贝,也就是所谓的二层或三层转发,这是交换和路由的核心思想。
|
Netfilter钩子
NF_IP_PRE_ROUTING 在完整性校验之后,选路确定之前
NF_IP_LOCAL_IN 在选路确定之后,且数据包的目的是本地主机
NF_IP_FORWARD 目的地是其它主机地数据包
NF_IP_LOCAL_OUT 来自本机进程的数据包在其离开本地主机的过程中
NF_IP_POST_ROUTING 在数据包离开本地主机“上线”之前
你这个用NF_IP_LOCAL_IN比较合适吧,这个是收包入口,FORWORD已经是快发出去了
NF_IP_PRE_ROUTING 在完整性校验之后,选路确定之前
NF_IP_LOCAL_IN 在选路确定之后,且数据包的目的是本地主机
NF_IP_FORWARD 目的地是其它主机地数据包
NF_IP_LOCAL_OUT 来自本机进程的数据包在其离开本地主机的过程中
NF_IP_POST_ROUTING 在数据包离开本地主机“上线”之前
你这个用NF_IP_LOCAL_IN比较合适吧,这个是收包入口,FORWORD已经是快发出去了
|
你不是从一个网口收包,然后从另一个网口发包么,只要你一个网口能收到,就能被LOCAL_IN捕获到,然后在里面稍微修改下,直接从另一网口发出,然后Netfilter钩子返回DROP就好了。