知识卡片
Linux网络栈几乎全在内核空间的安全权衡
内容
Linux网络通信呈现”逐层调用、逐层封装”的栈结构(Socket→TCP/UDP→IP→ Device→Driver),因此被称为”网络栈”。这套栈几乎整个都运行在系统内核 空间——发送时应用层数据经Socket接口进入内核,被逐层封装成TCP Segment、 IP数据包、以太帧,才交给网卡驱动发出;接收则是相反方向的逐层解包。把 应用层以下的处理都放进内核,主要是出于数据安全隔离的考虑:由内核统一 处理报文收发,能保证一个应用程序无法窃听或伪造另一个应用程序的通信 内容。这个设计的代价是执行开销更高——数据要在内核态和用户态之间反复 复制,会损失一部分性能。对特别看重收发性能的场景(如高频交易、高性能 网关),也存在绕开内核网络栈、直接在用户空间实现全套协议栈的旁路方案, 如开源的Netmap和Intel的DPDK,能做到零复制收发数据包。这个权衡揭示了 一个通用原则:把处理逻辑放进内核换来的是安全隔离和统一管控,代价是 性能损耗;反过来把处理逻辑挪到用户态能换回性能,但要自己承担原本由 内核提供的隔离保障——是否值得绕过内核,取决于具体场景对性能和安全 隔离的相对权重。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第12章"容器间网络"12.1.1节
"网络通信模型"(源文件:_epub-src对应OEBPS/Text/chapter145.xhtml)
- 结论依据:原文说明网络栈应用层以下几乎全部位于内核空间、是出于数据
安全隔离考虑,代价是内核态用户态复制的性能损耗,并举例Netmap、DPDK
这类用户空间旁路方案能做到零复制,直接支撑本卡片结论。
- 原始内容:几乎整个网络栈(应用层以下)都位于系统内核空间之中……
由内核去处理网络报文的收发,无疑会有更高的执行开销……但是能够保证
应用程序无法窃听或者伪造另一个应用程序的通信内容。