
使用 eBPF 技术实现更快的网络数据包传输
在 上篇文章 用了整篇的内容来描述网络数据包在 Kubernetes 网络中的轨迹,文章末尾,我们提出了一种假设:同一个内核空间中的两个 socket 可以直接传输数据,是不是就可以省掉内核网络协议栈处理带来的延迟? 不论是同 pod 中的两个不同容器,或者同节点的两个 pod 间的网络通信,实际上都发生在同一个内核空间中,互为对端的两个 socket 也都位于同一个内存中。而在上篇文章的开头也总结了数据包的传输轨迹实际上是 socket 的寻址过程,可以进一步将问题展开:同一节点上的两个 socket 间的通信,如果可以 快速定位到对端的 socket – 找到其在内存中的地址,我们就可以跳过内核协议栈的环节进而加速数据包的传输。 互为对端的两个 socket 也就是建立起连接的客户端 socket 和服务端 socket,他们可以通过 IP 地址和端口进行关联。客户端 socket 的本地地址和端口,是服务端 socket 的远端地址和端口;客户端 socket 的远端地址和端口,则是服务端 socket 的本地地址和端口。 当客户端和服务端在完成连接的建立之后,如果可以使用本地地址 + 端口和远端地址 + 端口端口的组合 指向 socket,仅需调换本地和远端的地址 + 端口,即可定位到对端的 socket,然后将数据直接写到对端 socket(实际是写入 socket 的接收队列 RXQ,这里不做展开),就可以避开内核网络栈(包括 netfilter/iptables)甚至是 NIC 的处理。