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

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. 如何在iOS上实现对HTTPS的支持(转)

    原文地址:http://blog.5ibc.net/p/101504.html 首先,需要明确你使用HTTP/HTTPS的用途,因为OSX和iOS平台提供了多种API,来支持不同的用途,官方文档< ...

  2. 一款基于jQuery的热点新闻Tab选项卡插件

    今天要分享的jQuery焦点图插件非常适合展示热点新闻,之前我们分享过好多基于jQuery的焦点图插件,效果都还很不错.它可以在图片上方展示文字标题,并且焦点图的切换按钮时tab风格的,图片切换也十分 ...

  3. oozie常见错误问题

    1.  Error: HTTP error code: 404 : Not Found 原因: 在环境变量中配置的OOZIE_URL有问题配置成了 export OOZIE_URL=http://dw ...

  4. ASP.NET MVC4 异常拦截

    ASP.NET MVC4 程序发生异常时,通过拦截Action的异常,重写ActionFilterAttribute 的方法OnActionExecuted实现. 具体实现代码如下: /// < ...

  5. 【BZOJ】1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛(lis)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1669 水题太严重 #include <cstdio> #include <cstr ...

  6. 一个简单的ServletContextListener示例

    ServletContext可以初始化String类型的参数.但是,如果你希望应用初始化参数是一个数据库DataSource呢?上下文参数只能是String.毕竟,你不能把一个Dog对象塞到XML部署 ...

  7. nginx提高加载静态文件速度

    1.本来对于静态网页,我们不需要放在应用容器中,原因一时由于应用服务器是用来解析动态网页的,针对静态网页本来就性能不高,而且还会占用应用容器的资源,所以我们专门使用nginx用来解析静态网页.     ...

  8. 详说 CSS 清除浮动

    转自:http://kayosite.com/remove-floating-style-in-detail.html 浮动,从诞生那天起,它就是个特别的属性——既为网页布局带来新的方法,却又随之产生 ...

  9. 160309、Spring AOP操作action时无法注入,报空指针错误

    今天帮同事看个问题,action注入失败,代码没问题,主要是stuts2权限移交的问题,特此记录一下 Spring AOP操作action时无法注入,报NullPointer异常 当使用Spring ...

  10. Python--paramiko库:连接远程服务器操作文件

    import paramikofrom loggingutils.mylogger import logger as log class SSHConnection(object): def __in ...