混雜模式(Promiscuous Mode)是指一臺機器可以接收全部通過它的數據流,而不論其目的地址是不是它。是相對於一般模式(又稱「非混雜模式」)而言的。網絡
這被網絡管理員使用來診斷網絡問題,可是也被無認證的想偷聽網絡通訊(其可能包括密碼和其它敏感的信息)的人利用。性能
在雲計算openstack背景下,去混雜模式就是要抑制未知單播,只讓目的mac是自身的報文或者廣播/組播報文才容許進入虛擬機,減小沒必要要的虛擬機對報文處理所需的性能消耗。雲計算
未知單播,即設備MAC表中沒有該單播幀的目的MAC條目。spa
在交換機工做原理中,當交換機起動時,MAC地址表是空的,因此若是此時A主機發送一個幀給主機B,那麼當交換機接受此幀的時候,查看源地址(主機A),並將它添加到MAC地址表中,可是交換機並不知道主機B在哪一個端口上(MAC地址表中沒有主機B的MAC地址),因此這個幀就是 未知單播幀 。交換機會泛洪這個幀。code
混雜模式時,policy網橋流表相似"...actions=normal...",不對流量進行區別,按正常轉發便可。orm
去混雜模式時,policy網橋會添加如下相關流表:blog
priority=2,in_port=2,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,action=normal //廣播、組播報文正常轉發 priority=2,in_port=2,dl_dst=$vm_mac,actions=normal //對目的地址是VM自己mac的報文則正常轉發 prrority=1,in_port=2,actions=drop //其餘報文就丟棄
虛擬機之間通訊的vlan報文可以封裝到vxlan中在外部網絡中傳輸,相似於qinq(vlan in vlan)。ip
不帶vlan信息的報文,在pkt_mark作下標記後往下送,pkt_mark 信息存儲在寄存器中:ci
vlan_tci = 0x0000/0x1ffff actions=load:1 -> NXM_NX_PKT_MARK[31..31], normal
帶vlan的報文,將vlan信息(共12bit)保存在pkt_mark後往下送:虛擬機
actions = move:OXM_OF_VLAN_VID[0..11] -> NXM_NX_PKT_MARK[0..11], load: 0-> NXM_NX_PKT_MARK[31..31], strip_vlan, normal
pkt_mark爲0x1的報文,直接送往虛擬機:
pkt_mark = 0x00000001 actions = normal
pkt_mark不爲0x1的報文,從pkt_mark獲取到vlan信息後送往虛擬機:
actions = move:NXM_NX_PKT_MARK[0..11] -> OXM_OF_VLAN_VID[0..11], normal
pkt_mark爲0x1的報文,按正常流程直接走table 20/22 :
pkt_mark = 0x00000001, actions = resubmit(,20) / (,22)
pkt_mark不爲0x1的報文,獲取並設置vlan信息,設置vni後走vxlan隧道出主機:
actions = move:NXM_NX_PKT_MARK[0..11] -> OXM_OF_VLAN_VID[0..11], set_tunnel:0x1388, output:3
報文不帶vlan信息時,設置pkt_mark標誌後,按照正常流程走table 10:
vlan_tci = 0x0000/0x1fff, tunnel_id = 0x1388, actions = load:1 -> NXM_NX_PKT_MARK[31..31], resubmit(, 10)
報文帶vlan信息時,保存vlan信息到pkt_mark中,並將vxlan的vni修改成local vlan
tun_id = 0x1388, actions = move: OXM_OF_VLAN_VID[0..11] -> NXM_NX_PKT_MARK[0..11], load: 0->NXM_NX_PKT_MARK[31..31], mod_vlan_vid:1, resubmit(, 10)