注册博客园已经好长时间,一直以来也没有在上面写过文章,都是随意的记录在了未知笔记上,今天开始本着分享和学习的精神想把之前总结的笔记逐步分享到博客园,和大家一起学习,一起进步吧!

2016-09-20  17:11:05

其实之前已经有分析过网桥的原理,但是当时对其理解还是局限于表面,对于其本身的实现原理并没有结合linux源代码进行分析,那么本次实际上是要分析qemu对于网卡的模拟,那么 从源头来说,首先分析下桥接模式下数据是如何转发的。

既然说到了桥接就不得不提到一个数据链路层设备------网桥。在计算机网络中,网桥作为一个网络设备应用也许并没有那么广泛。但是作为它的扩展---交换机就显得火的多了。交换机其本质就是相当于一个多端口的网桥,大多数交换机是工作在数据链路层即L2层,但目前三层交换机也逐步浮出水面。在本片文章中我们说讨论的仅仅是普通的二层交换机。
交换机既然工作在链路层,那么其必定要比工作在物理层的集线器高明一点。即其转发是基于帧的转发,交换机可以提取到每个帧 的源MAC和目的MAC,并且其本身会维护一个转发表,表内包含有MAC地址和其相应端口的映射。交换机收到一个帧之后的处理流程如下:
1、每当交换机收到一个帧,就提取出帧的源MAC,然后查找转发表,表中若没有这一项,就把该地址和进入的端口写入转发表,若存在,就更新!
2、然后提取目的MAC,查找转发表,表中若有对应的项,就从对应的端口转发出去,若没有,就从除了接受该帧的所有端口转发出去。
上面是对网桥(交换机基本原理的介绍),下面就谈谈LInux内核中对这一特性的支持。
首先在桥接模式下,网卡需要设置成混杂模式。即接收所有到达的数据包,不管目的地址是否是网卡的MAC。
在软件方面,就要依赖与Linux内核中的Tun/Tap驱动了。
Tun/Tap驱动详解
Tun/Tap 用于虚拟网络设备,Tun虚拟网络层的设备,而Tap虚拟数据链路层的设备。所以Tun/Tap驱动提供一种功能,即可以通过这种驱动创建接口(Tun/Tap),通过这些接口可以在内核和用户空间传送网络数据包,其中Tun类型的接口可以传送IP数据包即从链路层交付上来的包,不包含以太网头。Tap接口可以传送以太网数据帧,就是链路层的包。
Tun/Tap驱动包含两个部分,一个是网卡驱动,一个是字符设备驱动。网卡驱动接收来自TCP/IP 协议栈的网络分包并发送或者反过来将接收到的网络分包传给协议栈处理;而字符驱动部分则将网络分包在内核与用户态之间传送,模拟物理链路的接收和发送。Tun/Tap 驱动的字符设备驱动部分向用户态暴漏了一个接口/dev/net/tun,其实是一个字符设备文件,用户空间的应用程序可以通过这个设备文件来和内核中的驱动程序进行交互,其操作方式和普通的文件操作无异。
回想下连接一台交换机的PC机和外网交互的流程。一下几个条件是必须的:
1、交换机上行端口--------用于连接外网
2、交换机下行端口--------用于连接交换机下面的各个PC机
3、网线
4、PC机(物理网卡)
 
外部数据通过交换机上行端口进入交换机,交换机工作在数据链路层,对数据帧提取MAC地址,首先进行地址学习后,就进行数据帧的转发,这里根据地址表中是否包含做出不同的选择,这不是重点,不在赘述。
然后数据帧通过网线到达PC机的物理网卡,然后系统就根据协议栈对数据包进行逐层处理最后交付了。
 
那么上述情况迁移到虚拟化环境下,即在一台LInux host上运行的虚拟机,如何通过LInux bridge上网?
其必要条件仍然有效,只不过需要采用另一种方式而已,见下图
 
通过查看上图,我们不难发现,虽然迁移到了虚拟化的环境下,前面提到的四个条件依然存在
1、上行网络接口--------这里表现为host的物理网卡,主要用以和外网交互
2、Tap接口---------这里就是虚拟出的网络设备,称之为Tap device,这里就是作为bridge的一个端口,连接虚拟机的虚拟网卡。
3、虚拟网线---------这里主要表现为一个设备文件/dev/net/tun ,用户程序和Tap接口交互就是通过这个设备文件,从功能上来讲就是类似于一个网线。
4、虚拟网卡----------这里就是从客户端的角度,一台虚拟机要发送和接收网络数据包必定需要虚拟网卡
LInux内部实现的bridge可以把一台机器上的多张网卡桥接起来,从而把自己作为一台交换机。同时,LInux bridge还支持虚拟端口,即桥接的不一定都是物理网卡接口,还可以是虚拟接口。目前主要表现为Tap接口,Tap接口在逻辑上和物理网卡实现相同的功能,都可以接收和发送数据包。所以这一应用也成就了虚拟化环境下的bridge实现。
到此基础理论知识就介绍完了,那么接下来就结合Linux源代码分析下桥接模式下数据包的转发流程。

Linux下桥接模式详解2

 

Linux下桥接模式详解一的更多相关文章

  1. LInux下桥接模式详解二

    上篇文章导入博客园的比较早,而这篇自己在写的时候才发现内部复杂的很,以至于没能按时完成,造成两篇文章的间隔时间有点长! 话不多说,言归正传! 前面的文章介绍了桥接模式下的基础理论知识,其实本节想结合L ...

  2. LInux下桥接模式详解三

    上篇文章介绍了Linux内核桥接模式涉及到的几个结构,本节就重点放在数据包的处理上! 本节所有代码参考LInux 3.10.1内核! 前面已经提到一个数据包从网卡流到Linux内核中的L2层,最终被交 ...

  3. Linux网络配置:Nat和桥接模式详解

    Linux网络配置:Nat和桥接模式详解 一.我们首先说一下VMware的几个虚拟设备: Centos虚拟网络编辑器中的虚拟交换机: VMnet0:用于虚拟桥接网络下的虚拟交换机: VMnet1:用于 ...

  4. linux下tar命令详解

     linux下tar命令详解    tar是Linux环境下最常用的备份工具之一.tar(tap archive)原意为操作磁带文件,但基于Linux的文件操作机制,同样也可适用于普通的磁盘文件.ta ...

  5. Linux下chkconfig命令详解(转)

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  6. Linux知识积累(4) Linux下chkconfig命令详解

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  7. Linux下top命令详解

    Linux下top命令详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不断刷 ...

  8. 转载的 Linux下chkconfig命令详解

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  9. Linux下ps命令详解 Linux下ps命令的详细使用方法

    http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

随机推荐

  1. 基于jQ+CSS3页面滚动内容元素动画特效

    今天给大家分享一款基于jQ+CSS3页面滚动内容元素动画特效.这是一款基于jQuery+CSS3实现的页面滚动代码.该实例适用于适用浏览器:360.FireFox.Chrome.Safari.Oper ...

  2. LeetCode -- 推断链表中是否有环

    思路: 使用两个节点.slow和fast,分别行进1步和2步.假设有相交的情况,slow和fast必定相遇:假设没有相交的情况,那么slow或fast必定有一个为null 相遇时有两种可能:1. 仅仅 ...

  3. C语言 · 求存款

    算法提高 3-2求存款   时间限制:1.0s   内存限制:256.0MB      问题描述 见计算机程序设计基础(乔林)P50第5题. 接受两个数,一个是用户一年期定期存款金额,一个是按照百分比 ...

  4. 关于Unity中场景视图的使用

    1.在任何状态下,按下鼠标中键可以切换到手掌的那个状态,可以移动当前场景 2.在手掌的那个状态,按住鼠标左键是移动场景视图,右键是视角绕着摄像机移动,按住alt+鼠标左键,是绕着指定物体旋转视角 3. ...

  5. qt 使用多个ui文件

    一般的QT工程只有一个ui,本文记录如何在一个工程中使用多个ui文件. 参考链接: http://www.cnblogs.com/lc-cnblong/p/3182903.html 创建方法,鼠标在工 ...

  6. java.util下有一个Comparator(比较器)

    java.util下有一个Comparator(比较器) 它拥有compare(),用来比较两个方法. 要生成比较器,则用Sort中Sort(List,List(Compate)) 第二种方法更灵活, ...

  7. hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)

    还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  8. gcc安装(centos)

    gcc 4.8 安装 [root@DS-VM-Node239 ~]# curl -Lks http://www.hop5.in/yum/el6/hop5.repo > /etc/yum.repo ...

  9. web版pdf在线阅读器

    近期论坛里有人提到了,在线pdf阅读器怎么做.我百度了一下,发现非常多人都非常懒.程序猿都非常懒吗? 答案是否定的. 为什么都不愿意去搜索一下呢.网上非常多答案的.我这里就列举一例.大家共勉. 看代码 ...

  10. iOS开发之 -- bundle程序束的制造

    我们在写项目的时候,需要添加大量的图片,这个时候除了在x-code-->Assets文件里面添加图片外,还可以添加程序束,这样的话 项目看起来比较整齐,也显得比较专业,下面就来说一下程序束的制造 ...