Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55780
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 67
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-22 13:29
文章分类

全部博文(4)

文章存档

2015年(4)

我的朋友

分类: 虚拟化

2015-05-31 21:57:32

        相比于中继器,网桥能够解析它收发的数据,读取目标地址信息,并决定是否向所连接网络的其他网段转发数据包。由于网桥工作在二层,因此将学习数据包的源MAC地址,建立mac-port的映射表。
          网桥中的每个端口实际上就是一个冲突域的结束点,每个冲突中时刻只能有一个节点发送数据包。网桥的所有端口都在同一个广播域内,因为每个节点都能收到广播包。
         
            在Linux的实现版本中(本文先考虑STP 协议),主要数据结构如下:
            逻辑网段:net_bridge
          端口:net_bridge_port
          CAM表:net_bridge_fdb_entry
          统计数据和STP信息,
           它们的关系图如下
            
          
                
              网桥处理包遵循着以下几条原则:            
  1. 在一个接口上接收到的包不会再在那个接口上发送这个数据包。
  2. 每个接收到的数据包都要学习其源MAC地址。
  3. 如果数据包是多播包或广播包,则要在同一个网段中除了接收端口外的其他所有端口发送这个数据包,如果上层协议栈对多播包感兴趣,则需要把数据包提交给上层协议栈。
  4. 如果数据包的目的MAC地址不能在CAM表中找到,则要在同一个网段中除了接收端口外的其他所有端口发送这个数据包。
  5. 如果能够在CAM表中查询到目的MAC地址,则在特定的端口上发送这个数据包,如果发送端口和接收端口是同一端口,则不发送。

       
     bridge处理数据包从函数br_handle_frame开始:它在设备被添加到br时初始化为了:err=netdev_rx_handler_register(dev,br_handle_frame,p),并生成了一个端口net_bridge_port;
     若MAC地址为本身,br_handle_local_finish函数为提交给上层,内部调用了br_fdb_update更新CAM表
     br_handle_frame_finish 函数为转发流程:
    1.若bridge为混杂模式,需拷贝一份到上传一份到上层。
    2.若为广播包也许上传
    3.若为多播包,或能找到多播CAM,则上传一份大上层,且多薄该包;若不能找到,到下文flood
    4.单播包查询CAM,若能转发则直接抓发,否则flood
    

    数据包处理流程图为:
    
    
    配置实验,拓扑图如下
2013-02-29-linux-network-emulator__1.png

点击(此处)折叠或打开

  1. #!/bin/sh
  2. echo "create net namespace net0 net1 bridge"
  3. ip netns add net0
  4. ip netns add net1
  5. ip netns add bridge
  6. echo "add a veth-pair in net0 and bridge"
  7. ip link add type veth
  8. ip link set dev veth0 name net0-bridge netns net0
  9. ip link set dev veth1 name bridge-net0 netns bridge
  10. echo "add a veth-pair in net1 and bridge"
  11. ip link add type veth
  12. ip link set dev veth0 name net1-bridge netns net1
  13. ip link set dev veth1 name bridge-net1 netns bridge
  14. echo "create bridge and set it"
  15. ip netns exec bridge brctl addbr br
  16. ip netns exec bridge ip link set dev br up
  17. ip netns exec bridge ip link set dev bridge-net0 up
  18. ip netns exec bridge ip link set dev bridge-net1 up
  19. ip netns exec bridge brctl addif br bridge-net0
  20. ip netns exec bridge brctl addif br bridge-net1
  21. echo "config net0-bridge"
  22. ip netns exec net0 ip link set dev net0-bridge up
  23. ip netns exec net0 ip address add 10.0.4.5/24 dev net0-bridge
  24. echo "config net1-bridge"
  25. ip netns exec net1 ip link set dev net1-bridge up
  26. ip netns exec net1 ip address add 10.0.4.1/24 dev net1-bridge
  27. echo "test and ping"
  28. ip netns exec net0 ping 10.0.4.1 -c 5
  29. ip netns exec bridge brctl show
  30. echo "show arp in bridge"
  31. ip netns exec bridge arp
  32. echo "show arp in net0"
  33. ip netns exec net0 arp
  34. echo "show arp in net1"
  35. ip netns exec net1 arp
     执行结构可见到netns bridge中arp 表为空,因为它仅工作在链路层.
     若给br 也配置,那么我们也能对它进行访问,即属于is_local

    
阅读(2476) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~