ipset性能测试

测试方法 基于使用场景,最后⽣成的规则会是按照 ip 或者 ip:port 来进行过滤,测试时将使用10万条 iptables 规则来模拟对性能的压力;为了最大化测试压力情况,10万条 iptables 规则将都是==不会匹配==机房流量,通俗来讲,就是链式匹配会进行所有匹配并最后以无匹配告终。 网络负载的模拟将使用同机房 scp 来模拟,并按照下述条件进行匹配: 查看正常的拷贝速度,cpu负载等 我们建⽴10万条的普通 iptables 规则,查看规则建立速度,拷贝速度,CPU负载,CPU主要耗时操作等 我们建⽴10万的 ipset ,并把普通的 iptables 规则转为结合 ipset 的规则,查看规则建立速度,拷贝速度,CPU负载,CPU主要耗时等。 实验开始 步骤一:在同机房的⼀个机器构造⼀个大文件 同机房拷贝 观察网卡速度,CPU,系统主要耗时操作的等,此场景将在iptables 规则为空的情况下进行观察 使用 sar 观测网卡速度 使用 top 观察CPU负载 使用 perf top -G 观察CPU占用 步骤二:创建10万条iptables,观察⽹卡速度、cpu、系统主要耗时操作的等,会发现cpu利⽤率⼤部分被ipt占⽤,拷⻉速度下降到不到⼗分之⼀ bash 1 2 3 4 5 6 7 8 #!/bin/bash echo *filter for ((i=1;i<=$1;i++)) do echo -I INPUT -S $i -j ACCEPT done echo COMMIT 执行脚本 bash 1 $ time ....

 ·  · 

为什么网络是分层的

Overview [1] 协议数据单元 Protocol Data Unit (PDU) 是应用于OSI模型中的数据结构,在OSI模型中每一层都会被添加一个header,tailer进行封装,header, tailer加原始报文的组合就是PDU。 在每层中,PDU的名称都是不同的,这也是很多人的疑问,一会数据报文称为数据包,一会数据报文成为数据帧,该文介绍网络中的单元,以了解之间的区别 物理层 物理层数据的呈现方式是以 “位” (bit) 为单位的,即0 1,在该层中数据以二进制形式进行传输 数据链路层 [2] 到达数据链路层,实际上可以说进入了TCP/IP栈对底层,而该层的单位为 ”帧“ (frame),该层中,MAC地址会被封装到数据包中,比如以太网帧,PPP帧都是指该层的数据包 该层中数据帧包含: 源MAC 目的MAC 数据,由网络层给出的 数据的总长度 校验序列 网络层 [3] 在网络层中协议数据单元被称为数据 “包" (package) ,是网络间节点通讯的基本单位。该层中IP地址会被封装到数据包内。 该层中数据包包含: 标头:源IP,目的IP,协议,数据包编号,帮助数据包匹配网络的位 payload:数据包的主体 标尾:包含几个位,用于告知已到达数据包的末尾与错误检查(循环冗余检查 (CRC)) 图:数据包组成 Source:https://computer.howstuffworks.com/question525.htm 例如一个电子邮件,假设电子邮件大小尾3500bit,发送时使用1024的固定大小数据包进行发送,那么每个数据包标头为 96bits,标尾为 32bit,剩余 896bits 将用于实际的数据大小。这里为3500bits,会被分为4个数据包,前三个数据包为 896bits,最后一个数据包大小为 812bits。接收端会根据包编号进行解包重组 传输层 Segment 在传输层TCP协议的协议数据单元被称为 ”段“ (Segment) ,上面讲到,IP数据包会以固定大小的数据包进行发送,如果超出大小的会被划分为多个数据包,每个数据包的碎片就被称之为Segment。 数据包分割通常会发生在该层,当发生下列场景时会需要分段 数据包大于网络支持的最大传输单元 (MTU) 网络不可靠,将数据包分为更小的包 datagram [4] 在传输层UDP协议的协议数据单元被称为 ”数据报“ (datagram) ,datagram是一种逐层增加的设计,用于无连接通讯 下图是一个UDP数据报被封装位一个IP数据包:IPv4字段值位17 表示udp协议 图:udp的IP包 Source:https://notes.shichao.io/tcpv1/ch10 对于udp数据报的组成包含header与payload,udp的header大小为固定的8字节 源端口:可选 目的端口:识别接收信息的进程 Length:udp header + udp payload的长度,最小值为8 checksum:与lenght一样其实是多余的,因为第三层包含了这两个信息 图:udp数据报组成 Source:https://notes....

 ·  · 

Linux网络栈

Linux 架构概述 [1] 本章节简单阐述Linux系统的结构,并讨论子系统中的模块之间以及与其他子系统之间的关系。 Linux内核本身鼓励无用,是作为一个操作系统的一部分参与的,只有为一个整体时他才是一个有用的实体,下图展示了Linux操作系统的分层 图:Linux子系统分层图 Source:https://docs.huihoo.com/linux/kernel/a1/index.html 由图可以看出Linux操作系统由四部分组成: 用户应用 OS服务,操作系统的一部分(例如shell)内核编程接口等 内核 硬件控制器,CPU、内存硬件、硬盘和NIC等都数据这部分 Linux内核阐述 Linux内核将所有硬件抽象为一致的接口,为用户进程提供了一个虚拟接口,使用户无需知道计算机上安装了哪些物理硬件即可编写进程,并且Linux支持用户进程的多任务处理,每个进程都可以视作为操作系统的唯一进程独享硬件资源。内核负责维护多个用户进程,并协调其对硬件资源的访问,使得每个进程都可以公平的访问资源,并保证进程间安全。 Linux内核主要为五个子系统组成: 进程调度器(SCHED), 控制进程对 CPU 的访问。调度程序执行策略,确保进程可以公平地访问 CPU。 内存管理器 (MM), 允许多个进程安全地共享操作系统的内存 虚拟文件系统 (VFS),向所有设备提供通用文件接口来抽象出各种硬件设备 网络接口 (NET),提供对多种网络标准与各种网络硬件的访问 进程间通信 (IPC),在单个操作系统上的多种机制进程间通信机制 网络子系统架构 [2] 网络子系统功能主要是允许 Linux 系统通过网络连接到其他系统。支持多种硬件设备,以及可以使用的多种网络协议。网络子系统抽象了这两个实现细节,以便用户进程和其他内核子系统可以访问网络,而不必知道使用什么物理设备或协议。 子系统模块包含 网络设备驱动层 (Network device drivers),网络设备驱动程序与硬件设备通信。每个硬件设备都有对应的设备驱动程序模块。 独立设备接口层(device independent interface),设备独立接口提供了所有硬件设备的统一视图,因此在网络子系统之上的级别无需了解硬件信息 网络协议层 (network protocol),网络协议实现了网络传输的协议 协议独立/无关接口层 (protocol independent interface),提供了独立于硬件设备的网络接口,为内核内其他子系统访问网络时不依赖特定的协议和硬件接口。 系统调用层 (system call) 用于限制用户进程导出资源的访问 网络子系统的结构图如下图所示, 图:网络子系统中的上下文 Source:https://docs.huihoo.com/linux/kernel/a1/index.html 当网络子系统转换为网络栈时,如下图所示 图:ISO Stack与TCP/IP Stack Source:https://www.washington.edu/R870/Networking.html 当然Linux网络子系统是类似于TCP/IP栈的一种结构,当发生一个网络传输时,数据包会按照所经过的层进行封装。例如应用层应用提供了REST API,那么应用将要传输的数据封装为HTTP协议,然后传递给向下的传输层。传输层是TCP协议就会被添加对应的TCP包头。整个封装过程原始包保持不变,会根据所经过层的不同增加固定格式的包头。 图:数据包传输在每层被封装的过程 Source:http://www.embeddedlinux.org.cn/linux_net/0596002556/understandlni-CHP-13-SECT-1.html 对于Linux来说TCP/IP 的五层结构则是构成网络子系统的的核心组件,下图是Linux网络栈结构图 图:Linux网络栈的结构图 Source:https://medium.com/geekculture/linux-networking-deep-dive-731848d791c0 图中橙色部分是位于TCP/IP的五层结构中的应用层,应用层向下通讯通过 system call 与 socket接口进行交互 蓝色部分是位于内核空间,socket向下则是传输层与网络层 最底层是物理层包含网卡驱动与NIC 通过图可以看出,NIC是发送与接收数据包的基本单位,当系统启动时内核通过驱动程序向操作系统注册网卡,当数据包到达网卡时,被放入队列中。内核通过硬中断,运行中断处理程序,为网络帧分配内核数据结构(sk_buff),并将其拷贝到缓冲区中,此为内核与网卡交互的过程。...

 ·  · 

科普ebpf

eBPF介绍 eBPF是 Extended Berkeley Packet Filter,主要是用于包过滤的。为什么叫Berkeley Packet Filter 是因为论文出自 Lawrence Berkeley Laboratory(相对的论文可以参考 [1])。“E" 是使BPF不仅仅是包过滤。 eBPF 目前提供的功能不仅仅是包过滤,它是一个允许用户在操作系统内核加载自定义程序的框架,来自于 ”What Is eBPF?“ eBPF is a framework that allows users to load and run custom programs within the kernel of the operating system. That means it can extend or even modify the way the kernel behaves. [2] eBPF验证器 对于如果想改变Linux内核功能需要合并代码到内核或者编写内核模块。前者需要被社区接受,这需要很长一个周期;而后者可以很好的扩展内核功能,但都存在一个问题 ”==安全运行==“ ”安全运行“ 问题包含”漏洞“和“崩溃”,考虑到这些,eBPF为安全运行提供了一个非常不同的方法**:eBPF verifier** ,eBPF verifier 将确保应用只能够在安全情况下被运行。 eBPF verifier 保证了 eBPF 程序运行的 ”安全“ 和 ”验证“...

 ·  · 

ch08 文件处理

文件类型 文件是指以字节的形式存储的数据源,使用C语言将文件数据以输出输出的形式处理叫做文件处理。 文件在C语言中以两种形式存在: 文本文件:文本文件是简单的文件类型,这些文件内容以 ASCII 字符格式存储信息。 二进制文件:二进制文件以 0 和 1 的二进制格式存储数据,不是人类可读的文件 文件指针 文件指针 (FILE) 是一种数据类型,是被定义在 stdio.h 中的一种结构体,包含了文件的一些信息 c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 typedef struct { // fill/empty level of buffer int level; // File status flags unsigned flags; // File descripter char fd; // ungetc char if no buffer unsigned char hold; // buffer size int bsize; // data transfer buffer unsigned char *buffer; // Current active pointer unsigned char *curp; //Temporary file indicator unsigned istemp; //Used for validity checking short token; } FILE; // This is FILE object 文件指针通常被用于处理正在访问的文件,fopen() 是用于打开文件并返回文件的 FILE 指针,而后通过文件只恨进行I/O操作。fopen() 会发生下列事件:...

 ·  ·