自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux veth

(Virtual Ethernet,虚拟以太网)。veth 不是什么高大上的东西,它就像一对“虚拟网线”,帮你在 Linux 系统里模拟网络连接。想象一下,你想在电脑里建两个“虚拟房间”(网络命名空间),veth 就是连接它们的“门”。下面我们从头开始讲,配上例子和图解(用文字模拟),保证你看完就能上手!如果你是 Linux 网络新手,别担心,我会用最简单的话一步步带你了解。命令(iproute2 工具包,默认有)。需要 root 权限(sudo)。

2025-11-17 20:02:51 681

原创 数据包流经路径

摘要:本文详细介绍了Linux内核网络数据包接收(RX)的完整处理流程。从网卡硬件接收数据包开始,经过17个关键步骤:1) NIC接收并通过DMA写入内存;2) 触发硬件中断;3) NAPI调度;4) 驱动处理;5) XDP快速处理;6) GRO合并;7) RPS/RFS负载均衡;8) backlog队列;9) 协议分发;10) 网络层处理;11) 路由决策;12) 传输层处理;13) socket队列;最终14) 交付用户空间。重点分析了各环节的关键函数、性能优化点(如XDP、GRO)以及可能的丢包位置,

2025-11-17 13:07:25 164

原创 tcp关闭的四次挥手

TCP通信关闭的本质是双方sock结构体的有序删除。在客户端/服务端模式下,客户端通常主动发起关闭。三次挥手流程中:1)客户端发送FIN信号停止发送数据;2)服务端收到FIN后回复ACK+FIN;3)客户端确认后服务端删除sock结构体,客户端进入TIME_WAIT状态确保可靠性。当服务端仍有数据传输时,关闭流程演变为四次挥手:1)客户端FIN;2)服务端ACK;3)服务端FIN;4)客户端ACK。这种机制确保了TCP连接的可靠终止,兼顾了数据传输完整性和关闭确认需求。

2025-11-08 16:42:53 216

原创 网络通信socket编程流程讲解

Socket编程基于客户端/服务端模式,通过socket结构体实现通信。服务端需创建socket、绑定IP和端口、监听请求并接受连接(createsocket、bind、listen、accept)。客户端只需创建socket并连接(createsocket、connect),其IP和端口由系统自动分配。这种机制实现了基本的网络通信功能。

2025-11-07 20:47:58 253

原创 为什么tcp建立连接采用三次握手而不是两次握手

本文探讨了TCP协议的握手机制,认为理论上两次握手足以建立可靠连接。作者提出,两次握手即可同步序列号并在内核建立sock结构体,而第三次握手主要是为降低服务端资源压力。尽管两次握手会增大服务端开销(如处理延迟的SYN包或重传SYN+ACK),但不会影响通信可靠性。作者推测三次握手的设计是早期网络硬件性能受限的结果,实际上是用额外开销换取更高可靠性。最后质疑现实中三次握手是否真能抵消潜在问题带来的开销,认为这可能存在权衡取舍。

2025-11-07 20:20:50 286

原创 GDB的第一次使用

太神奇了,我说之前为什么卡这,原来是我在用gdb控制这个进程,我之前的几次键盘输入就是这个进程在接受啊,但我没有继续所以就卡住了。原来可以用gdb跟踪pc的流动,我之前一直在用大脑模拟!然后看代码,看头文件,然后去打开头文件的文件,人工一步步追寻,裂开!原来有这么好的工具。这就是打野自学的悲哀的低效率吗(哭)?

2025-11-04 00:17:44 189

原创 vim的跳转看头文件与分屏

看看效果,屏幕利用率会高很多。

2025-11-03 17:10:21 231

原创 QEMU作用的一句话讲解

【代码】QEMU作用的一句话讲解。

2025-11-03 17:10:10 154

原创 进程的内存布局

本文通过xv6操作系统源码解析了进程内存结构的具体实现。进程内存并非显式划分为text、data等段,而是通过页表(pagetable)和进程结构体中的sz字段来管理。内核仅记录进程总内存大小(p->sz),各段边界由约定俗成的地址范围决定:text固定从0x0开始,stack位于最高地址页,guard页在其下方,heap位于中间动态区域。内核通过页表管理内存访问权限,无需明确记录各段边界,只需在sbrk系统调用时调整p->sz值,并在地址访问时检查合法性。这种设计体现了操作系统对进程内存的抽象

2025-10-25 20:29:21 274

原创 sizeof运行的原理本质

C语言sizeof的本质是编译时类型映射机制。编译器维护类型表记录各类型大小,如char(1)、int(4)、指针(8)。处理时通过类型编号查表,对结构体递归计算,数组做乘法运算。关键特性:1)纯编译时行为,运行时无开销;2)不执行表达式;3)受CPU指令集和ABI约束;4)类型信息编译后消失,体现C语言的"薄抽象层"特性,最终只剩机器码和原始数据。

2025-10-25 15:41:21 356

原创 一切编程语言的本质

C语言作为系统编程语言,本质上是硬件与应用间的抽象层。文章从底层硬件(字节、寄存器、指令)到C语言基本要素(类型、指针、函数),再到组合数据结构(数组、结构体、链表),最后到系统抽象(内存管理、文件、进程),揭示了计算机系统自底而上的构建逻辑。核心观点是:所有复杂系统都源于基本元素(内存、寄存器、指令)的递归组合,不同抽象层级间不存在"魔法",完全遵循显式的组合规则。这种分层理解方式有助于开发者建立清晰的系统认知框架。

2025-10-25 15:21:49 394

原创 以太网帧、ip、udp/tcp数据包结构图解

本文详细介绍了网络协议栈中各层数据包的内存结构,包括以太网帧、IPv4数据包、UDP和TCP报文的结构体定义与内存布局。重点解析了各协议头部的字段含义、字节序转换、长度限制以及DPDK中的访问方法,并提供了内存对齐和性能优化的注意事项。文章通过结构体定义和内存布局示意图,清晰展示了从二层到四层协议的数据组织形式,为网络数据包处理提供了实用参考。

2025-10-23 18:59:49 2772 1

原创 DPDK——UIO/VFIO 简解

UIO和VFIO是Linux内核提供的用户态硬件访问框架。UIO通过轻量级内核驱动实现基本设备内存映射和中断转发,适合简单场景;VFIO则增强安全性,支持IOMMU隔离和DMA重映射,适用于虚拟化及多租户环境。DPDK利用这些框架绕过内核协议栈,直接在用户态操作网卡硬件,其中UIO适合单机测试,VFIO则满足生产级安全需求。

2025-10-21 21:11:35 541

原创 DPDK 初始化流程——rte_eal_init()

本文详细解析了DPDK初始化流程:从用户层main()函数开始,通过rte_eal_init()完成环境抽象层初始化,包括hugepage内存映射、PCI设备扫描与探测。重点剖析了PCI设备驱动匹配机制、网卡PMD初始化过程(如ixgbe设备复位、MAC地址读取、函数指针注册等),以及UIO/VFIO实现用户态直接访问硬件的原理。整个流程使DPDK能绕过内核直接管理网卡,为高性能数据包处理奠定基础。

2025-10-21 21:08:20 1088

原创 DPDK之PMD模式

PMD(轮询模式驱动)是一种通过CPU轮询替代中断机制的网络包处理设计模式。相比传统中断模式(每次中断需1000+CPU周期),PMD通过死循环轮询网卡状态,消除了上下文切换开销,实现极低延迟和高吞吐。DPDK框架中PMD分为三层:应用层调用统一API,抽象层通过函数指针表跳转,驱动层由具体PMD实现(如ixgbe、i40e等)。这种设计本质是用CPU资源换取性能,随着网络速率提升和CPU主频停滞,轮询模式重新焕发生机,颠覆了传统中断最优的理论。

2025-10-21 20:44:53 342

原创 驱动(Driver)一句话简介

驱动本质上是作为硬件与大型程序间的适配器代码,它通过实现框架规定的统一API接口,将不同硬件设备的操作封装成标准调用方式。以DPDK为例,用户代码只需调用统一接口(如rte_eth_rx_burst),驱动内部则根据设备类型(如ixgbe/null/ring/pcap)执行对应的硬件操作。这种桥接设计既保持了上层应用的统一性,又兼容了底层硬件的多样性,最终实现"一套接口,多种实现"的技术目标。

2025-10-21 17:50:10 450

原创 DPDK 的收包路径简解——rte_eth_rx_burst的数据包流向

本文详细解析了DPDK中数据包接收的完整流程,重点介绍了rte_eth_rx_burst函数的实现机制。该函数通过批量处理模式从网卡队列接收数据包,采用零拷贝技术实现高效传输。文章从用户层代码开始,逐层深入分析API层、驱动层和内存池层的实现细节,揭示了描述符环、软件环和内存缓冲区的协同工作机制。特别强调了物理地址和虚拟地址的双重映射设计,以及指针交换的关键技术,这些设计共同保证了数据包处理的高性能和低延迟。最后总结了DPDK收包路径的核心设计理念:零拷贝、批量处理和双地址空间机制。

2025-10-21 17:12:49 763

原创 内核的“注册、注销”机制简介

Linux内核通过注册机制实现模块化扩展能力,其核心思想是利用函数指针表和链表结构实现运行时动态绑定。该机制允许在不重新编译内核的情况下,通过insmod/modprobe加载模块、rmmod卸载模块来动态增减功能。典型应用包括网络协议栈、文件系统、设备驱动等场景,通过register/unregister接口实现功能扩展。这种设计遵循开闭原则,既保证了内核的稳定性,又提供了良好的可扩展性,但需要注意并发安全和性能开销。注册机制是Linux内核实现动态功能扩展的关键技术。

2025-10-17 23:20:00 357

原创 PCAP原理一句话简介

PCAP(Packet Capture)是网络抓包的核心技术,被Wireshark等工具广泛使用。它通过内核"旁路监听"机制,在不影响正常通信的情况下,将网卡数据包复制到用户态。Linux上通过PF_PACKET套接字、SOCK_RAW和ETH_P_ALL等接口实现,支持BPF过滤和零拷贝优化来提升性能。PCAP本质是利用操作系统提供的原始套接字接口,实现对网络流量的监控和分析。

2025-10-17 23:15:09 390

原创 cJSON工具作用

cJSON是一个成熟的字符串解析库,主要用于简化开发中的数据处理工作。其优势在于:1)避免频繁修改宏定义;2)省去自行编写文件读取和类型转换的麻烦。该库诞生于2009年,历经长期验证,能有效解决早期开发中的常见问题。使用cJSON可以显著提升开发效率,减少重复劳动。

2025-10-17 23:08:05 145

原创 DPDK 内存管理布局简解——内存池mempool、ring、mbuf

本文介绍了mempool、ring和mbuf在DPDK中的关系和工作原理。mempool管理多个hugepage内存块,每个块包含多个mbuf对象;ring作为循环队列管理空闲mbuf的指针。数据包处理过程中,网卡通过DMA直接操作mbuf内存,用户程序通过指针传递mbuf地址,避免了数据拷贝。初始时ring预分配mbuf到RX队列,接收数据包后mbuf从RX队列转移到用户程序,处理后放入TX队列发送,最后mbuf被回收到ring中。整个过程通过指针传递高效完成数据包处理。

2025-10-16 17:03:02 404

原创 DPDK mbuf源码简解

DPDK的mbuf结构体。

2025-10-15 20:40:40 439

原创 C++ premer 第六章 函数

由于传参本质是拷贝,即开辟一块新空间来复制一个完全一样的对象,为了对外也起作用,我干脆传我需要改变对象的地址,函数接收到的是这个对象的地址,所以在函数体内改变的是这个地址的内容,那么主函数再取这个地址的值自然也就改变了,而且传地址返回地址,返回的就不一定只是一个值,而是地址那片连续的内存。通常来说,往函数传递参数一般是拷贝传递给函数,会开辟一个新的空间,然后在函数结束时回收这个空间,所以在函数体内改变参数的值不会对函数体外产生作用的,最后返回给主函数一个值。好烦啊,东西好tm多,又不知道有啥用,越学越烦。

2022-11-25 23:06:45 341

原创 第五章 语句

C++语言仅提供了有限的语句类型,它们中的大多数会影响程序的控制流程:· while、for和do while语句,执行迭代操作。· if和switch语句,提供条件分支结构。· continue语句,终止循环的当前一次迭代。· break语句,退出循环或者switch语句。· goto语句,将控制权转移到一条带标签的语句。· try和catch,将一段可能抛出异常的语句序列括在花括号里构成try语句块。catch子句负责处理代码抛出的异常。

2022-11-25 17:36:19 242

原创 C++ 第四章 表达式与运算符

其实这些都是我的个人想法,私认为初学者能对自己的理解自圆其说,就差不多了,一开始追求完美太难了,非常打击自己,人是会不断纠错的经验性的动物,最好就是在实践中学习不断纠错,光看书真的一会就忘。等看完基础的前几章就去敲代码吧。《C++primer》就把它当作工具,不会时就再来翻翻。这节看完了,刷新了对C++语言的认知,再看了看书籍的目录也更一步确定了我的思想没错。表达式=类型+运算符。因为表达式本身就一个结果,本质也是一个类型(对象)。运算符的优先级很重要。

2022-11-25 04:16:43 378

原创 《C++ Primer》第三章 字符串、向量、数组

为了方便访问容器里的元素,迭代器应运而生。迭代器很像一个指针,但功能更多。C++是C语言的升级版,数组→容器、指针→迭代器,数组指针能实现的内容,容器和迭代器基本都能实现,而且功能更多,更高级(对同一功能用的代码更少),避免一直敲枯燥无味的重复性代码,更方便偷懒,现在作为C++程序员就应当尽量用容器和迭代器了。

2022-11-23 20:48:16 327

原创 C++ 变量和基本类型

C++基本内置类型,基本类型变量变量命名规则变量的声明、定义、初始化、赋值的区别变量的作用域复合类型引用(reference):int &a是引用的创建指针(pointer):&a 、int *a、*a。const(常量)限定符常量的引用或指针也必须是常量顶层const与底层const处理类型类型别名typeof和using自定义数据结构自定义 单链表的节点结构体总结

2022-11-22 20:38:08 228

原创 C++的第一个程序hello world

C++的第一个程序hello world

2022-11-22 16:20:41 9649

原创 第一个博客,记录我的学习历程

学习计划

2022-11-21 12:23:49 388

空空如也

空空如也

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

TA关注的人

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