https://mp.weixin.qq.com/s/boRWlx1R7TX0NLuI2sZBfQ

作为业务 SRE,我们所运维的业务,常常以 Linux+TCP/UDP daemon 的形式对外提供服务。SRE 需要对服务器数据包的接收和发送路径有全面的了解,以方便在服务异常时能快速定位问题。
以 tcp 协议为例,本文将对 Linux 内核网络数据包接收的路径进行整理和说明,希望对大家所有帮助。

Linux 数据包接收路径的整体说明

接收数据包是一个复杂的过程,涉及很多底层的技术细节 , 这里先做一下大概的说明 :
NIC (network interface card) 在系统启动过程中会向系统注册自己的各种信息,系统会分配专门的内存缓冲区,
NIC 接收到数据包之后,就会存放在内存缓冲区,通过硬件中断通知内核有新的数据包需要处理 .
内核从缓冲区取走 NIC 接收过来的数据,交给 TCP/IP 协议栈处理。
内核的 TCP/IP 协议栈代码进行处理后,更新协议的各种状态,然后交给应用程序的 socket buffer。
然后应用程序就可以通过 read() 系统调用,从对应的 socket 文件中,读取数据。

对内核数据包接收的路径做一下分层,总体可分为三层 :

  1. 网卡层面

    • 1.1 网卡接收到数据包

    • 1.2 将数据包从网卡硬件转移到主机内存中 .

  2. 内核层面

    • 2.1 TCP/IP 协议逐层处理

  3. 应用程序层面

    • 3.1 应用程序通过 read() 系统调用 , 从 socket buffer 读取数据

如下图 :

作为业务 SRE,我们所运维的业务,常常以 Linux+TCP/UDP daemon 的形式对外提供服务。SRE 需要对服务器数据包的接收和发送路径有全面的了解,以方便在服务异常时能快速定位问题。
以 tcp 协议为例,本文将对 Linux 内核网络数据包接收的路径进行整理和说明,希望对大家所有帮助。

Linux 数据包接收路径的整体说明

接收数据包是一个复杂的过程,涉及很多底层的技术细节 , 这里先做一下大概的说明 :
NIC (network interface card) 在系统启动过程中会向系统注册自己的各种信息,系统会分配专门的内存缓冲区,
NIC 接收到数据包之后,就会存放在内存缓冲区,通过硬件中断通知内核有新的数据包需要处理 .
内核从缓冲区取走 NIC 接收过来的数据,交给 TCP/IP 协议栈处理。
内核的 TCP/IP 协议栈代码进行处理后,更新协议的各种状态,然后交给应用程序的 socket buffer。
然后应用程序就可以通过 read() 系统调用,从对应的 socket 文件中,读取数据。

对内核数据包接收的路径做一下分层,总体可分为三层 :

  1. 网卡层面

    • 1.1 网卡接收到数据包

    • 1.2 将数据包从网卡硬件转移到主机内存中 .

  2. 内核层面

    • 2.1 TCP/IP 协议逐层处理

  3. 应用程序层面

    • 3.1 应用程序通过 read() 系统调用 , 从 socket buffer 读取数据

如下图 :

Linux网络数据包的揭秘以及常见的调优方式总结的更多相关文章

  1. Linux网络 - 数据包的接收过程【转】

    转自:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后 ...

  2. [转]Linux网络 - 数据包的接收过程

    转, 原文: https://segmentfault.com/a/1190000008836467 ------------------------------------------------- ...

  3. [转]Linux网络 - 数据包的发送过程

    转, 原文:https://segmentfault.com/a/1190000008926093 -------------------------------------------------- ...

  4. Linux网络 - 数据包的接收过程(转)

    https://segmentfault.com/a/1190000008836467

  5. LINUX下的远端主机登入 校园网络注册 网络数据包转发和捕获

    第一部分:LINUX 下的远端主机登入和校园网注册 校园网内目的主机远程管理登入程序 本程序为校园网内远程登入,管理功能,该程序分服务器端和客户端两部分:服务器端为remote_server_udp. ...

  6. Linux 中的网络数据包捕获

    Linux 中的网络数据包捕获 Ashish Chaurasia, 工程师 简介: 本教程介绍了捕获和操纵数据包的不同机制.安全应用程序,如 VPN.防火墙和嗅探器,以及网络应用程序,如路由程序,都依 ...

  7. Linux内核中网络数据包的接收-第一部分 概念和框架

    与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协 ...

  8. Linux内核网络数据包处理流程

    Linux内核网络数据包处理流程 from kernel-4.9: 0. Linux内核网络数据包处理流程 - 网络硬件 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO. ...

  9. sk_buff封装和解封装网络数据包的过程详解(转载)

    http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

随机推荐

  1. (十三)、向shell脚本中传参

    一.向脚本中传递位置参数 向脚本中传递参数的数目理论上可以无数多,但是只有前9个能被访问,使用shift可以改变此限制 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 脚本名字 first ...

  2. 解决Vue-router 报NavigationDuplicated的三种方法

    控制台会报[NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDuplicate ...

  3. java中产品分类返回给前台页面 后台数据组装

    public ResultBean getSpfl(Integer yyb) { ResultBean res = new ResultBean(); try { JSONArray data = n ...

  4. [LeetCode]100. Same Tree判断树相同

    dfs遍历一下判断 public boolean isSameTree(TreeNode p, TreeNode q) { if (p==null) { return q == null; } els ...

  5. Spark MLlib中KMeans聚类算法的解析和应用

    聚类算法是机器学习中的一种无监督学习算法,它在数据科学领域应用场景很广泛,比如基于用户购买行为.兴趣等来构建推荐系统. 核心思想可以理解为,在给定的数据集中(数据集中的每个元素有可被观察的n个属性), ...

  6. int和Integer的区别?包装类?装箱?拆箱?

    int和Integer的区别: 1) int是基本数据类型,直接存储的数值,默认是0; 2) Integer 是int的包装类,是个对象,存放的是对象的引用,必须实例化之后才能使用,默认是null; ...

  7. 你一定需要知道的高阶JAVA枚举特性!

    JAVA枚举,比你想象中还要有用! 我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值. 在编译时确定类型可以具有什么值的能力是一种强大的能力,它为代码提供了结构和意义. 当我第一次了解枚举 ...

  8. 【MySQL 高级】架构介绍

    MySQL高级 架构介绍 MySQL 简介 MySQL 安装 Docker 安装 参考链接 Linux 安装 参考链接 MySQL 配置文件 log-bin:二进制日志文件.用于主从复制.它记录了用户 ...

  9. PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索

    题目分析: 一共有N个编号为1~1000的人,以及一共有编号为1~1000种不同的兴趣,在题目给出1~N编号的人员每个人喜欢的兴趣的id后,要求统计出不同的人员集合的个数以及每个人员几个的人数从大到小 ...

  10. Linux 用户操作之用户管理 (用户增删改操作)

    目录 添加用户 删除用户 修改用户 切换用户 配置用户密码 查看配置文件 cat /etc/pwsswd 添加用户 可选项 -c comment 指定一段注释性描述. -d 目录 指定用户主目录,如果 ...