- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux网络报文接收发送浅析
linux网络报文接收发送浅析
对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。网络报文的发送与之相反,进程通过系统调用将数据送入网络协议栈,或者由网络协议栈自己发起报文的发送,然后协议栈通过调用网络接口函数来调度驱动程序,使其将报文传送给网络设备,从而发送出去。本文讨论的是网络接口层,它是网络设备驱动程序与网络协议栈交互的纽带。见下图中红色部分的netif。
报文的接收网络报文的接收源自网络设备。网络设备在接收到一个报文之后,通过中断告知CPU。网卡驱动程序需要注册对该中断事件的处理函数(参见《 HYPERLINK /_kouu/blog/item/cf25572a651023f3e6cd403b.html \t _blank linux中断处理浅析》),以处理接收到的报文。在中断处理函数中,网络驱动程序有两种方法对报文进行处理(老式的方法,和新式的方法),我们先介绍老式的处理方式。在这种方式下,中断处理函数主要完成以下工作:分配一个skb结构(该结构用于保存一个报文)。操作设备,将设备收到的数据拷贝到这个skb结构对应的缓冲区中。设置skb的协议类型skb-protocol,该类型表明了网络协议栈的上层协议(下面我们将会看到)。然后调用内核提供的网络接口函数netif_rx;
netif_rx(skb);netif_rx函数对skb的如时间戳这样的附加信息进行初始化以后,将这个skb结构放入当前CPU的softdate_net结构的input_pkt_queue队列中。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队列中(如果这个dev不在队列中的话),以使其等待被调度。
相比老式??处理方式,新式的处理方式(称为NAPI)在中断处理函数中仅仅是以对应设备的dev结构为参数调用netif_rx_schedule函数即可。最后netif_rx_schedule函数会触发NET_RX_SOFTIRQ软中断,于是接下来对应的软中断处理函数net_rx_action将被调用;
net_rx_action();对于当前CPU对应的softdate_net结构的poll_list队列中的所有dev,调用dev-poll方法。该方法是由对应dev的驱动程序实现的,用于接收及处理报文(前面提到的backlog_dev除外)。net_rx_action每次运行都有一定的限度,并不一定要将所有报文都处理完。在处理完一定数量的报文配额、或处理过程超过一定时间后,net_rx_action便会返回。返回前触发一次NET_RX_SOFTIRQ软中断,等待下一次中断到来的时候继续被调度。
以上过程如图所示(摘自ULNI):
上面提到的softdate_net结构是用于进行报文收发调度的结构,内核为每个CPU维护一个这样的结构。在报文接收过程中用到了其中的三个成员:1、poll_list,网络设备dev的队列。其中的设备接收到了报文,需要被处理;2、input_pkt_queue,skb报文结构的队列,保存了已接收并需要被处理的报文;3、backlog_dev,一个虚拟的网络设备dev结构;后两个成员是专门为支持老式的处理方式而设置的,在这种方式下,接收到的skb被放入input_pkt_queue队列,然后backlog_dev被加入poll_list。而最后,自然backlog_dev-poll函数将对input_pkt_queue队列中的skb进行处理。backlog_dev-poll等于process_backlog函数;
process_backlog(backlog_dev, budget);既然net_rx_action每次运行都有一个配额,它在调用dev-poll时也会传递当前剩余的配额值,即budget。process_backlog会遍历input_pkt_queue队列中的skb,调用netif_receive_skb函数对其进行处理。process_backlog函数有
您可能关注的文档
- B2C电子商城系统笔记.docx
- C++上机期末考题答案.doc
- C++中的静态绑定和动态绑定.docx
- c++判断选择.doc
- BST实现动态查找表.doc
- C++第6次作业.doc
- C++模拟动态储存管理程序设计.docx
- C++实验6.doc
- C++链表的创建与操作.doc
- C++例题库.doc
- 数学冀教版二年级下册《参观爱国教育基地》说课课件.ppt
- 统编版历史八年级上册第七单元 人民解放战争 大单元教学设计.pdf
- 人教版小学数学四年级下册第八单元《平均数与条形统计图》 单元教学设计(表格式).pdf
- 《口算两位数加减法》说课课件冀教版二年级下册数学.ppt
- 人教版四年级数学下册第九单元《数学广角——鸡兔同笼》 单元教学设计(表格式).pdf
- 牛津深圳版英语八年级上册Unit 8 English Week 单元整体教学设计.pdf
- 北师大版小学数学六年级下册3.2《图形的旋转(二)》说课课件.ppt
- 二年级下册冀教版第六单元《解决问题》说课.ppt
- 人教版九年级化学上册全册教学设计教案.pdf
- 人教版四年级数学下册第二单元《观察物体(二)》 单元教学设计(表格式).pdf
文档评论(0)