数据从网卡到应用的过程

  • 数据从网卡到应用的过程
    • 1、过程概述
    • 2、网卡
    • 3、网卡驱动
    • 4、物理网卡收到数据包的处理流程
  • 参考

数据从网卡到应用的过程

1、过程概述

假设一个HTTP请求的数据到达网卡,那数据是如何被层层处理并到达应用呢?

2、网卡

网卡(Network Adapter),也称网络适配器,是一个 硬件设备,有全球唯一的 MAC(Media Access Control)地址,MAC地址在网卡生产时就被烧制在ROM中,网卡初始化时恢复到计算机中。

  • 1、网卡收到的数据是 光信号或电信号,然后将其还原成 数字信息(1和0组成)。


下图是还原的数字信息结构。

  • 根据 FCS(帧校验序列,Frame Check Sequence)校验数据,判断数据在传输过程是否因噪音等影响导致信号失真,从而导致数据错误,需要丢弃这种无效的数据包。

  • 然后 检查 数据包中MAC头部中的接收方的MAC地址,若不是发给自己,则丢弃数据包;若数据包是发给自己,则将数字信息保存到网卡内部缓冲区。

以上过程网卡自行搞定,不需要CPU参与,CPU也不知道数据包的到达。

3、网卡驱动

硬件需要驱动程序来控制,就像电脑需要操作系统一样,而网卡驱动就是CPU控制和使用网卡的程序

网卡处理完数字信号后,接下来的数据接收需要CPU参与,此时网卡通过中断将数据包达到的事件通知给CPU。接着,CPU暂停手头工作,开始用网卡驱动来干活。

  • 从网卡缓冲区读取接收到的数据
  • 根据MAC头部的以太类型字段判断协议种类并调用处理该协议的软件(即协议栈)

通常我们接触的以太类型是 IP协议,因此会调用TCP/IP协议栈来处理。

  • 1、网卡驱动程序提取这个帧的全部内容,去掉以太网的帧头,然后向上传递给IP层
  • 2、IP层接收到包已经,继续去掉IP头的内容,然后交给TCP层
  • 3、TCP层根据TCP协议定义的格式,继续解包,read()从socket buffer读取数据,然后传递给应用层
  • 4、应用层根据TCP层传来的数据,按照对应的应用层来分析包

4、物理网卡收到数据包的处理流程

接收数据包是一个复杂的过程,涉及很多底层的技术细节,但大致需要以下几个步骤:

  • 1、网卡收到数据包。

  • 2、将数据包从网卡硬件缓存转移到服务器内存中。

  • 3、通知内核处理。

  • 4、经过TCP/IP协议逐层处理。

  • 5、应用程序通过read()从socket buffer读取数据。

    物理网卡收到数据包的处理流程如上图所示,详细步骤如下:

  • 1、网卡收到数据包,先将高低电平转换到网卡fifo存储,网卡申请ring buffer的描述,根据描述找到具体的物理地址,从fifo队列物理网卡会使用DMA将数据包写到了该物理地址,,其实就是skb_buffer中.

  • 2、这个时候数据包已经被转移到skb_buffer中,因为是DMA写入,内核并没有监控数据包写入情况,这时候NIC触发一个硬中断,每一个硬件中断会对应一个中断号,且指定一个vCPU来处理,如上图vcpu2收到了该硬件中断.

  • 3、硬件中断的中断处理程序,调用驱动程序完成,a.启动软中断

  • 4、硬中断触发的驱动程序会禁用网卡硬中断,其实这时候意思是告诉NIC,再来数据不用触发硬中断了,把数据DMA拷入系统内存即可

    5、硬中断触发的驱动程序会启动软中断,启用软中断目的是将数据包后续处理流程交给软中断慢慢处理,这个时候退出硬件中断了,但是注意和网络有关的硬中断,要等到后续开启硬中断后,才有机会再次被触发

  • 6、NAPI触发软中断,触发napi系统

  • 7、消耗ringbuffer指向的skb_buffer

  • 8、NAPI循环处理ringbuffer数据,处理完成

  • 9、启动网络硬件中断,有数据来时候就可以继续触发硬件中断,继续通知CPU来消耗数据包.

其实上述过程过程简单描述为:网卡收到数据包,DMA到内核内存,中断通知内核数据有了,内核按轮次处理消耗数据包,一轮处理完成后,开启硬中断。其核心就是网卡和内核其实是生产和消费模型,网卡生产,内核负责消费,生产者需要通知消费者消费;如果生产过快会产生丢包,如果消费过慢也会产生问题。也就说在高流量压力情况下,只有生产消费优化后,消费能力够快,此生产消费关系才可以正常维持,所以如果物理接口有丢包计数时候,未必是网卡存在问题,也可能是内核消费的太慢。

如何将网卡收到的数据写入到内核内存?

NIC在接收到数据包之后,首先需要将数据同步到内核中,这中间的桥梁是rx ring buffer。它是由NIC和驱动程序共享的一片区域,事实上,rx ring buffer存储的并不是实际的packet数据,而是一个描述符,这个描述符指向了它真正的存储地址,具体流程如下:

  • 1、驱动在内存中分配一片缓冲区用来接收数据包,叫做sk_buffer;

  • 2、将上述缓冲区的地址和大小(即接收描述符),加入到rx ring buffer。描述符中的缓冲区地址是DMA使用的物理地址; 3、驱动通知网卡有一个新的描述符;

  • 4、网卡从rx ring buffer中取出描述符,从而获知缓冲区的地址和大小;

  • 5、网卡收到新的数据包;

  • 6、网卡将新数据包通过DMA直接写到sk_buffer中。

    当驱动处理速度跟不上网卡收包速度时,驱动来不及分配缓冲区,NIC接收到的数据包无法及时写到sk_buffer,就会产生堆积,当NIC内部缓冲区写满后,就会丢弃部分数据,引起丢包。这部分丢包为rx_fifo_errors,在 /proc/net/dev中体现为fifo字段增长,在ifconfig中体现为overruns指标增长。

参考

1、https://www.jianshu.com/p/e6162bc984c8
2、https://bbs.gameres.com/thread_842984_1_1.html

计算机网络——数据从网卡到应用的过程相关推荐

  1. 图解数据在网络中的传输过程

    数据在网络中的传输过程 在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的,这是本文探究的重点. 下图是本文中使用的网络拓扑图,数据从客户端发送给服务器端. 客户端各层对数据的封装 ja ...

  2. NTP网络时钟同步协议对计算机网络数据的重要性

    NTP网络时钟同步协议对计算机网络数据的重要性 概述:电脑时间走时不准是出了名的.它一般是以廉价的振荡电路或石英钟为基础,每天的误差可达数秒,经过一段时间的累积就会出现较大的误差.随着不断增加的分散式 ...

  3. 计算机网络四交换技术,计算机网络数据交换技术发展

    [论文关键词]数据交换电路交换报文交换.分组交换综合业务数字交换 [论文摘要]本论文讨论计算机网络数据交换技术的发展历程,阐述数据交换每个发展阶段的技术特点.着重对分组交换技术进行分析论述. 交换设备 ...

  4. 计算机网络分组交换技术有,论计算机网络数据交换技术的发展

    [论文关键词]数据交换 电路交换 报文交换.分组交换 综合业务数字交换 [论文摘要]本论文讨论计算机网络数据交换技术的发展历程,阐述数据交换每个发展阶段的技术特点.着重对分组交换技术进行分析论述. 交 ...

  5. 数据的封装与解封装过程

    数据的封装与解封装过程 1. 协议数据单元 对等网络之间传递的数据单位,称之为协议数据数据单元,简称PDU 应用层协议数据单元:数据报文 传输层协议数据单元:数据段(TCP或UDP头部信息) 网络层协 ...

  6. 计算机数据交换技术发展的顺序,计算机网络数据交换技术的发展探析

    [摘要] 随着经济的快速发展和网络科技的普及,人们也越来越重视计算机网络技术的发展,未来社会离不开计算机网络技术的应用,加快对计算机网络数据交换技术的创新和发展就变得尤为重要,本文主要是对计算机网络数 ...

  7. 计算机网络数据是如何传输的?

    简介 计算机网络是个非常复杂的系统,两个相互通信的计算机必须要能高度协调工作.而且不同网络体系结构的用户都需要通信,而且要做到在全世界范围的计算机都可以高效进行通信.于是OSI(Open System ...

  8. 若一个用户进程通过read系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是( )

    若一个用户进程通过read系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是( A ) Ⅰ. 若该文件的数据不在内存,则该进程进入睡眠等待状态 Ⅱ. 请求read系统调用会导致CPU ...

  9. 免费直播 | 宏基因组云讲堂第二期由刘永鑫博士主持,特邀王金锋副研究员分享“用时序微生物组数据重现生物膜装配的动态过程”...

    博彩众家之长,积微成就突破.为促进我国宏基因组研究领域的学术交流和技术分享,推动微生物组领域的发展,"宏基因组"公众号联合国内外优秀人才组织"易生信-宏基因组 积微学术论 ...

  10. python动态图表变化_Python数据可视化 pyecharts实现各种统计图表过程详解

    Python数据可视化 pyecharts实现各种统计图表过程详解 发布时间:2020-09-10 04:53:26 来源:脚本之家 阅读:78 1.pyecharts介绍 Echarts是一款由百度 ...

最新文章

  1. java线程入门篇(一)
  2. shell-1-命令与参数
  3. 互联网日报 | 华为前三季度营收6713亿元;新央企南水北调集团揭牌;易车私有化议案获股东大会通过...
  4. 【Photoshop】批处理与快捷批处理
  5. laravel auth::check 后session失败_01.laravel简介
  6. 计算机系统的工作方式,计算机的操作系统与工作方式
  7. Linux学习笔记5 - Shell编程(类似于Windows下的批处理)
  8. 高仿斗鱼 android,Android 高仿斗鱼滑动验证码
  9. Putty 使用记录
  10. CentOS官网下载对应版本
  11. wps打印错误未定义书签怎么解决_word文档打印时候目录出现错误!未定义书签,请问这个问题在wps里怎么修改?有些章节什么的页面可...
  12. qq邮箱发送html文本,使用qq邮箱发送html格式的邮件
  13. 12035徐波:PMBOK融会贯通:会议一览
  14. vue项目执行命令npm run serve运行项目时 停在 98% after emitting CopyPlugin
  15. 软件测试团队口号及队名,霸气响亮的队名和口号押韵 有创意的团队口号
  16. element ui 上传图片
  17. 单片机课程学习与感想
  18. TM1637驱动4位时钟数码管的Arduino 程序
  19. 博客英语作文写作技巧_网络写作技巧
  20. IIS6.0 IIS7.5应用程序池自动停止的解决方法

热门文章

  1. ViewPager报UnsupportedOperationException: Required method instantiateItem was not overridden错误
  2. 扑克牌发牌游戏python_Python随机扑克牌生成器游戏
  3. 点云配准icp算法推导
  4. 【高中数学】向量积坐标公式
  5. std::setw的坑
  6. 45.更新一下scrapy爬取工商信息爬虫代码
  7. 为什么华为a1路由器网速变慢_华为a1路由器wifi经常掉线怎么办
  8. 微信支付商户平台登录方法详解 微信商户平台如何登录
  9. 小米3文件与电脑连接到服务器,小米3怎么连接电脑传文件
  10. 900行c语言贪吃蛇,挑战CMD版贪吃蛇,能超过我的分算你赢