打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
网络收发包流程 面试常考

一 收包流程

  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队列

【图片来自Linux性能优化实战】

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
你不好奇 Linux 是如何收发网络包的?
高性能IO背后原理-零拷贝(zero copy)技术概述
libpcap+PF_RING源码分析---前言(一)
浅谈C#网络编程(一)
基于Linux平台的libpcap源码分析和优化
Linux网络包接收过程的监控与调优
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服