-10 +

Linux Network Stack 系列 02

这是这个系列的第二篇文章,我们这一篇文章解释下 协议栈 <—> 应用程序 边界发生的事情,这个边界也是我们应用开发者涉及到的最多的地方。

流程分析

我们先看一个 package 到达 kernel 内核中后,package 是怎么交付给应用程序的:

上图中我们以 socket 为中心,kernel 和 application 都是和 socket 交互。我们解析下上面的图:

select/poll/epoll

上面整个数据到用户缓存区的大概流程已经知道,那么我们在 linux 平台上使用得最多的 select/poll/epoll 是怎么回事呢? 我们以 epoll 为例看看下面这张图:

select/poll/epoll 所做的工作集中在 socket 的睡眠队列的唤醒上,我们都知道 epoll 是 linux 上高性能网络编程使用的技术, 那我们解释下它是如何高效的:kernel 将 skb 排入 socket 的接收队列后会去唤醒 socket 中的睡眠队列中的 Recv 例程。 我们知道唤醒操作会执行一个 callback 调用。在上图中可以看到,epoll 中的 callback 操作,就会将这个 skb 事件加入到 epoll 中的 ready_list 列表中。这样 epoll_wait 系统调用只需要去查找 ready_list 是否为空就知道了是否应该阻塞自己, 或者说是否应该加入到 epoll 的睡眠队列中。

其他问题研究

参考

关于我

85 后程序员, 比较熟悉 Java,JVM,Golang 相关技术栈, 关注 Liunx kernel,目前痴迷于分布式系统的设计和实践。 研究包括但不限于 Docker Kubernetes eBPF 等相关技术。

Blog

Code

Life

Archive