勇者の小栈

内核如何接收网络包

深入分析 Linux 内核接收网络包的完整流程,从网卡 RingBuffer、硬中断/软中断、ksoftirqd 内核线程到协议栈处理,涵盖多队列网卡、tcpdump 抓包原理、iptables/netfilter 以及 DPDK 高性能方案。

同步阻塞 IO(BIO)

系列文章: 1. 2. 3. 4. 5. 6. 7. 在上一部分中讲述了网络包是如何从网卡送到协议栈的(详见),接下来内核还有一项重要的工作,就是在协议栈接收处理完输入包后要通知到用户进程,如何用户进程接收到并处理这些数据。 进程与内核配合有多种方案,这里我们这分析两种典型的: 1. 同步阻塞方案(…

IO 多路复用(epoll)

从内核层面深入分析 Linux epoll IO 多路复用机制,介绍 epoll 相比阻塞 IO 和轮询的优势,详解 epoll_create、epoll_ctl、epoll_wait 三个核心系统调用及 eventpoll 内核对象的工作原理。

内核如何发送网络包

深入分析 Linux 内核发送网络包的完整流程,涵盖系统调用、内存拷贝、协议栈处理、网卡驱动 RingBuffer、实际发送与中断通知等环节,同时介绍零拷贝技术以及 Kafka 高性能网络的原理。

本机网络 IO

系列文章: 1. 2. 3. 4. 5. 6. 7. 前面的章节深度分析了网络包的接收,也拆分了网络包的发送,总之收发流程算是闭环了。不过还有一种特殊的情况没有讨论,那就是接收和发送都在本机进行。而且实践中这种本机网络IO出现的场景还不少,而且还有越来越多的趋势。例如LNMP技术栈中的nginx和p…

TCP 三次握手源码详解

系列文章: 1. 2. 3. 4. 5. 6. 7. 一、相关实际问题 1. 为什么服务端程序都需要先listen一下 2. 半连接队列和全连接队列长度如何确定 3. “Cannot assign requested address”这个报错是怎么回事 4. 一个客户端端口可以同时用在两条连接上吗 …

TCP 连接的内存开销

深入分析 Linux 内核中 TCP 连接的内存开销,包括 SLAB/SLUB 内存管理机制、ESTABLISHED 和 TIME_WAIT 状态连接的内存消耗,以及 UMA 与 NUMA 内存架构的演进。

底层原理

NIO有一个非常重要的组件——多路复用器,其底层有3种经典模型,分别是epoll、select和poll。与传统IO相比,一个多路复用器可以处理多个Socket连接,而传统IO对每个连接都需要一条线程去同步阻塞处理。NIO有了多路复用器后只需要一条线程即可管理多个Socket连接的接入和读写事件。 Netty的多路复用

心跳检测

客户端的心跳检测对于任何长连接的应用来说,都是一个非常基础的功能。要理解心跳的重要性,首先需要从网络连接假死的现象说起。 一、网络连接假死现象 什么是连接假死呢?如果底层的TCP连接已经断开,但是服务器端并没有正常地关闭套接字,认为这条连接仍然是存在的。 连接假死的具体表现如下: 1. 在服务器端,…

编码器与解码器

介绍 Netty 编解码器的原理与使用,包括入站方向将 ByteBuf 解码为 Java POJO 对象、出站方向将 POJO 编码为 ByteBuf 的流程,以及 ByteToMessageDecoder 基类的工作机制和自定义解码器的实现。