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

目录

一、TCP/IP 模型与 ISO模型

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

三、数据帧的封装

四、协议栈收发包流程

1、网络包接收流程

2、网络包发送流程


一、TCP/IP 模型与 ISO模型

linux内核源码分析之网络数据收发流程_第1张图片

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

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

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

linux内核源码分析之网络数据收发流程_第2张图片

三、数据帧的封装

linux内核源码分析之网络数据收发流程_第3张图片

四、协议栈收发包流程

linux内核源码分析之网络数据收发流程_第4张图片

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内核分析,网络协议栈)