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. 测试平台MeterSphere源码入门

    前端代码结构 ├── package.json #Vue的模块依赖定义 ├── pom.xml #Maven前后端打包的定义与依赖 ├── public ├── src #前端核心代码 │ ├── a ...

  2. 深度学习论文翻译解析(十六):Squeeze-and-Excitation Networks

    论文标题:Squeeze-and-Excitation Networks 论文作者:Jie Hu  Li Shen Gang Sun 论文地址:https://openaccess.thecvf.co ...

  3. Word2Vec和LDA的区别与联系

    Word2vec是目前最常用的词嵌入模型之一.是一种浅层的神经网络模型,他有2种网络结构,分别是CBOW(continues bag of words)和 skip-gram.Word2vec 其实是 ...

  4. 在vue 中 element-ui table结合Popover使用

    在vue 中 element-ui table结合Popover使用 <el-table-column label="操作" > <template slot-s ...

  5. JAVA递归算法及经典递归例子 对于这个汉诺塔问题

    前言:递归(recursion):递归满足2个条件 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 第一题:汉诺塔 对于这个汉诺塔问题,在写递归时,我们只需要确定两个条件: ...

  6. 远程桌面连接(出现身份验证错误。要求的函数不支持)这可能由于CredSSP加密Oracle修正。

    家庭版解决方案 在进行远程桌面时会遇到这种情况.对于Windows 10家庭版用户,是不支持组策略功能的.本文根据官方文档采用修改注册表的方式达到相同的目的. 1.打开注册表   win + R  键 ...

  7. ES6模板字符串及字符串的扩展方法

    一.ES6模板字符串 传统定义字符串的方式是: const str='hello es2015,this is a string' ES6新增了一种定义字符串的方式用反引号进行标识 const str ...

  8. Netty源码解析 -- 对象池Recycler实现原理

    由于在Java中创建一个实例的消耗不小,很多框架为了提高性能都使用对象池,Netty也不例外. 本文主要分析Netty对象池Recycler的实现原理. 源码分析基于Netty 4.1.52 缓存对象 ...

  9. 简单做了一个代办事项列表系统 ,增删改查。 前台页面用 jquery 后台用nodejs ,数据库用的是mongdoDB 。

    引入npm 第三方mongoose包连接mongoDb本地数据库todolist const mongoose = require('mongoose'); mongoose.connect('mon ...

  10. FastAPI学习: 个人博客的后端API

    前言 学习FastAPI中把官方文档过了一遍,看了些大佬的文章,也借鉴(抄袭)了部分代码,写了一套个人博客的API,目前还比较简陋,统计的API基本没有,而且目前基本都停留在单表查询,所以含量不高,接 ...