linux内核源码分析之网络数据收发流程

Posted 为了维护世界和平_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核源码分析之网络数据收发流程相关的知识,希望对你有一定的参考价值。

目录

一、TCP/IP 模型与 ISO模型

二、内核中分层模型的结构

三、数据帧的封装

四、协议栈收发包流程

1、网络包接收流程

2、网络包发送流程


一、TCP/IP 模型与 ISO模型

 

内核中使用的是TCP/IP 模型,把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层。

  • 应用层,负责向用户提供一组应用程序;
  • 传输层,负责端到端的通信;
  • 网络层,负责网络包的封装、寻址和路由;
  • 网络接口层,负责网络包在物理网络中的传输。

 

二、内核中分层模型的结构

 

三、数据帧的封装

 

四、协议栈收发包流程

 

 

1、网络包接收流程

  1. 当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;
  2. 通过硬中断,处理硬中断处理程序,(在处理硬中断时先关闭CPU中断,等处理完硬中断再开启CPU中断),一些耗时的处理交给软中断softirq处理。
  3. 网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中,再通过软中断,通知内核收到了新的数据帧
  4. 内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。
  5. 网络层取出 IP 头,判断网络包下一步的走向,交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
  6. 传输层取出 TCP 头或者 UDP 头后,根据 < 源 IP、源端口、目的 IP、目的端口 >,找出对应的 socket,并把数据拷贝到 scket 的接收缓存中。
  7. 应用层就可以使用 socket 接口,读取到新接收到的数据。

2、网络包发送流程

  1. 应用调用发送函数产系统调用
  2. 套接字层会把数据包放到 socket 发送缓冲区中
  3. 网络协议栈从 socket 发送缓冲区取出数据;再按照 TCP/IP 栈,从上到下逐层处理
  4. 传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片
  5. 网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中
  6. 软中断通知驱动程序,发包队列中有新的网络帧需要发送
  7. 通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去

以上是关于linux内核源码分析之网络数据收发流程的主要内容,如果未能解决你的问题,请参考以下文章

网络协议栈源码分析

Linux内核源码分析之网络协议栈架构

Linux内核分析_UDP协议中数据包的收发处理过程

linux内核源码分析之网络协议栈的演变

Linux网络协议:当eBPF遇上Linux内核网络 | Linux内核之旅

[架构之路-45]:目标系统 - 系统软件 - Linux OS硬件设备驱动-网络驱动程序模型网络数据包的收发流程