지난 포스팅에 이어서, 비교적 빠르게 이틀정도만에 새로운 포스팅을 하게되었습니다.
이번 내용은 FabricPath에서의 Packet Flow에 대한 대략적인 사항입니다.
그 동안 포스팅 전 단계로 정리했던 자료들이 있어서, 포스팅을 위해 조금 더 보완하면 그래도 예전보다는 조금이나마
자주 포스팅할 수 있지 않을까? 싶습니다.......만..
다른 것들도 해야할 것들이 있어서.. 어찌될지.. 모르겠네요. ^^;
내용 중에 이상한 점이나, 수정해야할 사항 있으시면 덧글 부탁드립니다.
Broadcast ARP Request
1. Host A가 Host B와 같은 Subnet에 존재한 상태에서 통신하고자 할 때, Host A는 Host B와 통신하기 위해서, Host B IP Address로
ARP Request를 보내게 되고, 이는 Host A의 Source MAC와 all-ones broadcast destination MAC(FFFF.FFFF.FFFF)로 설정되어
전송한다.
2. S500의 FabricPath Edge Switch는 FabricPath mode VLAN으로 설정된 e1/13 edge port에서 Frame을 수신한 후에
source/destination MAC-Address를 Table에서 Lookup한다.
{VLAN 10, MAC A}에 대한 Source MAC Lookup이 실패하고, S500의 Forwarding Engine에서 e1/13에 대한 MAC 정보를
Local Entry로
무조건 학습하게 된다
NX-OS 6.1(2) 혹은 6.2(2) {F2/F2E & F1 모듈) 이전에서는 MAC A는 오직 Frame이 들어오는 Interface, 즉 여기서 e1/13의
Forwarding Engine ASIC에서만 학습을 하고, 다른 Forwarding Engine 에서는 MAC A에 대해서는 학습을 하지 않는다.
NX-OS 6.1(2) 혹은 6.2(2) 이후 버전에서는 MAC A는 FabricPath core port의 모든 Forwarding Engine과 동기화된다.
Destination MAC은 VLAN 10으로 Flooding 되며, S100은 FabricPath로 Encapsulation하여 Multi-destination으로 Flood한다.
3. S500은 Broadcast Frame을 전송하기 위해 Multi-Destination Tree를 선택한다.
FabricPath Switch에서 broadcast/non-IP multicast, unknown unicast Traffic에 대해 어떤 Tree로 전송을 할지에 대해서 hash 함수에
의해 결정한다. (Hash의 Default로 설정은 Source/Destination IP, Layer 4 Port 이다.)
그러나, F1 Module에서는 항상 broadcast/non-IP multicast, unknown unicast Traffic에 대해 Tree 1을 통해서 전송을 한다.
(VPC+ 예외)
예제에서 FabricPath Header를 구성하는 Frame은 다음과 같은 구성 요소를 가진다.
- Outer DA : Broadcast를 전송 시에는 All-ones Broadcast MAC의 동일한 값으로 설정하게 된다.
- Outer SA : SID-500 / sSID – 0 (vPC+를 사용안함) / LID – 12 (e1/13 포트. 0부터 13번째 값)
- FabricPath TAG : EtherType - FabricPath (0x8903) / FTAG – 1 / TTL - 32
4. FabricPath-Encapsulation된 Frame은 neighbor switch로 전송되고, S10에서는 Frame을 Lookup 한다.
S10은 FabricPath의 Header 값에 이미 Broadcast로 설정되어 있고 Ftag값도 결정되어 있기 때문에 이를 기준으로 Forwarding을 한다.
S10에서 Ftag 1(Tree 1)에 대한 경로는 Po 500, 600, 700이 있기 때문에 이 쪽으로 Frame을 전송하면서 TTL 값을 1 낮춘다.
S10에서는 어떠한 Mac 학습도 하지 않는다.
5. S600, S700에서는 각각 S10에서 보내온 FabricPath-Encapsulation된 Frame을 받게 된다.
S600에서는 Tree 1에 속한 다른 Interface에가 존재하지 않기 때문에 더 이상 FabricPath에 의한 Flood를 하지 않는다. 만약 VLAN 10에
대한 FabricPath Edge Port가 있는 경우에는 FabricPath Header를 De-capsulation한 후에 Edge Port로 Original Broadcast Ethernet
Frame을 Flood 한다. S200에서는 어떠한 MAC도 학습하지 않는다.
S700에서는 Tree 1에 속한 Interface가 po 20, 30, 40이 있기 때문에 해당 Interface로 Frame의 TTL 을 1 낮춘 이후에 다시 전송을 한다.
S700도 마찬가지로 이 과정에서 어떠한 MAC도 학습하지 않는다.
S20, S30, S40은 Tree 1에 대한 Interface가 존재하지 않기 때문에 S600과 마찬가지로 FabricPath에 의한 Flood를 하지 않으며,
VLAN 10에 대한 Interface도 없기 때문에 해당 Frame은 Discard 된다. 마찬가지로 MAC 학습은 하지 않는다.
6. S700은 Fabricpath Header를 De-capsulation한 후에 Edge Port로 Original Broadcast Ethernet Frame을 Flood한다.
이 예에서는 Host A에 대한 Broadcast ARP에 대해서 Host B가 응답을 하게 되고, S700은 S500에 대한 MAC을 학습하게 된다
7. Host A로 부터 Broadcast ARP를 전송받은 Host B는 Source MAC은 자신의 MAC, Destination MAC은 Host A의 MAC으로 하여
Standard Ethernet frame으로 unicast ARP Reply를 보낸다.
8. S700은 Fabricpath-mode vlan 10으로 설정된 FabricPath Edge port에서 Frame을 수신 받고, Source/Destination Mac Address
Table 을 Lookup한다. {VLAN 10, MAC B}에 대한 Source MAC Lookup이 실패하고 , S700의 Forwarding Engine에서 e2/29에
대한 MAC 정보를 Local Entry 정보로 무조건 학습하게 된다
{VLAN 10, MAC A}에 대한 Destination MAC Lookup도 실패하게 되며, 이는 VLAN 10에 대해 Forwarding Engine이
unknown unicast로 S700의 Vlan 10 Edge Port와 Multi-Destination Tree로 각각 Flood한다.
9. S700이 unknown unicast frame을 전송하기 위해서 Tree 1을 선택했다고 가정을 하여, 해당 Frame을 Tree 1의 Interface인
Po 10, 20, 30, 40 으로 전송을 한다.
예제에서 FabricPath Header를 구성하는 Frame은 다음과 같은 구성 요소를 가진다.
- Outer DA : unknown unicast frame을 위해 reserved multicast MAC Address(010F.FFC1.01C0, MC1이라고도 함)로 설정
- Outer SA : SID-700 / sSID – 0 (vPC+를 사용안함) / LID – 64
- FabricPath TAG : EtherType - FabricPath (0x8903) / FTAG – 1 / TTL - 32
10.FabricPath-Encapsulation된 Frame은 인접 FabricPath Switch인 S10, S20, S30, S40으로 전송 된다.
S20, S30, S40은 Tree 1으로 구성된 추가적인 Interface도 없으며, Vlan 10에 대한 Interface도 없기 때문에 Frame은 Discard되며
Mac Address도 학습하지 않는다.
S10에서는 Tree 1에 대한 2개의 Interface (Po500, Po600)이 있기 때문에 TTL을 1감소 시키고 해당 Interface로 전송한다.
11. S500, S600은 FabricPath-Encapsulation된 Frame에 대해서 Lookup을 수행한다. S600에서는 더 이상 Tree 1에 속한 Interface에
없기 때문에 Multi-Destination에 대한 전송을 종료된다. 만약 Vlan 10에 대한 Edge Port가 존재할 경우에는 Fabricpath Header를
De-capsulation한 후에 Edge Port로 Original Broadcast Ethernet Frame을 Flood한다. S600은 이 과정에서 어떠한 MAC도 학습하지
않는다.
12. S500에도 Tree 1에 속한 Interface가 없기 때문에 Multi-Destination에 대한 전송을 종료된다. S500에는 Vlan 10에 대한 Edge Port
가 있기 때문에 Fabricpath Header를 De-capsulation한 후에 해당 Edge Port로 Original Broadcast Ethernet Frame을 Flood한다.
각 Egress Forwarding Engine에서는 DMAC에 대해서 Local MAC Address로 이미 학습되어 있는지 MAC Lookup을 하고,
만약 존재한다면 Outer SA의 값으로 SMAC 정보를 Remote MAC Entry로 학습하게 된다. Host A의 Forwarding Engine ASIC에서는
inner DMAC(MAC A)에 대한 정보가 Local Entry로 이미 학습되어 있기 때문에 Inner SMAC(MAC B)에 대한 정보는 Outer SA의 정보
(SID/sSID/LID) 700.0.64로 학습하게 된다..
13. Host B로부터 unicast ARP Reply를 받게 되면, Host A는 Host B로 바로 Unicast를 전송할 수 있다. 이러한 Unicast 전송은 기존과
마찬가지로 Standard Ethernet frame으로 Host A를 source MAC (SMAC)으로, Host B를 Destination MAC(DMAC)으로 설정한다.
14. S500은 FabricPath-mode Vlan 10의 Edge port에서 frame을 수신 받고, 이 Frame에 대해서 Source/Destination MAC Address에
대해서 MAC-Address Table을 Lookup한다.
{VLAN 10, MAC A}에 대한 Source MAC lookup 시에는 이미 기존 Table에 학습되어 있기 때문에 Lookup이 되면서, Mac A에 대한
Aging Timer를 Update하게 된다.
{VLAN 10, MAC B}에 대한 Destination MAC Lookup 또한 기존의 SID,sSID, LID로 구성된 Remote 정보(700.0.64)로 Lookup을 한다.
15. Forwarding Engine에서는 목적지 Host B로 전송하기 위해 Lookup정보를 기반으로 Switch 700에 대한 Routing Lookup을 한다.
S500에서 S700으로 가기 위한 Next-hop Interface로는 S10, S20, S30, S40가 있으며 이들은 모두 동일한 Cost로 구성되어 있기
때문에 Hash를 통해서 4개의 경로 중에 선택해서 전송하게 된다.
가령, S700을 가기 위한 경로로 Interface po30이 Hash에 대한 결과로 선택되었다고 가정하게 되면, 해당 Frame은 아래와 같은
FabricPath Header 값을 가지고 Encapsulation한 후에 po30으로 전송한다.
- Outer DA : Lookup에서 확인된, SID,sSID, LID 값인 700.0.64로 설정된다.
- Outer SA : 500.0.12로 설정된다.
- FabricPath TAG : EtherType - FabricPath (0x8903) / FTAG – 1 / TTL - 32
찾는다
. 현재 S700으로 가는 경로는 po700만 있기 떄문에 po700으로 전송된다.
17. S700은 FabricPath로 Encapsulation된 Frame을 수신 받고, Outer DA에 Destination SID를 Routing Lookup을 하면 S700은
FabricPath switch 외부라는 것을 알게된다. 이후의 동작은 Software Version에 따라서 다른데, FabricPath Header의 LID 값을
사용하거나 Mac-Address Table을 Lookup하여 Physical Edge Interface로 전송되게 된다. ( 두 가지 경우의 결과는 동일하다)
18. Host B가 연결된 Forwarding Engine ASIC에서는 FabricPath의 inner DMAC(MAC B)에 대해서 이미 Local Entry에 가지고 있으며,
inner SMAC(MAC A)에 대해서도 (500.0.12)라는 값으로 학습된 상태이다.
여기서 핵심은 Unicast Data로 전송 시에는 다른 어떤 FabricPath switch에서 Source/Destination MAC을 학습하지 않는다는 것이다.