Linux 收发包流程

作者: Sun东辉 | 来源:发表于2022-05-17 17:19 被阅读0次

Linux 收包流程

  1. 数据包到达网卡 NIC(Network Interface Card);
  2. NIC 校验 MAC(网卡非混杂模式)和帧的校验字段 FCS(Frame Check Sequence 帧校验序列);
  3. NIC 通过 DMA (Direct Memory Access,即直接存储器访问)将数据包放入提前映射好的内存区域;
  4. NIC 将数据包的引用放入接受的 running buffer 队列(环形缓冲区) rx 中;
  5. NIC 等待 rx-usecs 的超时时间或者 rx 队列长度达到 rx-frames 后触发中断 IRQ(interrupt request,中断请求);
  6. CPU 执行硬件中断和网卡的驱动程序;
  7. 驱动程序清理硬中断并触发软中断 NFT_RX_SOFTIRQ;
  8. 软中断对网卡进行轮询收包;
  9. 数据包被放入 qdisc 队列(网卡多队列);
  10. 将数据包送入协议栈,调用 ip_recv;
  11. 调用 netfilter 的 PREROUTING 链(数据包做路由计算之前的钩子函数);
  12. 查找路由表,进行转发或投递到 local;
  13. 对投递到 local 的数据包调用 netfilter 的 LOCAL_IN 链(所有到本机的数据包都会调用这个钩子函数);
  14. 调用四层协议栈,如 tcp_v4_rcv;
  15. 查找到对应的 socket(根据五元组:源IP地址,源端口,目的IP地址,目的端口,和传输层协议,做一个哈希),运行 TCP 的状态机;
  16. 将数据放入 TCP 的接收缓冲区中;
  17. 通过 epoll (钩子函数)或者其他轮询方式通知应用程序;
  18. 应用程序读取数据。

Linux 发包流程

  1. 应用程序发送数据;
  2. TCP 为发送的数据申请 skb(一个数据包对象);
  3. 构建 TCP 头部,如 src 和 dst 的 port,checksum(计算一个校验值);
  4. 调用第三层协议,构建 IP 头部,调动 netfilter 的 LOCAL_OUT 链(本机出去的数据包都会跑一下这个链上的钩子函数);
  5. 查找路由表;
  6. 调用 netfilter 的 POST_ROUTING 链(路由之后的钩子函数);
  7. 对超过 MTU (最大传输单元 Maximum Transmission Unit)的报文进行分片(fragment);
  8. 调用二层的发包函数 dev_queue_xmit;
  9. 将待发数据包放入输出的 QDisc 队列;
  10. 调用网卡驱动程序,将数据包放入循环缓冲队列 tx;
  11. 驱动程序在 tx-usercs 的超时时间后,或者积累 tx-frames 个待发数据包后触发软中断;
  12. 驱动程序启用网卡的硬件中断;
  13. 驱动程序将数据包映射到 DMA 内存;
  14. 网卡从 DMA 中取数据并发送;
  15. 网卡发送完毕后触发硬件中断;
  16. 硬中断清理中断信号后触发软中断;
  17. 软中断释放已经发送完的数据包的内存;

相关文章

  • Linux 收发包流程

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

  • linux.network 收包和发包

    对一张网卡来说:收包就是通过网线传过来的包,发包就是把包通过网线发出去,所以一台主机上的几张网卡之间的数据包转发不...

  • Linux内核收发包原理资料

    Linux内核收发包原理 Monitoring and Tuning the Linux Networking S...

  • Linux网卡丢包排查

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

  • TCP协议知识图谱

    总结一些常用的参数以及工具: Linux收发包核心流程: 资料内容:1、耗子叔的关于TCP协议的上下文章:http...

  • 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中文官网 ...

网友评论

    本文标题:Linux 收发包流程

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