博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux系统捕获数据包流程
阅读量:7100 次
发布时间:2019-06-28

本文共 855 字,大约阅读时间需要 2 分钟。

Linux
系统捕获数据包流程<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

为了提高数据包的捕获效率,瓶颈问题是一个需要非常关注的焦点。减少在捕获数据包过程中的瓶颈,就能够提高数据包捕获的整体性能。下面本文将以Linux操作系统为平台,分析捕获数据包的整个过程,通过实验数据得出影响捕获数据包的关键因素,最终确定捕获数据包过程的瓶颈。

Linux平台下数据包的获取过程为,数据包到达网卡后,会产生一个硬件中断,然后调用网卡驱动程序中的函数来处理。这个中断处理程序首先要做的就是进行一些I/O操作将数据读入。当数据帧成功接收后,收到的数据包会被封装成sk buff结构,并脱离驱动程序,转到通用的处理函数netif_rx()中。Netif_rx()的一个重要工作就是将传入的sk_buff到等候队列中,并置位软中断标志位。其目的是快速从中断中返回,等待下一个数据的到来,从而提高对网络数据包的处理速度。

netif_rx()
将数据包传入等待队列中之后,为了提高CPU的处理效率,上层处理采用软中断do_softirq()实现。由于在系统初始化的时候,具体说是在调用函数net_dev_init()时,已经将NET RX_SOFTIRQ软中断对应的处理函数映射成了net_rx_action(),因此do_softirq()将调用net_rx_action()对数据包进行处理。在函数net_rx_action()中,根据数据包类型的不同调用ip_recv()或者packet_recv()函数对netif_rx()传入的封装成sk buff的数据包进行处理。处理的最终结果是将数据包放到Socket等待队列中,并通知上层有数据包到达。这就是数据包从网卡到达系统内核空间的过程。在网络中数据包的数量是非常大的。为了防止在获取数据包时,由于效率低下而引起数据包丢弃的问题,下面将研究数据获取时的瓶颈问题。

转载地址:http://klzhl.baihongyu.com/

你可能感兴趣的文章
上层建筑——DOM元素的特性与属性(dojo/dom-prop)
查看>>
设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
查看>>
Android开发之旅:android架构
查看>>
新闻发布系统,真正了解了么?
查看>>
使用Github的高级搜索功能
查看>>
信息系统开发平台OpenExpressApp - ClickOnce智能部署
查看>>
Android APK自动化测试
查看>>
ZooKeeper编程指导
查看>>
Top 5 open source Q&A systems
查看>>
Android固定头部sticky-headers RecycleView
查看>>
【Android开发】网路编程及Internet应用-使用WebView显示网页
查看>>
学生党如何拿到阿里技术offer:《阿里面试经历-2014.4.18研发实习生面试经历(失败)》...
查看>>
iOS开发证书"此证书的签发者无效"解决方法
查看>>
Java集合-List
查看>>
zfs 快照发送与接收
查看>>
mymysql与go-mysql-driver的一个区别
查看>>
为什么大批的JAVA程序员都是在转大数据
查看>>
elasticsearch 使用指南
查看>>
Guava Lists transform 使用及问题
查看>>
An error occurred while installing the selected updates:macOS更新
查看>>