linux网络消息收发技术综述

对Linux内核的网络设备接收到的网络信息。设备驱动程序读取网络设备信息和传递信息的内核网络协议栈通过内核提供的网络接口功能,消息由协议栈,处理或转发,或丢弃,或传送一个过程。



发送相反的报文,通过系统调用的过程将数据发送到网络协议栈,或者通过网络协议栈发送自己的消息发起,然后通过调用协议栈的网络接口功能来调度驱动程序,将其发送到网络设备,发送出去。



本文论述了网络接口层,这是网络设备驱动程序和网络协议栈之间的联系。在下图红色部分看到发送。


消息接收



网络消息从网络设备接收。接收消息后,网络设备通过中断告诉CPU。网卡驱动程序需要为中断事件注册一个处理函数(参见Linux中断处理)来处理接收到的消息。



在中断处理功能中,网络驱动程序有两种处理消息的方式:旧方式和新方式,中断处理功能主要完成以下任务:



一个skb结构分配(结构用来保存邮件)。操作设备复制数据的装置接收到相应的skb结构缓冲区,设置协议类型skb ->协议skb,说明网络协议栈的上层协议(正如我们将看到的下面)。然后由内核提供的网络接口功能netif_rx叫做;



netif_rx(SKB);



初始化后的附加信息,如netif_rx功能时间戳,skb函数放入CPU CPU结构的input_pkt_queue队列present.netif_rx评判基于队列长度的拥塞状态的装置(队列的长度是太快被接收,上层是处理太晚了)。如果设备已拥堵,收到的短信可以直接丢弃。



如果一切正常,netif_rx将调用网络接口功能netif_rx_schedule触发接收消息的进一步处理;



netif_rx_schedule(DEV);



netif_rx用于softdate_net结构的嵌入式backlog_dev dev调用netif_rx_schedule,它被添加到softdate_net结构poll_list队列(如果开发不在队列),使它可以等待被安排。



随着加工的老方法相比,加工新方法(称为纳皮峰)在中断处理函数只调用netif_rx_schedule功能基于相应的设备开发结构。



最后,该netif_rx_schedule功能触发net_rx_softirq软中断,然后相应的软中断处理函数net_rx_action将被称为;



net_rx_action();



开发->调查方法被称为所有开发者在poll_list队列的当前CPU对应的softdate_net结构。这种方法是通过相应的开发驱动程序实现,用来接收和处理消息(除了前面提到的backlog_dev)。



每一次net_rx_action有一定限度的,它不一定要完成所有的消息。经过一定的消息配额处理,或处理过程是在一定的时间,这net_rx_action会回来。一net_rx_softirq软中断是回归前触发,等待下一次中断发运时下一个中断源。



上述过程显示如图所示(从ulni):


上述softdate_net结构是一个消息的调度和调度结构,并保持每个CPU内核的这样一个结构。在信息接收过程中,三的人使用。



1、poll_list,网络设备开发的设备接收信息和需处理的队列。



2、input_pkt_queue,SKB消息结构队列,保存邮件已收到需要处理。



3、backlog_dev,虚拟网络设备开发结构;



后两个成员是专门为支持旧的处理方式而设计的。在这种方式中,接收其放置在input_pkt_queue队列,和backlog_dev加入poll_list.finally,自然backlog_dev ->投票功能将处理其在input_pkt_queue队列。backlog_dev ->投票等于process_backlog功能;



process_backlog(backlog_dev,预算);



因为net_rx_action有定额每次运行的时候,它也通过目前剩余配额值,即预算,当调用dev ->调查。



process_backlog会遍历skb在input_pkt_queue排队呼叫的netif_receive_skb函数来处理它。



的process_backlog函数有两个结局。一是配额或时间去直接回来,而另一个是在处理队列中的所有input_pkt_queue skb。在这个时候,backlog_dev需要删除从poll_list。



纳皮峰加工新方式很类似于处理旧的方式。在其相应的开发->投票功能,我们需要分配skb结构,读取装置,包叫netif_receive_skb,使网络协议栈的上层与信息处理。



这种方法的最大优点是,在开发轮询功能中,它不一定只处理一条消息。如何处理它可以由驱动程序灵活地控制。例如,假设网络负载非常大。如果网络设备接收到一个消息时,它会通过中断告诉核心,所以效率不理想。此时,开发->调查可以做一些调查工作,如果网络设备已收到多条短信,可以一次处理,即使受设备目前已完成的消息,司机也可以根据一定的方法来预测在很短的时间内的设备也会收到一条短信,还有自己的相应的开发结构在poll_list,等待被安排下。



当开发仍在poll_list,设备驱动程序可以关闭中断通知时的设备接收信息,因为它是目前在轮询状态。当司机认为,没有信息可以被收集在一定时间内,它可以从poll_list消除其发展,然后打开中断通知时的装置收到消息,等待下一个消息接收中断,dev重新放置在poll_list。



netif_receive_skb(SKB);



这个函数将被提交到桥接功能skb捕获程序,将数据链路层(见Linux



网络层协议包括IP协议、ARP协议等。我们怎么知道向其在此协议在信息的数据链路层报头有三个重要的信息,MAC地址和上层协议的发送者和接收者的标识符。回忆以前的过程,并在其接收完成后,我们成立了skb ->协议(的头),和上层协议指定的它。例如,该0x0800表示IP协议、ARP协议0x0806表示,这是由协议规定。









netif_receive_skb不使用开关箱匹配skb ->选择网络层协议处理功能。有一个哈希表在系统命名ptype_base。各种网络层协议将登记一个哈希表中的表项packet_type型时初始化(协议类型是关键),如下图所示(摘自ulni)。




什么netif_receive_skb要遍历所有packet_type结构匹配类型和skb ->协议的哈希表(Dev的packet_type结构可以用来定义skb ->开发,空不限),然后调用它的函数回调函数。(可以看出,一个消息可以由各种协议处理)。



消息已经提交到网络层,它不会再进一步了。



消息发送



信息的传输是通过网络协议栈的上层开始。网络协议栈的上层构造一个skb结构需要发送(skb已经包含了数据链路层的报头)又称dev_queue_xmit功能发送。



dev_queue_xmit(SKB);



这个函数首先会处理缓冲区重组、计算校验和、杂务,并开始发送消息处理。



发送消息有两种策略,有队列或没有队列,这是由网络设备驱动程序在定义其相应的开发结构时指定的,而通用设备使用队列。



开发->迅速断开点的一个实例,一个队列,其中包含队列本身和方法操作队列(入队、出队,重新排队)。这些方法的集合形成一个排队规则(该规则在一个团队中,有一些规则,团队不一定是一个简单的FIFO),这个规则可用于流量控制。



网络设备驱动程序可以选择其设备使用的队列类型,或者不使用队列。



为排队设备,dev_queue_xmit调用dev ->迅速断开→入队方法添加到队列中,然后调用skb的qdisc_run function.qdisc_run称qdisc_restart处理队列。



Qdisc_restart (DEV);



主要功能功能继续调用dev ->迅速断开-> dequeue方法提取要发送的消息从队列中,然后把它通过调用dev -> hard_start_xmit方法。这种方法是由设备驱动程序实现将直接应对网络设备发送的消息。



如果消息是失败的qdisc_restart将调用dev ->迅速断开->排列法取代skb回到队列。同时,它也会叫netif_schedule功能添加开发在softdate_net的output_queue队列,在那里所有的设备信息等待发送,这将被处理后来,然后触发net_tx_softirq软中断。下次中断到来时,相应的软中断处理函数,net_tx_action,将被称为。



如果开发-> hard_start_xmit方法发送消息成功,这意味着消息被发送到发送缓冲区和网络设备,设备将自动发送消息,发送消息时完成,该设备将通过中断通知司机。相应的中断处理函数也触发net_tx_softirq软中断。此外,完成其将被添加到softdate_net的completion_queue队列中,等待被释放。



软中断net_tx_softirq而net_tx_action函数被调用,函数主要做了两件事:



1,从softdate_net的completion_queue队列中删除每一个skb释放。



2、在softdate_net的output_queue队列的开发,电话qdisc_run继续试图在其迅速断开队列发送消息;



队列的队列装置,主要用于流量控制和缓冲区发送失败;没有排队的设备(如螺,回送装置),的dev_queue_xmit功能将直接调用dev -> hard_start_xmit发送,如果失败的报文丢弃。



上面的过程如图所示。



的qdisc_restart功能还涉及是否开发暂停执行期间。例如,如果消息关注的是网络拥塞,如果它被挂起,它将终止处理过程,如果它被挂起返回。



开发人员的暂停是由设备驱动程序设置的。在开发-> hard_start_xmit功能,如果司机发现当前发送缓冲区太小(例如,它太小,容纳另一个消息)。这意味着消息发送太快被设备处理,该设备将暂停。当网络设备完成发送的消息,它将产生中断。相应的中断处理程序可以根据当前发送缓冲区的大小来决定是否从暂停中恢复设备。



如果有网络设备,无法发送邮件的问题,然后发送设备上的缓冲区已满状态,导致设备被停职。另一方面,如果消息不发送出去,就被通知送不产生中断,且不从暂停状态恢复,所以网络会瘫痪。



为了检测这种情况,司机可以设置该设备的看门狗定时器。如果发现设备处于暂停状态,并已通过从最后的信息,一定时间和中断尚未收到,认为设备是困难的,这一点,看门狗定时器将触发相关功能由驱动程序提供和重置设备试图恢复它的正常工作。