《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——1.概述

简介: 《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——1.概述

网络通信的本质是电磁波高低电位变化在物理介质上的传输,高低变化的电位形成二进制的数据传递给网络硬件设备,硬件网络设备则会根据特定的编码方式讲二进制的数据变成以太网报文,此时,物理网络的信息就被解调制成为了数据帧,在OSI七层网络协议的定义中,二进制的数据处于物理层,而以太网数据帧则处于数据链路层,对于Linux内核来说,物理层和数据链路层之间的转换通常是由硬件设备的驱动完成,Linux内核定义了与硬件设备驱动通信标准,在完成数据链路层收包后,硬件网络设备会将数据帧传递给操作系统Linux内核进行处理,所以Linux网络协议栈源头是数据链路层数据帧报文

 

Linux内核在处理数据帧报文按照数据帧的分片,TSO等特性,将数据帧转化为可见的网络层报文,从而进行下一步的操作,内核在处理网络报文的时候,采用一种非常高效的方式:

 

内核通过一个sk_buff结构体,保存所有报文数据

在网络层处理后传递给传输层操作中,内核并不会为每一层进行复制,而是通过指针偏移方式处理同一个sk_buff结构体


 

下图是对Linux网络子系统的一个简单示意图:

 image.png


根据网络报文的流向,我们按照两个不同的方向对报文处理的流程进行概述。

 

1) 收包方向的报文处理

从上图中可以发现,当内核从网络驱动设备中获取到报文后:

 

首先进行TC子系统操作,在收包方向,不会有特别复杂操作

完成了网络层报文重组后,报文进入了网络层,在网络层处理中,比较重要是netfilter框架和路由查找,这里实现了大量功能,在云原生场景中,netfilter和路由子系统有着至关重要作用

网络层完成处理后,会交由传输层进行处理,传输层协议最常见是tcp和udp,其中tcp协议在传输层通过重传和序号校验等机制保证了连接可靠性

传输层完成处理后,内核会将真正报文数据提取出来并交给socket子系统,socket子系统抽象了网络所有操作,屏蔽了网络报文细节,让用户程序可以按照文件io方式读写网络数据

socket子系统数据最终会被用户程序读取,此时,一些编程语言底层依赖库会进行一些封装,提供应用层协议支持,如http,mqtt等,提供用户友好操作体验

 

2) 发包方向的报文处理

发包方向的处理,相比收包方向来说,一个重要的区别是,收包方向的操作是内核的软中断处理线程进行收包操作,而发包方向的操作则是由进程上下文进入内核态进行,因此,发包方向出现由于调度问题产生的偶发延迟抖动的概率比收包方向要小。

 

应用程序通常都是调用编程语言或者第三方的类库提供的方法进行发包动作,而这些发包动作最终都会调用socket子系统的写入调用来实现发送数据:

 

应用程序写入socket后,在达到一定条件,如内存充裕,tcp发送窗口足够等情况下,内核会给当前需要发送数据申请一个sk_buff结构体内存,并将需要发送数据填充到sk_buff数据中

sk_buff数据报文首先会经过传输层处理,根据当前系统状态,内核会给报文sk_bufftcp报头进行填充,然后调用网络层提供方法进行发送

网络层和收包方向类似,也会经历过netfilter框架选取路由动作,在这里实现了大量与网络抽象相关逻辑在网络层完成处理后,按照OSI七层网络定义,会进入数据链路层,实际上在Linux中,邻居子系统信息填充,也会在路由子系统完成路由选取后一并填入到报文报头中,随后报文会进入发送方向TC子系统

TC子系统是实现网络流量整形关键,和收包方向不同是,发包方向TC子系统会进行复杂排序工作,通过数据包类型与配置规则进行匹配,实现网络流控功能TC子系统会将优先级最高报文传递给网络设备驱动

网络设备驱动发送方法实现逻辑细节已经不再属于Linux内核范畴,通常在进入网络设备后,我们就可以认为数据包已经完成了发送

相关文章
|
15天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
2月前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
30天前
|
弹性计算 Kubernetes 网络协议
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
|
1月前
|
缓存 监控 测试技术
掌握容器化持续集成/持续部署(CI/CD)的最佳实践
【10月更文挑战第8天】本文介绍了容器化持续集成/持续部署(CI/CD)的最佳实践,涵盖容器化CI/CD的概念、优势和实施步骤。通过使用容器技术,可以实现环境一致性、快速迭代和易于扩展,提高软件开发的效率和可靠性。文章还详细讨论了编写高效的Dockerfile、自动化测试、安全性、监控和日志管理等方面的最佳实践。
|
1月前
|
Docker 容器
docker中检查容器的网络模式
【10月更文挑战第5天】
117 1
|
1月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
38 5
|
1月前
|
监控 Kubernetes 测试技术
掌握Docker网络模式:构建高效容器通信
【10月更文挑战第3天】本文深入探讨了Docker的网络模式,包括它们的工作原理、使用场景以及如何配置和优化容器间的通信。希望能够帮助开发者在项目中有效地应用Docker网络模式,构建高效的容器化应用。
|
2月前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
209 0
Docker跨宿主机容器通信-通过网络跨宿主机互联
|
2月前
|
运维 网络协议 搜索推荐
内核网络小白之故障寻踪记
本文记述了一次由 skb(socket buffer)异常导致的内核故障排查过程。
|
2月前
|
Kubernetes Linux 虚拟化
一文详解容器技术简介和基本原理
本文全面阐述了容器技术的发展历程、关键技术、架构和当前的行业生态,特别是容器技术在云环境中的应用和演进。