自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 TCP实现之:RPS、XPS、GSO和GRO分析

RPS、XPS、GSO、GRO等这几个技术都是内核协议栈里面用于加速网卡报文处理(收包或者发包)所使用到的一些技术,这里我们来把它们放一块研究一下具体是怎么实现的。

2023-05-30 18:01:13 972

原创 eBPF内核实现之TRACING

eBPF目前被广泛应用于Linux系统中的各个领域,包括网络、安全、性能、调测等。其中,内核trace算是eBPF比较早所支持的特性。最早的用于内核trace的eBPF类型当属,即机制提供的对eBPF的支持,使得eBPF程序可以以内核函数动态插桩的方式来进行内核trace。随着时代的发展,目前可用于trace的eBPF类型和能够实现的功能也越来越丰富,包括、、等eBPF类型。那么内核提供的这些eBPF类型的实现和用途有什么区别,适用于哪些场景呢?我们来一探究竟。......

2022-07-06 16:18:24 2385

转载 丢包监控工具 - droptrace

本文用于介绍Linux系统下网络丢包监控工具droptrace的原理和使用方法、

2022-06-10 14:32:07 3251

原创 netfilter内核实现概述

netfilter内核实现概述一、前言netfilter是Linux内核中网络防火墙的基础,无论是基于xtables的iptables,还是conntrack、nftables,其底层都是基于netfilter的。总体来说,netfilter提供了一个相对来说比较通用的防火墙框架,这个框架提供了个入口,内核中的其他网络模块可以通过这个入口来实现自己的网络逻辑。本文简单地对netfilter的整个框架以及其内核实现进行了梳理。二、netfilter框架2.1 基本原理相比于那些基于netfilter

2022-01-23 14:13:22 2014

原创 进程虚拟内存

进程虚拟内存一、前言本篇从用户进程的角度来一窥LINUX内存的真面目,搞懂了用户进程的内存分配和使用方式,内核进程的也就自然明了了。下面我将从以下几个方面来分析用户进程的内存使用:虚拟内存空间与页表、内存映射、内存申请与释放、内存拷贝等。二、虚拟内存空间与页表2.1 虚拟内存空间众所周知,进程在访问内存时使用的是虚拟地址(也就是所谓的线性地址),使用的内存存在于虚拟内存空间。那么什么是虚拟内存空间呢?通俗的讲,虚拟内存空间就是在物理内存上层做了一层隔离,进程在访问内存时好像自己能够使用整个内存空间

2021-06-20 17:31:07 1036 1

原创 内存映射与共享内存

内存映射与共享内存一、 内存区域管理从前面的分析我们已经大概清楚了,内核在进行虚拟内存管理的时候,是以内存“区域”这个概念来进行的,下面我们就来详细解读一下内核是如何管理区域的呢,包括区域的组织、创建、查找等。1.1 数据结构内核使用struct vm_area_struct结构体来描述内存区域,每一个独立的内存区域都有一个对应的实例。内核中进程的虚拟地址空间是使用struct mm_struct结构体来描述的,所以内存区域的管理也是靠这个结构体的,其中相关的字段包括:struct mm_stru

2021-06-20 17:28:39 711

原创 深入解析MMAP模式下的原始套接字

深入解析MMAP模式下的原始套接字一、前言对于原始套接字大家都不陌生,即PF_PACKET类型的套接字,我们平时使用的抓包程序就是基于这种套接字实现的。下图中就是我们平时使用到的套接字的分类,可以看到原始套接字是一种底层的链路层的套接字,它直接接收网卡驱动收上来的包。这里要做一下概念上的区分,PF_INET中的SOCK_RAW一般情况下也被称为原始套接字,只不过这种套接字是工作在IP层的,即网络模型中的三层,并非我们今天关注的对象。原始套接字可能会接收到或者发送出去大量的报文,因此效率对其是非常重要

2021-06-17 15:30:55 1588

原创 TCP实现之:TCP报文接收

TCP实现之:TCP报文接收本章节讲述了内核TCP协议层快速收报的流程,包括从IP层将报文传递给TCP层,一直到用户调用系统调用收到报文数据的过程。之所以说是快速收报过程,是因为本文暂不分析异常网络情况下的报文,例如紧急报文、失序报文等的处理过程。一、SOCK锁机制sock中的sk_lock字段是用来对sock加锁的,该字段的类型为socket_lock_t。在对sock中的报文接收队列进行处理(包括报文的读取和添加)时,需要先获取该套接字上的锁,其中socket_lock_t的定义如下:typed

2021-06-17 14:40:08 1343

原创 TCP原理之:虚拟网络

TCP原理之:虚拟网络1. VLAN链路层(L2)对网络进行划分及隔离的方法,类似于网络层IP的网段。VLAN(Virtual LAN),顾名思义指的是虚拟局域网。什么是虚拟局域网呢?首先我们来回顾一下局域网。简单的几台或者几百台计算机通过二级交换机连接在一起所组成的网络可以称为局域网。当局域网中的某台计算机发出广播帧时,会传播到网络中所有的计算机上。当计算机数量比较多时,会严重浪费带宽和资源。为了减少广播帧,需要将局域网分割为多个广播域,VLAN就是为此诞生的。通俗的讲,可以理解为VLAN将一

2021-06-16 16:53:19 496

原创 TCP实现之:一个ping包的旅行

TCP实现之:一个ping包的旅行前言所谓的ping指的是linux、windows等操作系统下的一个用来探测网络是否连通的命令,其基本格式为:ping <目的ip地址>,其本质为发送一个ICMP协议包。1. ICMP协议简介ICMP(Internet Control Message Protocol)网络控制报文协议属于TCP/IP协议簇的一个子协议,用于在主机、路由器等设备之间传递控制消息,属于L3协议。控制消息指的是网络是否通畅、主机是否可达、路由是否可用等网络本身的消息。虽然它并

2021-06-16 16:48:54 698

原创 TCP实现之:Hellow World

TCP实现之:Hellow World绪论之所以用Hellow World来命名这一章节,是因为这一章节中所讲述的是Linux源码中网络数据传输最基础的部分:从网卡驱动到L3协议之间的报文的接收和发送。1. 网卡的注册和初始化网卡驱动的注册网卡是一种PCI设备,所以其采用通用的PCI注册方法来进行注册。struct pci_driver是PCI驱动程序在注册PCI设备时所用到的主要的数据结构,其定义如下:struct pci_driver { struct list_head node; c

2021-06-16 16:47:25 359

原创 TCP实现之:iptables原理

TCP实现之:iptables原理一、前言提到防火墙,大家都不陌生。防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。通俗的讲,防火墙就是计算机操作系统中的一种对网络报文进行监控、筛选和过滤以达到保护操作系统免受攻击的机制。防火墙常用的功能包括以下几点:包过滤功能。包过滤指的是防火墙对进入(入站)或者发出(出站)的网络数据包按照预先定义好的规则进行过滤,对于不符合规则的包进行丢弃等操作,这

2021-06-16 16:44:47 480

原创 TCP实现之:L3的IP协议

TCP实现之:L3的IP协议1. 报文的接收从上一篇文章TCP实现之:Hellow World我们已经知道了,网卡驱动(也可以理解为L2层)是通过IP协议层注册的ip_packet_type来讲数据传递给IP层处理的,其处理函数为ip_rcv,下面我们来重点分析一下该函数。ip_rcvint ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_d

2021-06-16 16:42:22 833

原创 TCP实现之:套接字

TCP实现之:套接字套接字的数据结构按照域的不同可以分为三种:用户态套接字、socket和sock,其中socket结构体是内核中的与用户态相似的套接字数据结构,可以理解为它是为用户态提供的一种接口,而sock结构体比较复杂,它是内核用来进行数据传输的数据结构,可以理解为它是套接字的实现。这三种套接字可谓息息相关。struct socket这里的socket又被称为BSD socket(伯克利套接字),它对应着网络模型中的表示层,其定义比较简单,只有7个字段,如下:struct socket {

2021-06-16 16:36:06 1907

原创 TCP实现之:IP分片内核实现

TCP实现之:IP分片内核实现一、前言先来回顾一下基本概念吧。啥是分片?啥是分段?报文在网络设备间传输的时候,一次能够传输单个报文的尺寸是有限制的,这个限制被称为MTU:最大传输单元(Maximum Transmission Unit)。不同类型的网络的MTU大小可能有差异,如以太网的MTU为1500。这个MTU指的是报文所能携带的有效数据,因此并不是以太网数据帧的真实大小,其真实大小为:1500+14+4=15181500 + 14 + 4 = 15181500+14+4=1518其中14为

2021-06-16 16:29:09 791

原创 TCP实现之:sk_buff结构浅析

TCP实现之:sk_buff结构浅析一、前言sk_buff是内核中用于存储报文缓存信息的结构体,可以算得上是内核协议栈中最重要的一个数据结构了。一方面,为了保持高效的网络报文处理效率,这要求sk_buff的结构也必须是高效的;另一方面,sk_buff被内核协议栈中的各个协议所共同使用,并在各个协议之间传递,这要求其能够兼容所有的网络协议。种种因素导致了这个结构体异常的复杂,广定义就花了三页的代码,这里我们简单对其关键属性进行分析。二、报文存储首先我们要理解网络报文存储的几个概念:线性缓存区、IP分片

2021-06-16 16:27:26 2106

原创 TCP实现之:TCP四次挥手

TCP实现之:TCP四次挥手一、前言TCP作为一种可靠的双向传输协议,使得其连接的释放也需要像连接的建立一样,拥有一套可靠的机制来实施,这个过程就是通过著名的四次挥手来实现的。为什么连接的建立需要三次握手,而连接的释放却要四次挥手呢?这是因为TCP作为一种可靠的双向连接,在释放连接的时候需要确保两边的数据都发送完成后才能释放,如下图所示。图中,为正常的TCP的状态变更图。其中,发送FIN报文意味着告诉对方:“我很好,我的数据发送完成了,不会再发送新数据了”。只有当两边都完成了数据的发送,即都发送了F

2021-06-16 16:25:22 607

原创 TCP实现之:TCP三次握手

TCP实现之:TCP三次握手前言关于TCP三次握手的原理和过程咱就不讲了哈,感兴趣的可以参考一下我的另一篇文档:TCP原理之:TCP数据传输,这里就简单分析一下内核对于TCP三次握手以及fastopen和syn_cookie等机制的实现。一、常规TCP建链1.1 基本原理TCP连接的建立过程如下图所示:首先,客户端调用connect系统调用进行建链的发起,此时内核会创建一个套接口,发送SYN报文,并将其置为SYN_SEND状态;服务端收到SYN报文后,会创建一个struct request_

2021-06-16 16:23:31 1693

原创 TCP原理之:linux网桥

TCP原理之:linux网桥0. 前言Linux内核提供了对网桥的支持,通过建立网桥设备能够将系统中的多个网络接口相连通,实现网络接口之前的通信。为了便于理解,我们可以将网桥想象成现实中的交换机,事实上网桥基本上实现了交换机的所有功能。1. 原理解析现实中的交换机我们可能比较清楚,而网桥这种抽象的、处于Linux系统内部的设备,它的机制和工作原理究竟是怎样的呢?简单来说,我们可以通过下面的一张示意图来进行解析:与你平时对网桥的理解是不是有些不一样呢?对于内核以及协议栈而言,网桥也是一种网络接口,

2021-06-16 16:19:22 1412 1

原创 TCP原理之:TCP数据传输

TCP原理之:TCP数据传输TCP(Transmission Control Protocol)全称为传输控制协议, 它工作在网络七层模型中的第四层-传输层, 是一种面向连接的可靠的数据传递协议。 对于IP和UDP协议, 它们会在接收到数据后根据数据的校验值来对数据的有效性进行判断, 对于无效的数据会直接丢弃, 而不会去纠正。 相比于UDP协议, TCP协议显得更“安全”, 它在数据失效时会进行“重传”以确保数据的正确性。本文主要讨论TCP数据传输过程中所涉及到的一些基本知识,包括报文的格式,TCP连接建

2021-06-16 16:16:41 8955

原创 进程生命周期浅析

进程生命周期浅析一、前言本章节讲述内核对于进程的实现,包括进程的创建、状态变更和进程的销毁。对于进程的运行(即调度),已在其他章节中分析,这里不再进行赘述。二、进程创建内核中与进程创建相关的系统调用包括fork、vfork、clone、unshare、exec等。fork:该系统调用没有参数,其创建个子进程,并采用写时复制技术,拷贝一份父进程的页表并标记为只读,当尝试对页表里的页进行写入时,将会触发拷贝动作(如果该页的使用数为1,则说明只有一个进程在使用,直接将其设置为可写)。vfork:与f

2021-06-16 15:17:43 290

原创 IO多路复用

IO多路复用1、前言IO多路复用指的是在单个线程中以阻塞的方式同时监控多个文件描述符上的IO事件。Linux中常用的IO多路复用方法主要为:select、poll和epoll,三者各有优缺点。2、原理2.1 selectselect的基本原理是通过将要监控的fd集合以fd_set的方式传递给内核,其中fd_set可以理解为内核中描述fd的位图,被置位的位意味着要监控的fd。这样的句柄位图,它可以向内核传递三个,分别是用来监控读、写、异常三个事件的,原型如下所示:int select(int nf

2021-06-16 15:15:22 120

原创 进程调度之核心调度器

进程调度之核心调度器调度行为的发生一般有两种方式:自己主动放弃CPU并进入等待运行队列,该过程通过主调度器实现;系统通过中断周期性地检查进程状态,以确定是否需要调度,该过程通过周期性调度器实现。主调度器: 主动调度器,即schedule函数。周期性调度器:由硬件中断触发,周期性检查进程是否需要调度。主调度器和周期性调度器合称为核心调度器,也就是说只有通过这两个内核功能,才会引发进程调度的发生。值得说一下的是,周期性调度器并不会直接调度进程,而是为当前运行的进程设置个需要进行调度的标志位(TIF

2021-06-16 15:13:56 291

原创 seq文件传输

seq文件传输一、PROC读写在进行proc接口创建的时候,我们需要制定对应的文件操作函数,即创建的proc文件被读、写的时候要调用的函数,也就是我们的回调函数。其结构体定义如下:struct file_operations { loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (stru

2021-06-16 15:05:10 1669

原创 LINUX文件系统挂载浅析

LINUX文件系统挂载浅析一、文件系统首先我们来解释一下“文件系统”的概念。根据百度百科的定义,文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构。根据我的理解,可以简单同一个文件系统上的文件都是“在一块”的。比如我们有两个EXT4类型的分区:分区A和分区B,他们就是两个独立的文件系统,其文件系统类型相同,都是EXT4。1.1 VFS在LINUX的世界里,“文件”是一个很宽泛的概念,正所谓“一切皆文件”。但是在LINUX中有很多种

2021-06-16 14:57:24 637

原创 高性能异步IO机制:IO_URING

高性能异步IO机制:IO_URING一、前言1.1 异步IO机制Linux内核提供的IO机制大都是同步实现的,如常规的read/write/send/recv等系统调用。同步IO机制存在着一定的弊端,例如:(1)IO的实现都是在当前进程上下文的系统调用中完成的,会阻塞当前进程,降低系统的实时性;(2)性能较低。异步IO指的是用户程序将IO请求提交后,无需等待IO操作的完成,而是可以继续处理别的事情。当IO操作完成后,会以某种方式通知用户程序。Linux系统下现有的异步IO机制的实现主要为两种:P

2021-06-16 13:58:29 3487 3

原创 eBPF技术概述

TCP原理之:BPF技术一、BPF原理分析1.1 简介BPF全称叫做“Berkeley Packet Filter”(柏克莱封包过滤器),之所以这样叫是因为最开始它是用作网络链路层的报文过滤。经过二十多年的发展,BPF现在所能实现的功能已经远远超过了“包过滤”这一范畴,那么BSP到底是个什么东西呢?BPF分为cBPF和eBPF,其中cBPF指的是classic BPF,即经典(老的)BPF...

2021-06-15 23:07:37 3731

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除