linux 网络协议栈
文章平均质量分 91
linux 网络协议栈
废言Pro
时间加努力
展开
-
结合中断分析TCP/IP协议栈在LINUX内核中的运行时序
目录:1.Linux网络子系统的分层2.TCP/IP分层模型3.Linux网络协议栈4.Linux网卡收包时的中断处理问题5.Linux网络启动的准备工作6.Linux网络包:中断到网络层接收7.总结Linux网络子系统的分层Linux网络子系统实现需要:l 支持不同的协议族 ( INET, INET6, UNIX, NETLINK...)l 支持不同的网络设备l 支持统一的BSD socket API需要屏蔽协议、硬件、平台(API)的...转载 2021-09-02 09:31:49 · 434 阅读 · 0 评论 -
25 张图,一万字,拆解 Linux 网络包发送过程
半年前我以源码的方式描述了网络包的接收过程。之后不断有粉丝提醒我还没聊发送过程呢。好,安排!在开始今天的文章之前,我先来请大家思考几个小问题。 问1:我们在查看内核发送数据消耗的 CPU 时,是应该看 sy 还是 si ? 问2:为什么你服务器上的 /proc/softirqs 里 NET_RX 要比 NET_TX 大的多的多? 问3:发送网络数据的时候都涉及到哪些内存拷贝操作? 这些问题虽然在线上经常看到,但我们似乎很少去深究。如果真的能透彻地把这些问题理解到位,我们对性转载 2021-08-11 15:01:38 · 852 阅读 · 1 评论 -
图解Linux网络包接收过程
因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化。而很多时候,如果你对Linux底层的理解不深的话,遇到很多线上性能瓶颈你会觉得狗拿刺猬,无从下手。我们今天用图解的方式,来深度理解一下在Linux下网络包的接收过程。还是按照惯例来借用一段最简单的代码开始思考。为了简单起见,我们用udp来举例,如下:int main(){ int serverSocketFd = socke..转载 2021-08-11 14:04:46 · 407 阅读 · 0 评论 -
图解 | 深入揭秘 epoll 是如何实现 IO 多路复用的!
进程在 Linux 上是一个开销不小的家伙,先不说创建,光是上下文切换一次就得几个微秒。所以为了高效地对海量用户提供服务,必须要让一个进程能同时处理很多个 tcp 连接才行。现在假设一个进程保持了 10000 条连接,那么如何发现哪条连接上有数据可读了、哪条连接可写了 ?我们当然可以采用循环遍历的方式来发现 IO 事件,但这种方式太低级了。我们希望有一种更高效的机制,在很多连接中的某条上有 IO 事件发生的时候直接快速把它找出来。其实这个事情 Linux 操作系统已经替我们都做好了,它就是我们所熟知的.转载 2021-08-11 13:09:46 · 468 阅读 · 1 评论 -
存储基础 — 文件描述符 fd 究竟是什么?
前情概要通过上篇Go 存储基础 — 文件 IO 的姿势, 我们看到有两种文件读写的方式,一种是系统调用的方式,操作的对象是一个整数 fd,另一种是 Go 标准库自己封装的标准库 IO ,操作对象是 Go 封装的file结构体,但其内部还是针对整数 fd 的操作。所以一切的本源是通过 fd 来操作的,那么,这个 fd 究竟是什么?就这个点我们深入剖析。fd 是什么?fd是File descriptor的缩写,中文名叫做:文件描述符。文件描述符是一个非...转载 2021-08-11 11:38:30 · 5622 阅读 · 0 评论 -
NAT框架
随着Internet的发展和网络应用的增多,IPv4地址枯竭已成为制约网络发展的瓶颈。尽管IPv6可以从根本上解决IPv4地址空间不足问题,但目前网络设备和网络应用大多是基于IPv4的,因此在IPv6广泛应用之前,一些过渡技术的使用是解决这个问题最主要的技术手段。作为一种过渡方案,NAT通过地址重用的方法来满足IP地址的需要,可以在一定程度上缓解IPv4地址空间枯竭的压力,从而保证IPv4的用户和业务能平稳过渡到IPv6。NAT(Network Address Translation)是一种IP..原创 2021-08-11 11:00:53 · 385 阅读 · 0 评论 -
深入理解Linux socket
socket fd 长什么样子?什么是 socket fd ?粗糙的来讲,就是网络 fd,比如我们最常见的 C/S 客户端服务端的编程模式,就是网络通信的一种方式。撇开底层和协议细节,网络通信和文件读写从接口上有本质区别吗?其实没啥区别,不就是读过来和写过去嘛,简称 IO 。我们先看一下 socket fd 是什么样子的?随便找了个进程root@ubuntu:~#ll/proc/1583/fdtotal0lrwx------1rootroot64...转载 2021-08-11 10:48:17 · 674 阅读 · 0 评论 -
Linux I/O 原理和 Zero-copy 技术全面揭秘
作者:allanpan,腾讯 IEG 后台开发工程师两万字长文从虚拟内存、I/O 缓冲区,用户态&内核态以及 I/O 模式等等知识点全面而又详尽地剖析 Linux 系统的 I/O 底层原理,分析了 Linux 传统的 I/O 模式的弊端,进而引入 Linux Zero-copy 零拷贝技术的介绍和原理解析,将零拷贝技术和传统的 I/O 模式进行区分和对比,帮助读者理解 Linux 内核对 I/O 模块的优化改进思路。全网最深度和详尽的 Linux I/O 及零拷贝技术的解析文章导言如转载 2021-04-07 11:06:26 · 434 阅读 · 0 评论 -
generic_netlink_howto
generic_netlink_howtoThis document gives a brief introduction to Generic Netlink, some simple examples on how to use it and some recommendations on how to make the most of the Generic Netlink communications interface. While this document does not require原创 2021-04-02 10:10:55 · 149 阅读 · 0 评论 -
Generic Netlink内核实现分析(二):通信
前一篇博文中分析了Generic Netlink的消息结构及内核初始化流程,本文中通过一个示例程序来了解Generic Netlink在内核和应用层之间的单播通信流程。示例程序:demo_genetlink_kern.c(内核模块)、demo_genetlink_user.c(应用层Demo程序)、demo_genetlink.h程序主要功能:应用层程序接收用户的输入“字符串”和“数据”向内核发送,内核接收后回发应用层,应用层通过终端打印输出。代码路径:https://github.com/lu转载 2021-04-02 10:04:03 · 1219 阅读 · 0 评论 -
Netlink 内核实现分析(二):通信
在前一篇博文《Netlink 内核实现分析(一):创建》中已经较为详细的分析了Linux内核netlink子系统的初始化流程、内核netlink套接字的创建、应用层netlink套接字的创建和绑定流程,本文来详细的分析一下内核是如何实现netlink消息在内核和应用进程之间全双工异步通信的。一、netlink通信数据结构1、netlink消息报头:structnlmsghdrstruct nlmsghdr { __u32 nlmsg_len; /* Length of...转载 2021-04-02 10:01:21 · 615 阅读 · 0 评论 -
Netlink 内核实现分析(一):创建
Netlink 是一种IPC(Inter Process Commumicate)机制,它是一种用于内核与用户空间通信的机制,同时它也以用于进程间通信(Netlink更多用于内核通信,进程之间通信更多使用Unix域套接字)。在一般情况下,用户态和内核态通信会使用传统的Ioctl、sysfs属性文件或者procfs属性文件,这3种通信方式都是同步通信方式,由用户态主动发起向内核态的通信,内核无法主动发起通信。而Netlink是一种异步全双工的通信方式,它支持由内核态主动发起通信,内核为Netlink通信提供.转载 2021-04-02 09:59:29 · 936 阅读 · 0 评论 -
图解 | 深入揭秘 epoll 是如何实现 IO 多路复用的!
进程在 Linux 上是一个开销不小的家伙,先不说创建,光是上下文切换一次就得几个微秒。所以为了高效地对海量用户提供服务,必须要让一个进程能同时处理很多个 tcp 连接才行。现在假设一个进程保持了 10000 条连接,那么如何发现哪条连接上有数据可读了、哪条连接可写了 ?我们当然可以采用循环遍历的方式来发现 IO 事件,但这种方式太低级了。我们希望有一种更高效的机制,在很多连接中的某条上有 IO 事件发生的时候直接快速把它找出来。其实这个事情 Linux 操作系统已经替我们都做好了,它就是我们所熟知的.转载 2021-03-29 12:25:36 · 255 阅读 · 0 评论 -
彻底理解Cisco NAT内部的一些事
为了配一条NAT,发生了很多事。一.Inside和Outside很多在Cisco配置过NAT的人都有过一个疑问,那就是inside和outside的区别!以下是Cisco官方文档上关于NAT执行顺序的说明:注意红色和蓝色圈住的部分,对于inside-outside而言,NAT发生在路由之后,而对于outside-inside而言,NAT发生在路由之前。这是目前为止,我们唯一需要记住的。1.问题迷惑的原因不在别的,就在inside,outside这个名字不好,实际上如果将inside-out转载 2021-02-02 10:32:41 · 898 阅读 · 0 评论 -
一个复杂的nf_conntrack实例全景解析
本文关注两点,一点是细节,另外一点是概览:细节:一个完整的关于nf_conntrack和NAT互动的例子 概览:关于人云亦云的讽刺近期搜集了一些关于iptables,NAT相关的问题,其中最令人觉得麻烦的还是nf_conntrack相关的东西,比如它和NAT的关系,它和state match的关系,它的Helper机制怎么使用等等。 因此决定写一篇随笔来一个情景分析,也是方便自己终有一天遗忘了细节知识后复查。拓扑说明本文全文将围绕Netfilter主题的一片小的领地nf_conntra转载 2021-02-02 10:31:25 · 967 阅读 · 0 评论 -
深入Linux内核网络堆栈
前一段时间看到这篇帖子,确实很经典,于是翻出了英文原版再读,顺便再翻译出来供大家学习,这篇文章的中文版也早都有了,不过出于完全理解的目的,我还是将它翻译了出来,加进了自己的代码,虽然在上一周的翻译过程中,我尽量保留文章的原汁原味,但错误肯定在所难免,在末尾附上原文和我自己调试通过的代码,已经够构运行,大家可以参考一下!(有错误之处请指出)深入Linux内核网络堆栈作者:bioforgealkerr@yifan.net原名: <<Hacking the Linux Kernel Network.转载 2021-01-22 15:21:42 · 1029 阅读 · 0 评论 -
Linux内核IP Queue机制的分析
序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析。三篇文章的题目分别是:Linux内核IP Queue机制的分析(一)——用户态接收数据包Linux内核IP Queue机制的分析(二)——用户态处理并回传数据包Linux内核IP Queue机制的分析(三)——内核态ip_queue代码分析 --待续 笔者希望通过这三篇文章,能够给不熟悉或者对IP Queue使用有问题的朋友一些帮助。文章中分析不妥或错误之处,希望各位...转载 2021-01-22 14:24:40 · 458 阅读 · 0 评论 -
Netfilter实现机制分析 原作者:Minit
1. 前言Netfilter作为目前进行包过滤,连接跟踪,地址转换等的主要实现框架,了解其内部机制对于我们更好的利用Netfilter进行设计至关重要,因此本文通过阅读内核源码2.6.21.2,根据自身的分析总结出Netfilter的大致实现机制,由于自身水平有限,且相关的参考资料较少,因此其中的结论不能保证完全正确,如果在阅读本文的过程中发现了问题欢迎及时与作者联系。2. 规则的存储与遍历机制 规则的存储机制在Netfilter中规则是顺序存储的,一条规则主要包...转载 2021-01-22 14:21:43 · 261 阅读 · 0 评论 -
Linux内核那些事之连接跟踪
“本文分析了Linux内核连接跟踪的关键实现”连接跟踪(也叫会话管理)是状态防火墙关键核心,也是很多网元设备必不可少的一部分。各厂商的实现原理基本雷同,只是根据各自的业务进行修改和优化。其中,还有不少厂商干脆是基于Linux内核实现的。下面,我们就来看看Linux内核中连接跟踪的几个要点。注:本文对应的Linux源码为最新的5.9.1200基础知识 一个连接由两个tuple组成,分别代表两个方向的报文信息。 一个tuple一般由报文的五元组构成,分别是源地址、目的地址,源端.转载 2021-01-12 09:34:58 · 1267 阅读 · 1 评论 -
Linux网络报文捕获/抓包技术对比:napi、libpcap、afpacket、PF_RING、PACKET_MMAP、DPDK、XDP(eXpress Data Path)
Table of Contents1.传统linux网络协议栈流程和性能分析协议栈的主要问题针对单个数据包级别的资源分配和释放流量的串行访问从驱动到用户态的数据拷贝内核到用户空间的上下文切换跨内存访问2. 提高捕获效率的技术预分配和重用内存资源数据包采用并行直接通道传递.内存映射.数据包的批处理.亲和性与预取.3. 典型收包引擎3.1 libpcap3.2 libpcap-mmap3.3 PF_RING3.4 PACKET_MMAP转载 2020-12-29 16:38:28 · 4355 阅读 · 1 评论 -
Linux NAT基本流程与实现技巧
基于matches的NATLinux的NAT是基于match的,即在满足一系列条件的前提下执行SNAT或者DNAT,因此要求也就比较宽松,唯一的约束就是路由,即路由动作发生的时候,必须是基于最终的目标IP地址,因此DNAT必须发生在路由之前(对于本机发出的数据包,则在路由之后,然后重新路由),如下图所示附:Netfilter与ip_conntrackNetfilterLinux的协议栈仅仅实现了基本的协议操作,对应TCP/IP标准,Linux的协议栈仅仅实现了一个最小集。其余的所有扩展几乎(转载 2020-12-29 16:37:40 · 562 阅读 · 0 评论 -
linux 下的带宽、延时、吞吐率、PPS
Linux 网络协议栈是根据 TCP/IP 模型来实现的,TCP/IP 模型由应用层、传输层、网络层和网络接口层,共四层组成,每一层都有各自的职责。应用程序要发送数据包时,通常是通过 socket 接口,于是就会发生系统调用,把应用层的数据拷贝到内核里的 socket 层,接着由网络协议栈从上到下逐层处理后,最后才会送到网卡发送出去。而对于接收网络包时,同样也要经过网络协议逐层处理,不过处理的方向与发送数据时是相反的,也就是从下到上的逐层处理,最后才送到应用程序。网络的速度往往跟用户体验是挂转载 2020-12-15 12:56:04 · 2273 阅读 · 1 评论 -
EBPF学习计划
“Super powers have finally come to Linux” — Brendan Gregg目录学习计划 实验环境和相关代码 博文目录 第一阶段学习总结学习计划自从知道了eBPF这项技术后,一直对它十分感兴趣,这几天静下心来作了一个学习计划,准备逐步深入学习,最后希望能有输出,能够给大家讲讲这项“黑科技”。实验环境和相关代码https://github.com/nevermosby/linux-bpf-learning博文目录3篇经典文章翻译.转载 2020-12-09 14:33:21 · 946 阅读 · 0 评论 -
图解Linux网络包接收过程
以下文章来源于开发内功修炼,作者张彦飞allen开发内功修炼作者有互联网大厂9年多的后端开发工作经验。在本公众号中,逐步把这些年工作中对于底层的一些思考总结出来分享给大家,希望我们每一位开发同学都能够做到:了解每一比特,用好每一纳秒。因为要对百万、千万、甚至是过亿的用户提供各种网络服务,所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发,要理解性能开销,会进行性能优化。而很多时候,如果你对Linux底层的理解不深的话,遇到很多线上性能瓶颈你会觉得狗拿刺猬,无..转载 2020-12-03 19:11:45 · 565 阅读 · 1 评论 -
由spin_lock_bh想到的一些事
近日有人问我为什么在PREROUTING这个NF HOOK点的function里需要使用spin_lock_bh/unlock_bh而不是spin_lock/unlock来保护临界区。面对这个问题,有点懵,说到spin_lock族,有很多系列接口:spin_lock/spin_unlock spin_lock_bh/spin_unlock_bh spin_lock_irq/spin_unlock_irq spin_lock_irqsave/spin_unlock_irqrestore …之转载 2020-10-11 16:15:31 · 303 阅读 · 0 评论 -
linux Virtual Routing and Forwarding (VRF)
Virtual Routing and Forwarding (VRF)====================================The VRF device combined with ip rules provides the ability to create virtualrouting and forwarding domains (aka VRFs, VRF-li...转载 2020-04-15 09:28:24 · 703 阅读 · 0 评论 -
Linux Netfilter and Traffic Control
Netfilter and iptables homepagenetfilter:http://www.netfilter.org/index.html iptables:http://www.netfilter.org/projects/iptables/index.htmlOverviewNetfilteris a framework inside the Linux ker...转载 2020-03-20 15:19:53 · 664 阅读 · 0 评论 -
Linux 网络层收发包流程及 Netfilter 框架浅析
1. 前言本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 Netfilter 数据包过滤框架的基本原理以及使用方式进行简单阐述。内容如有理解错误而导致说明错误的地方,还请指正。如存在引用而没有添加说明的,也请及时告知,非常感谢!2. 基础网络知识2.1 网络分层模型OSI 模型中将网络划分为七层,但在目前实际广泛使用的 TCP/IP ...转载 2020-03-20 15:17:18 · 944 阅读 · 0 评论 -
Linux网络收发包流程
关于linux网络包的收发流程,网上随便一搜都可以搜一桶,但自己不动手永远都搞不原理。最近在家比较闲,对网络这一块也不太了解,小编习惯熟悉内核子系统原理从低版本内核开始. Linux(2.6.11.12)网络收包流程图: device driver interrupt handler netif_rx() ...转载 2020-03-20 12:41:31 · 2505 阅读 · 0 评论 -
网络数据包收发流程:从驱动到协议栈
一、硬件环境intel82546:PHY与MAC集成在一起的PCI网卡芯片,很强大bcm5461: PHY芯片,与之对应的MAC是TSECTSEC: Three Speed Ethernet Controller,三速以太网控制器,PowerPc 架构CPU里面的MAC模块 注意,TSEC内部有DMA子模块话说现在的CPU越来越牛叉了,什么功能都往...转载 2020-03-20 12:22:40 · 2911 阅读 · 0 评论 -
深入浅出VMware的组网模式
大家都知道VMWare的三种组网模式,分别为Bridge,NAT,Host-Only。VMWare认为使用这三种组网模式则可以搭建出任意的网络拓扑了,事实上也正是如此。如果你对网络很精通,那么应该很容易就可以理解VMWare的网络配置模式,然而即使如此,VMWare由于只是一个虚拟机,没有形象的拓扑展示出来。本文简单的给出三种组网模式的形象化的图示,另外,VMWare的帮助文档中也有相当详细的介绍...转载 2020-02-28 17:33:06 · 388 阅读 · 0 评论 -
Linux网络 - 数据包的发送过程
继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的。如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细。本文只讨论以太网的物理网卡,并且以一个UDP包的发送过程作为示例,由于本人对协议栈的代码不熟,有些地方可能理解有误,欢迎指正socket层 +------------...转载 2019-11-22 15:34:28 · 319 阅读 · 0 评论 -
Linux网络 - 数据包的接收过程
本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的。如果英文没有问题,强烈建议阅读后面参考里的两篇文章,里面介绍的更详细。本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个UDP包的接收过程作为示例.本示例里列出的函数调用关系来自于kernel 3.13.0,如果你的内核不是这个版本,函数名称和相关路径可能不一样,但背后的原理应该是一样的(或者有细微差别)网...转载 2019-11-22 15:33:32 · 795 阅读 · 0 评论 -
Linux MPLS功能详解
使用mpls功能,首先需要加载mpls相关的模块:$ sudo modprobe mpls_gso$ sudo modprobe mpls_iptunnel$ sudo modprobe mpls_router 使能mpls的接收和设置labels表项的数量,默认情况下内核不接收mpls报文,如果不使能此项,在如下使用ip命令配置本机环回lo接口接收mpls数据包时就会失败。labels...转载 2019-11-06 09:07:29 · 974 阅读 · 0 评论 -
Linux内核的netpoll框架与netconsole
虽然和网络相关,但是它却不是网络协议栈的一部分,这就是netpoll。它只是一个出入口的处理框架。所谓的网络,它的终端节点就是主机,数据从主机的网卡发出,经过一个出口处理过程,网卡接收到一个数据包,经过一个入口处理过程,这一出一入的过程处理分为两种方式:1.中断的方式出口处理过程-数据排入发送队列,读取特定寄存器值,待网卡状态适合发送式,发送,等待发送后的中断通知,继续。入口处理过程-数据...转载 2018-11-20 22:59:22 · 438 阅读 · 0 评论 -
用进化的观点学习网络协议
一般而言,我们比较习惯于用分层的观点来学习网络协议,这也是大学的教学方法。然而这种方式在前期如果有个地方理解不了只有死记硬背了。如果我们带着问题,并且试图去解决这些问题,最终恍然大悟,得到“原来XX协议就是解决这个问题的啊”这种感叹,那么学习效果一定事半功倍。 所谓带着问题学习,其实就是抛开一切知识,从无到有,自下而上或者自上而下去思考一个问题的解决方法,这样一来,最终你会发现,其实很多的...转载 2018-11-23 21:59:05 · 332 阅读 · 0 评论 -
TCP/IP模型背后的内涵(一)
20世纪最激动人心的东西太多了,我最喜欢的相对论算一个,然而在工程界,我觉得最伟大的发明就是TCP/IP,没有之一!它从单台的计算机互联,到承载着如今爆炸式的互联网以及今后的物联网过程中,一直都很优秀,并且最激动人心的是,它几乎还是保持着它刚出生的样子,如此的稳定!不变性本身就是美,就是永恒!再次读到大师的《The design philosophy of the DARPA internet p...转载 2018-11-28 23:10:02 · 168 阅读 · 0 评论 -
TCP/IP模型背后的内涵(二)
1、TCP/IP模型与OSI模型TCP/IP模型从一开始就是从实践走出来的,因此它能更好地迎合实际的应用而不单单停留在纸面上。从TCP/IP的发展史来看,它将IP从TCP独立出来的一部分原因是旨在将复杂度压缩在最少的位置,即主机中。否则中间节点作为传输控制的实现者,太复杂了。最终它仅仅分出了两个层,即TCP over IP。 OSI是在TCP/IP的初稿设计出来以后被提出的。它的目...转载 2018-11-28 23:18:19 · 120 阅读 · 0 评论 -
彻底理解Cisco/Linux/Windows的IP路由
-1.只要理解实质,名称并不重要!很多使用Linux的网络高手在面对Cisco管理员的诸如管理距离,路由度量等词汇时,还没有PK就自觉败下阵来了。我觉得这实在太可惜了,大家本是一家,为何这么为难对方呢?如果理解了实质,如何描述就不是那么重要了。如果一个Cisco设备管理员对你说一些你不懂的名词,或者对你描述一些Cisco上有但是基于Linux的网关设备上没有的特性,而且那个人因为拥有了CCIE证...转载 2018-11-29 22:41:43 · 231 阅读 · 1 评论 -
架构决定可扩展性--聊聊用户态协议栈的意义
在进入这个话题之前先说说通用和专业之间的区别。 举个很好的例子,好比我们个人,绝大部分的人都是“通用”的,而只有极少部分的人是“专业”的。通用的人主要目标是活下去,即在最坏的条件下如何活下去,而专业的人目标在于在特定领域内将能量发挥到极致,这时考虑的是最好的条件,简单点说,通用的人什么都做,衣食住行必须一样不落下,而专业的人只需要做好一件事,其它的事他未必搞得定。 本来就是闲聊,所以也...转载 2018-12-21 17:55:15 · 290 阅读 · 0 评论