首页 > 系统相关 >Linux Bridge和Tap关系详解

Linux Bridge和Tap关系详解

时间:2024-04-30 09:55:45浏览次数:17  
标签:Bridge Tap 端口 MAC Linux 数据包 设备

本文分享自天翼云开发者社区《Linux Bridge和Tap关系详解》,作者:x****n

Linux Bridge介绍

Bridge(桥)是Linux上用来做TCP/IP二层协议交换的设备,与现实世界中的交换机功能相似。Bridge设备实例可以和Linux上其他网络设备实例连接,既attach一个从设备,类似于在现实世界中的交换机和一个用户终端之间连接一根网线。当有数据到达时,Bridge会根据报文中的MAC信息进行广播、转发、丢弃处理。

如图所示,Bridge的功能主要在内核里实现。当一个从设备被attach到Bridge上时,相当于现实世界里交换机的端口被插入了一根连有终端的网线。这时在内核程序里,netdev_rx_handler_register()被调用,一个用于接受数据的回调函数被注册。以后每当这个从设备收到数据时都会调用这个函数可以把数据转发到Bridge上。当Bridge接收到此数据时,br_handle_frame()被调用,进行一个和现实世界中的交换机类似的处理过程:判断包的类别(广播/单点),查找内部MAC端口映射表,定位目标端口号,将数据转发到目标端口或丢弃,自动更新内部MAC端口映射表以自我学习。

Linux内核支持网口的桥接(目前只支持以太网接口)。但是与单纯的交换机不同,交换机只是一个二层设备,对于接收到的报文,要么转发、要么丢弃。小型的交换机里面只需要一块交换芯片即可,并不需要CPU。而运行着Linux内核的机器本身就是一台主机,有可能就是网络报文的目的地。其收到的报文除了转 发和丢弃,还可能被送到网络协议栈的上层(网络层),从而被自己消化。

网桥的功能

概括来说,网桥实现最重要的两点:

1.MAC学习:学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据,它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端口的对照表(CAM表)。

2.报文转发:每发送一个数据包,网桥都会提取其目的MAC地址,从自己的地址-端口对照表(CAM表)中查找由哪个端口把数据包发送出去。

网桥配置ip

Bridge可以设置IP地址,当一个bridge0拥有IP后,Linux便可以通过路由表或者IP表规则在三层定位bridge0,此时相当于Linux拥有了另外一个隐藏的虚拟网卡和Bridge的隐藏端口相连。当一个设备被attach到Bridge上时,那个设备的IP会变的无效,Linux不再使用那个IP在三层接受数据。

对于一个被attach到Bridge上的设备来说,只有它收到数据时,此包数据才会被转发到Bridge上,进而完成查表广播等后续操作。当请求是发送类型时,数据是不会被转发到Bridge上的,它会寻找下一个发送出口。

网桥处理包原则

网桥需要维护一个MAC地址-端口映射表(CAM),端口是指网桥自身提供的端口,而MAC地址是指与端口相连的另一端的MAC地址。

网桥处理包遵循以下几条原则

1.在一个接口上接收的包不会再在那个接口上发送这个数据包;

2.每个接收到的数据包都要学习其源地址;

3.如果数据包是多播或广播包,则要在同一个网段中除了接收端口外的其他所有端口发送这个数据包,如果上层协议栈对多播包感兴趣,则需要把数据包提交给上层协议栈;

4.如果数据包的目的MAC地址不能再CAM表中找到,则要在同一个网段中除了接收端口外的其他所有端口发送这个数据包;

5.如果能够在CAM表中查询到目的MAC地址,则在特定的端口上发送这个数据包,如果发送端口和接收端口是同一端口则不发送。

Tap设备介绍

TAP设备是一种让用户态程序向内核协议栈注入数据的设备,工作在二层。做为虚拟网卡驱动,Tap驱动程序的数据接收和发送并不直接和真实网卡打交道,而是通过用户态来转交。Tap驱动是利用设备文件实现用户态和核心态的数据交互。

从结构上来说,Tap驱动并不单纯是实现网卡驱动,同时它还实现了字符设备驱动部分。以字符设备的方式连接用户态和核心态。下面是示意图: 

Tap驱动程序中包含两个部分,一部分是字符设备驱动,还有一部分是网卡驱动部分。利用网卡驱动部分接收来自TCP/IP协议栈的网络分包并发送或者反过来将接收到的网络分包传给协议栈处理,而字符驱动部分则将网络分包在内核与用户态之间传送,模拟物理链路的数据接收和发送。Tap驱动很好的实现了两种驱动的结合。

Tap驱动处理流程 

如图所示,当一个TAP设备被创建时,在Linux设备文件目录下将会生成一个对应char设备,用户程序可以像打开普通文件一样打开这个文件进行读写;Linux protocol statck是Linux内核的tcp/ip协议栈。当执行write()操作时,数据进入TAP设备,此时对于Linux网络层来说,相当于TAP设备收到了一包数据,请求内核接受它,如同普通的物理网卡从外界收到一包数据一样,不同的是其实数据来自Linux上的一个用户程序。Linux收到此数据后将根据网络配置进行后续处理,从而完成了用户程序向Linux内核网络层注入数据的功能。当用户程序执行read()请求时,相当于向内核查询TAP设备上是否有需要被发送出去的数据,有的话取出到用户程序里,完成TAP设备的发送数据功能。针对TAP设备的一个形象的比喻是:使用TAP设备的应用程序相当于另外一台计算机,TAP设备是本机的一个网卡,他们之间相互连接。应用程序通过read()/write()操作,和本机网络核心进行通讯。

标签:Bridge,Tap,端口,MAC,Linux,数据包,设备
From: https://www.cnblogs.com/developer-tianyiyun/p/18164122

相关文章

  • Linux基础——主机域名解析默认使用IPV6路由
    一、问题描述主机访问内网存储网段,发现域名默认解析的IPV6地址。ping访问ipv4地址正常通讯。主机本地解析/etc/resolv.conf的DNS配置正常。#ping域名默认解析IPV6地址Pingnasgroup.xxxx.xxxx.com#pingipv4地址正常ping-4nasgroup.xxxx.xxxx.com#查看本地DNS配......
  • 在Linux中,如何使用vmstat和iostat命令?
    在Linux中,vmstat和iostat是两个非常有用的命令行工具,用于监控系统的性能,尤其是CPU使用率、内存使用情况、磁盘I/O以及进程状态。下面分别详细介绍这两个命令的使用方法。1.vmstat命令格式:vmstat[选项][时间间隔][次数]常用选项:不带选项时,vmstat默认显示自从系统......
  • linux遇到的问题
    1:红帽8添加另外一种类型的磁盘时,会遇到重装系统的问题原因:系统扫描硬盘的先后顺序不一样,所导致的如果添加的是同一种类型的磁盘的话,就不会出现重装系统的问题了如果添加其他的类型的磁盘的话,要进入到bios里面修改磁盘的优先级解决方法:1)先进入到bios里面2)找到boot选项卡,ha......
  • 在Linux中,如何监控系统资源使用情况?
    在Linux中,监控系统资源使用情况对于系统管理员来说是一项重要的任务,它有助于确保系统性能和及时发现潜在的瓶颈。以下是一些常用的命令和工具,用于监控不同类型的系统资源:1.CPU使用情况top:实时显示系统中各个进程对CPU资源的使用状况。tophtop:top的增强版本,提供了彩色界......
  • 在Linux中,如何在Linux中查看当前路径?
    在Linux中,查看当前工作目录(即你当前所在的目录)可以通过几种不同的命令实现。以下是一些常用的方法:1.使用pwd命令pwd(PrintWorkingDirectory)命令用于显示当前工作目录的完整路径。pwd2.使用echo命令echo命令可以输出环境变量的值,其中$PWD环境变量包含了当前工作目......
  • 在Linux中,如何监控磁盘I/O性能?
    在Linux中,可以使用iotop和iostat命令来监控磁盘的I/O性能。以下是如何使用这两个工具以及它们各自的特点:使用iotop命令:iotop是一个实时显示系统磁盘活动的工具,类似于top命令,但专注于I/O活动。它能够展示每个进程或线程的实时I/O使用情况,包括读写带宽,以及等待I/O操作所花费的时......
  • 在Linux中,如何使用top和htop命令?
    在Linux中,top和htop是两个用于实时监控系统资源使用情况的命令行工具,尤其是CPU、内存以及进程信息。下面详细介绍这两个命令的使用方法:1.top命令启动:打开终端,输入top命令并回车。这将立即显示一个实时更新的系统资源使用概览。界面解读:屏幕顶部显示了系统运行时间......
  • Linux中atime,ctime与mtime的细节疑问总结
    在Linux文件系统中,每一个文件都有三个时间属性,它们分别是atime,mtime,ctime,一般来说,atime比较好理解,但是很多时候,我们往往会混淆mtime和ctime这两个时间属性,或者搞不清楚两者的区别。在展开介绍之前,我们先来看看如何查看文件的atime,mtime,ctime属性。下面简单介绍一下:查看atim......
  • Linux 初始化 init 系统
    目录Linux操作系统的启动流程:BIOS(或UEFI)启动:当计算机加电时,BIOS(基本输入输出系统)或更现代的UEFI(统一可扩展固件接口)会执行一系列的自检(POST,Power-OnSelfTest),以确保硬件正常工作。随后,BIOS/UEFI会根据用户设置的启动顺序来定位并加载引导设备(如硬盘、USB驱动器或网络)上的主......
  • Linux日志工具---journalctl
    目录确实如此,Linux系统中的日志系统是维护系统健康、安全和性能的关键组成部分。自从systemd成为众多Linux发行版的默认初始化系统以来,journalctl成为了管理和查询这些系统日志的主要工具。journalctl是与systemd-journald日志系统配套的命令行实用程序。systemd-journald......