红联Linux门户
Linux帮助

求The journey of a packet through the linux 2.4 network中文翻译

发布时间:2008-03-04 12:58:54来源:红联作者:pizinanren
谁有 The journey of a packet through the linux 2.4 network
这篇文章的中文翻译,不胜感激
文章评论

共有 3 条评论

  1. pizinanren 于 2008-03-04 20:47:58发表:

    因为我在学习这方面的知识,英文看不懂,还是恳求高手能把翻译做的好一些,方便学习.
    谢谢了

  2. pizinanren 于 2008-03-04 19:57:28发表:

    尽管不太通顺,还是谢谢了

  3. Magnate 于 2008-03-04 13:05:16发表:

    这个文件描述了旅途的一个网络包内的Linux内核2.4.x.这有了很大的改变,因为2.2 ,因为在全球范围内系列化上下半段是被遗弃在支持这一新的softirq制度。

    1 。前言
    我要为借口,为我的无知,但这项文件有强烈的重点,对"违约案" : x86架构和IP数据包获得转交。


    我绝对没有内核大师和所提供的资料,这份文件可能有错误。所以不要期待太多,我会永远欣赏你的意见和错误修正。


    2 。接到包
    2.1接收中断
    如果网卡收到一个以太网帧以配合当地的MAC地址或者是一个linklayer播出,它的问题,一个中断。该网络驱动器,为这个特殊卡处理中断,读取数据包的数据通过DMA的/条/无论到内存。然后分配新光银行,并要求一个函数的与协议无关的设备支持套路:网/核心/ dev.c : netif_rx (新光银行) 。

    如果驾驶员没有已经戳了新光银行,它是timestamped现在。事后新光银行获得enqueued在apropriate队列为处理器处理这个包。如果排队积压充满包跌落在这个地方。后该enqueuing新光银行接收softinterrupt其标志是为执行途经包括/ Linux的/ interrupt.h : __cpu_raise_softirq ( ) 。

    中断处理程序的指示牌以及所有中断是reenabled 。


    2.2网络收发softirq
    现在,我们遇到的一大变化介于2.2和2.4 :整个网络协议栈不再是一个自下而上的一半,但softirq 。 softirqs有重大的优势,他们可能会遇到不止一个CPU同时进行。波黑的人,保证只运行于一个CPU上一段时间。

    我们的网络得到softirq是注册网/核心/ dev.c : net_init ( )使用功能内核/ softirq.c : open_softirq ( )所提供的softirq子系统。

    进一步的处理,我们的包是在网络接收softirq ( net_rx_softirq ) ,即所谓的从内核/ softirq.c : do_softirq ( ) 。 do_softirq ( )本身就是所谓的由3个名额的内核:

    从arch/i386/kernel/irq.c : do_irq ( ) ,这是通用的IRQ处理程序
    从arch/i386/kernel/entry.s万一内核刚刚回来,从syscall
    里面主要过程调度内核/ sched.c :附表( )
    因此,如果执行的通行证之一,这点, do_softirq ( )被调用,它能够测net_rx_softirq标志着电话网/核心/ dev.c : net_rx_action ( ) 。这里sbk是dequeued从这个CPU的接收队列和事后处理向apropriate包处理。在案件的IPv4 ,这是IPv4的数据包处理机制。


    2.3 IPv4的数据包处理
    该IP数据包的处理程序是经注册网/核心/ dev.c : dev_add_pack ( )所谓从net/ipv4/ip_output.c : ip_init ( ) 。

    在IPv4的数据包处理功能,是net/ipv4/ip_input.c : ip_rcv ( ) 。经过初步检查(如数据包的是这主, … … ) IP校验的计算方法。额外的检查,这样做对的长度和IP协议版本4 。

    每包不上其中一个最理智的检查,是减少在这一点上。

    如果包通过测试,我们决定赔偿的规模,该IP包和压缩新光银行,以防运输中已附在一些填料。

    现在这是第一次,其中的Netfilter的鱼钩是所谓的。

    Netfilter的提供了一个generict和抽象的接口标准路由代码。这是目前用于包过滤,损坏, NAT和排队包,以使用者。为进一步提到,看到我的会议文件'的netfilter子系统在Linux 2.4 '或其中之一rustys不可靠指南,即Netfilter的黑客指南。

    成功后遍历的netfilter钩子, net/ipv4/ipv_input.c : ip_rcv_finish ( )被调用。

    内ip_rcv_finish ( ) ,数据包的目的地是取决于通话路由功能net/ipv4/route.c : ip_route_input ( ) 。此外,如果我们的IP包的IP选项,他们是加工。根据路由作出的决定net/ipv4/route.c : ip_route_input_slow ( ) ,征途上我们的包继续在下列情形之一的职务:


    net/ipv4/ip_input.c : ip_local_deliver ( )
    数据包的目的地是本地的,我们已处理了第4层协议,并通过它以一个使用者的进程。


    net/ipv4/ip_forward.c : ip_forward ( )
    数据包的目的地是不是地方,我们要转发给另一个网络


    net/ipv4/route.c : ip_error ( )
    发生错误,我们无法找到一个apropriate路由表条目这个包。


    net/ipv4/ipmr.c : ip_mr_input ( )
    这是一个组播包,我们必须做一些组播路由。


    3 。包转发到其他装置
    如果路由决定这包已被转交给另一设备,功能net/ipv4/ip_forward.c : ip_forward ( )被调用。


    第一位的任务,这一职能是检查IP报头的对焦TTL 。如果是< = 1我们放下包,并返回一个ICMP的时间超过讯息给寄件人。

    我们入住头的tailroom如果我们有足够tailroom为目的地设备的链路层头和扩大新光银行,如果必要的。

    明年这款是decremented逐一阐述。

    如果我们的新的数据包大于的MTU的目的地装置和不片段位在IP头的是一套,我们放下包,并发送一份ICMP的frag需要讯息给寄件人。


    最后,现在是时候致电另一之一的netfilter钩-这一次是n f_ip_forward钩。


    假定该Netfilter的鱼钩是寄回nf_accept判决,功能net/ipv4/ip_forward.c : ip_forward_finish ( ) ,是下一步我们包的征程。


    ip_forward_finish ( )本身检查,如果我们需要设置任何其它选项,在IP报头,并已ip_optfixme了这种做法。事后,它呼吁包括/网/ ip.h : ip_send ( ) 。


    如果我们需要一些支离破碎的现象,修正我: ip_fragment得到所谓的,否则,我们将继续在net/ipv4/ip_forward : ip_finish_output ( ) 。


    ip_finish_output ( )又是否什么都没有超过呼唤Netfilter的postrouting钩nf_ip_post_routing并呼吁ip_finish_output2 ( )成功穿越这一厄运。


    ip_finish_output2 ( )呼吁prepends硬件(链路层)头,以我们的新光银行,并呼吁net/ipv4/ip_output.c : ip_output ( ) 。