目录

一、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内核源码分析之网络数据收发流程相关推荐

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

    目录 一.C10K 1.阻塞方式 2.非阻塞1/O,多路复用模式 2.1.select与poll 2.2.epoll 3.异步I/O 二.C1000K 三.C10M 一.C10K 单机同时处理1万个请 ...

  2. Linux 内核源码分析 IPv6报文接收处理流程

    内核版本 3.4.39 实现一个IPv6报文转发功能的时候,需要对IPv6报文的扩展选项进行处理,还是直接参考下内核的处理比较稳妥,整理了IPv6报文的内核处理流程,如下图:

  3. Linux内核源码分析—从用户空间复制数据到内核空间

    Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...

  4. Linux内核源码分析《进程管理》

    Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...

  5. Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】...

    原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.c ...

  6. Linux内核源码分析之内存管理

    本文站的角度更底层,基本都是从Linux内核出发,会更深入.所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉. 1.页 内核把物理页作为内存管理的基本单元. 尽管处理器 ...

  7. Linux内核源码分析方法—程序员进阶必备

    一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是 ...

  8. iostat IO统计原理linux内核源码分析----基于单通道SATA盘

    iostat IO统计原理linux内核源码分析----基于单通道SATA盘 先上一个IO发送submit_bio流程图,本文基本就是围绕该流程讲解. 内核版本 3.10.96 详细的源码注释:htt ...

  9. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】...

    原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinauni ...

最新文章

  1. 从Visual Studio里抓取抽象语法树(AST)
  2. Java 基础入门随笔(1) JavaSE版——java语言三种技术架构
  3. C语言实验 圆周率1193,【圆周率】小数点后10000位,4个4个分,你能找到那些配对?...
  4. 编程方法学14:内存
  5. idea基于spring boot的依赖分开打包
  6. java perm 查看_高级 Java 必须掌握:JVM 分析工具和查看命令,超详细
  7. asp 调用java文件上传_用asp实现文件浏览、上传、下载的程序
  8. Python3自带HTTP文件传输服务(局域网文件共享)
  9. Percona XtraBackup热备份实践
  10. Google安装Kopernio插件
  11. 百度MP3音乐API接口及应用
  12. php装箱,PHP实现的装箱算法示例
  13. fcntl函数的作用及应用场景
  14. 台式计算机如何自动关机,台式电脑如何设置定时关机
  15. Windows上搭建PHP开发环境
  16. Qt实现无边框可以拖拽拉伸
  17. android开发EditText的Hint字体默认样式和下载字体样式的适配问题。
  18. 集赞免费领《新程序员》电子刊!
  19. 对比前后执行计划,发现问题 - 9i
  20. Linux 硬盘初始化

热门文章

  1. 如何使用电子合同提升效率?
  2. 普林斯顿结构与哈佛结构
  3. C# CopyTo 用法介绍
  4. 【潍坊seo公司】独家收藏的网站seo优化技巧
  5. linux 工作队列之schedule_delayed_work用法
  6. 笔记本屏幕测试linux,Screen Item Detector
  7. 涟源举办系列文旅活动推动湖南文旅产业发展!
  8. 网易易盾助力工信部装备工业发展中心 守卫网站安全第一道防线
  9. markdown引入代码_Markdown操作——代码块内如何添加代码块+如何引用代码块符号...
  10. opencv-python 姿势估计