美文网首页
网络收发包流程

网络收发包流程

作者: 明翼 | 来源:发表于2021-12-25 10:55 被阅读0次

一 收包流程

  1. 内核分配一个主内存地址段(DMA缓冲区 RingBuffer),网卡设备可以在DMA缓冲区中读写数据。
  2. 网卡收到一个数据帧后, 检查MAC地址是否是自己,如果没开启混杂模式,且不是自己就丢了;
    如果目的MAC是自己,则将数据帧以DMA方式放入到RingBuffer种,不用cpu参与。
  3. 当拷贝完成,网卡会触发网卡硬中断,cpu必须立刻响应硬中断, 根据中断类型在中断注册表中 查找对应的中断处理程序(网卡驱动在初始化的时候注册),调用注册的网卡驱动程序收包。
    驱动程序收包会为网络帧分配内核数据结构sk_buff,并将它拷贝到sk_buff缓冲区。
  4. 驱动程序禁止网卡中断,因为已经在处理了,然后网卡驱动程序触发软中断,硬中断返回。
  5. 内核中的ksoftirqd进程专门处理软中断,收到软中断时候,会调用不同软中断处理,这里会调用
    net_recv_action 收包,开始处理包,将sk_buff中的包格式转成上层协议栈能识别的包。
  6. 协议栈有一系列钩子函数,驱动程序调用现应的协议栈进行包的处理。
  7. 协议栈在链路层检查报文合法性,找出上层协议类型,去掉帧和帧尾,交给网络层。
  8. 网络层取出ip,判断网络包是转发,还是本机处理,如果本机处理则取上一层协议类型(TCP、UDP等)
    去掉IP头部,交给传输层处理。
  9. 传输层取出TCP头和UDP头之后,根据四元组标识,找到对应socket,把数据拷贝到socket对应的
    缓冲区中,唤醒相关进程收包。
  10. 至此应用程序通过socket接口,收到数据了。

数据经历: RingBuffer队列---> 拷贝到内核的缓冲区-->应用的内存

二 发包流程

  1. 应用程序调用socket接口, 会把数据放入到socket的缓冲区中。
  2. 网络协议栈从socket缓冲区中取数据包,按照tcp、udp协议为其增加头部,
    再增加ip头,并按照数据包总大小和mtu比较,进行ip层的分片,再根据ip层路由
    确定下一跳地址。
  3. 分片后,网络包送到网络接口层,进行物理地址寻址,寻找下一跳的mac地址。
  4. 然后增加帧头和帧尾,放入到发包队列中。
  5. 软中断通知驱动程序,发包队列中有数据要发送。
    数据经历: 从应用内存---> 拷贝到内核的缓冲区-->RingBuffer队列
    协议栈

相关文章

  • 网络收发包流程

    一 收包流程 内核分配一个主内存地址段(DMA缓冲区 RingBuffer),网卡设备可以在DMA缓冲区中读写...

  • Linux网卡丢包排查

    首先来看看网卡收发包的处理流程: 收包: 网线上的packet首先被网卡获取,网卡会检查packet的CRC校验,...

  • npm发包流程

    注册npm账号(已有可忽略) 新建文件夹,进入该文件夹,运行npm init,生成package.json文件 将...

  • DPDK发包流程

    2019/08/13今天在看libnet的发包过程的时候,才发现他的内容是多么复杂,我的理解是,这种通用库,他们的...

  • python-socket连续发包遇到的问题

    单次发包比较容易实现,多次发包的话,假如有10个地址,如果都在一个socket中完成的话,那么发包和收包不能同时进...

  • Linux和Windows网卡MTU的修改

    实验结果 MTU参数只作用于发包,不作用于收包。 收包规格取决于网卡 发包规格取决于MTU参数 实验拓扑 Wind...

  • npm 发包过程知识整理

    npm发包教程 整理汇总一下npm发包的流程 by Qzx 参考网址 node官网 npm官网 npm中文官网 ...

  • 网卡收发包流程

    2019/07/21今天在进行发包部分调优的时候,发现对于从最开始调用系统函数,到最终的网卡发包过程不是很理解,就...

  • DPDK 收发包流程

    本文整理下之前的学习笔记,基于DPDK17.11版本源码,主要分析一下收发包流程。 使用DPDK的APP收发报文流...

  • Linux 收发包流程

    Linux 收包流程 数据包到达网卡 NIC(Network Interface Card); NIC 校验 MA...

网友评论

      本文标题:网络收发包流程

      本文链接:https://www.haomeiwen.com/subject/cprdqrtx.html