▶ 스위치가 2대 이상인 네트워크 환경에서 Loop가 발생하는 이유
스위치의 작동 원리 중 하나인
Learning
Forwarding
Flooding
기능들 중, 들어온 트래픽을 모든 포트로 내보내는 Flooding
때문에 발생한다.
(Broadcast 패킷과 목적지를 모르는 패킷이 도착할 때 Flooding 하게됨.)
단일 스위치 구성에서는 Loop가 발생하지 않지만, 2개 이상의 스위치가 연결된 네트워크 환경에서는 루핑이 발생할 수 있다.
2대 이상의 스위치를 연결하는 궁극적인 목적은 이중화 를 하기 위한 목적이다.
장애 발생 시 백업 경로로 트래픽이 우회할 수 있도록 하여 서비스 중단이 없게 하도록 위함인데,
이 때 스위치 설정을 잘못 만지게 되면 루핑이 도는 구조가 되버리게 된다.
▸ Layer 2 구간 루프 발생 시 마주하게 되는 현상
- Broadcast Storm
- 모든 포트로 Flooding 되는 트래픽 때문에 브로드캐스트가 계속해서 돌면서 모든 링크의 대역폭을 고갈 시킴.
- CPU 소모율 극대화 -> 과부하 원인
- Multiple Frame Copy
- 스위치는 목적지를 모르는 Unicast 패킷 도착 시, 해당 패킷을 모든 포트로 Flooding 처리함.
- 아래 그림에서 Host A -> R1으로 보내는 트래픽을 살펴보면 최종 목적지인 R1은 SW1, SW2를 경유한 패킷과, SW1 -> SW4 -> SW3 -> Sw2를 경유한 트래픽을 두번 받게됨.
- 동일한 패킷의 중첩 발생
- MAC Address Flapping (Mac table의 불안정)
- 트래픽이 들어온 port와 Source-MAC 주소를 매핑하여 MAC Table을 기록하는데, 스위치의 Learning 동작 시 정상적으로 들어온 트래픽과, 우회하여 들어온 트래픽의 Source-MAC 주소가 같기 때문에 스위치의 Mac Address Table이 계속해서 업데이트 됨. (Flapping)
- 즉, 하나의 Source MAC 주소에 매핑된 포트가 계속해서 바뀌게 됨.
▶ Spanning-Tree Protocol
- 물리적으로 Switch 간의 연결된 경로가 2개 이상일 때 논리적으로 하나의 포트를 차단함으로써, 루프 구간을 없애는 프로토콜
BPDU
라는 메시지를 멀티캐스트 방식으로 교환하여 스위치들 간에 물리적인 연결 상태와 네트워크의 변경 사항을 교환하여 루프를 탐지하고, 논리적으로 Blocking 시키는 포트를 결정한다.
▸ 스패닝트리 프로토콜 종류
1. CST (Common Spanning Tree)
- 물리적인 네트워크 연결을 기반으로 하나의 Port를 Block 시켜 루프를 방지
2. PVST (Per Vlan Spanning Tree)
- 기존 STP 의 확장판으로 VLAN 별로 하나의 PORT를 블락 시킴
- 시스코 전용 프로토콜로 CST와 호환되지 않는다.
3. PVST+
- PVST 확장판
- 802.1q 트렁크 방식 지원
- 시스코 전용, CST와 호환
4. RSTP (Rapid Spanning Tree)
- STP의 진화형으로 빠른 수렴 속도를 가짐
5. MSTP (Multiple Spanning Tree)
- 여러 개의 VLAN을 그룹으로 묶어 STP를 동작시킴
- VLAN을 그룹으로 묶어 BPDU를 보내기 때문에 트래픽 부담이 적음.
- 일반적인 PVST는 VLAN마다 BPDU를 전송하기 때문에 VLAN이 늘어날수록 트래픽 부담이 심함
▸ BPDU (Bridge Protocol Data Unit)
- STP를 지원하는 스위치들 사이에서 교환되는 상태 정보를 담은 메시지
- STP는 BDPU 메시지를 스위치들 간에 교환으로 하여금 네트워크에 대한 모니터링 및 루프 상태를 점검함.
- 기본 매 2초 주기를 가지고 멀티캐스트하여 교환
- Root-Bridge 선정
- 루프 상태 및 위치 판단
- 루프 방지를 위해 Blocking을 실시할 포트 결정
- 스위치간 주기적으로 BPDU 메시지를 교환하여 네트워크에 대한 상태 변화를 보고, 스패닝트리 상태를 모니터링
▸ BID (Bridge-ID)
- Switch가 통신을 할 때 서로를 확인하기 위해 하나씩 가지고 있는 ID
- STP 구간에서 각 스위치에 부여되는 고유 ID 값
- BID 값 = Bridge Priority + MAC address
- BID가 가장 낮은 스위치가 Root Switch로 선정
- Bridge priority
- Default: 32,768
- 단위: 4096(최소 단위)
▸ Root Bridge
- 하나의 스패닝트리 구간에서 Block 되는 포트를 정하기 위해 결정되는 중심 스위치
- PVST의 경우 Vlan당 하나의 Root bridge가 존재함.
- root bridge 스위치 선정 기준
- Bridge-ID(BID) 값이 가장 낮은 스위치
- priority가 같은 경우, MAC Address가 낮은 스위치가 선정
- Root bridge로 선정된 스위치에는 Block 되는 포트가 존재하지 않음.
- 모든 포트가 designated port
▻ Root Bridge, Not Root Bridge 선출
스패닝 트리 프로토콜 동작 과정에서의 특이점은 루트 스위치를 중심으로 연결되는 스위치들이 뿌리처러 뻗어나가는 구조를 취한다는 것이다.
스위치가 추가되면 될수록 Root Bridge가 아닌 Not Root Bridge들은 모두 루트 스위치를 바라보게 된다. 그래야만 루트 브릿지를 필두로 스위치 간 서열을 정리하고 인터페이스를 차단할 스위치를 정할 수 있으니까.
그렇다면 루트 브릿지를 선출하는 과정에 대해서 살펴보도록 해보자.
앞서 말했던 것처럼 스위치의 서열을 정리하는 것은 Bridge ID이다. 스위치들은 BPDU 프레임을 주고 받으며 브릿지 ID를 확인하고, 누구의 서열이 높은지 판단한다.
위 그림에서 스위치들의 브릿지 ID를 확인할 수 있다. 좌측 상단의 스위치의 브릿지 ID가 가장 높고,
우측 하단의 스위치의 브릿지 ID가 가장 낮다. 스위치들이 연결되고 스패닝트리 프로토콜이 동작하기 시작하면 모든 스위치들은 자신이 루트 브릿지라고 주장하며 BPDU를 보내기 시작한다.
그러다 자신보다 더 높은 브릿지 ID가 담긴 BPDU를 전달받으면 더 이상 루트 브릿지임을 주장하지 않고 BPDU 프레임에 자신이 받은 가장 높은 브릿지 ID를 Root Bridge ID 에 담아 다른 스위치들에게 전달한다.
자신보다 높은 브릿지 ID가 담긴 BPDU 프레임을 받아든 스위치들 또한 더 이상 루트 브릿지임을 주장하지 않고 일반 스위치로서 동작한다.
루트 브릿지로 선정된 좌측 상단 스위치
좌측 상단의 스위치의 브릿지 ID가 가장 높기 때문에 루트 브릿지로 선정되었다. 그리고 인접한 모든 스위치들은 루트 브릿지만을 바라보게 된다.
이 인접한 스위치들에 연결되는 스위츠들 또한 루트 브릿지보다 브릿지 ID가 높지 안하면 마찬가지로 루트 브릿지를 바라보게 될거다.
이제 루트 브릿지를 선정하는 방법에 대해 알아봤으니 이제 차단할 포트를 어떻게 찾는지 이해해보자.
▸ Root, Designated, Alternated Port 선출
브릿지 ID를 통해 루트 브릿지를 선정하였으니 이번에는 각 스위치들의 포트 서열을 매겨볼거다.
이 서열은 스위치 내에서만 적용되며 다른 스위치와 경합하는 것이 아니다.
하지만 포트의 서열 또한 루트 브릿지까지의 거리가 얼마나 가까운지를 경쟁하기 때문에 루트 브릿지의 영향에서 벗어날 수는 없다.
그 전에 기억해야할 요소는 Segment(세그먼트) 와 Path Cost(경로 값) 이다.
세그먼트는 인접한 네트워크 장비간의 연결을 뜻한다.
위 그림에서는 총 4개의 세그먼트를 확인해 볼 수 있을 것이다.
세그먼트가 중요한 이유는 아래의 한 가지 규칙 때문이다.
스패닝 트리 구조 내에서 어느 포트가 어떤 역할을 맡아야 하는지 헷갈린다면 아래 규칙을 기억하면 된다.
하나의 세그먼트에는 반드시 하나의 지정포트(Designated Port)가 있어야 한다.
Path Cost은 포트에 적용된 속도를 값으로 변환한 것으로 속도에 대한 적용 값은 다음과 같다.
속도(Bandwidth) | 경로값(Path Cost) |
---|---|
10 Mbps (이더넷) | 100 |
100 Mbps (패스트 이더넷) | 19 |
1 Gps (기가비트 이더넷) | 4 |
10 Gbps (10 기가 이더넷) | 2 |
스위치와 스위치가 연결되면 speed와 duplex에 대해 협상을 하고 서로 동일한 speed와 duplex를 가지게 되는데 바로 스위치의 포트에 설정된 속도가 표에서의 속도(bandwidth)를 의미한다.
그리고 속도마다 다른 경로 값을 부여하고 이를 스패닝 트리 구성에 활용한다.
다시 말해 스위치 자신의 경로 값과 루트 브릿지까지의 경로에 위치한 스위치의 경로 값을 모두 고려한다는 것이다.
루트 브릿지로 향하는 경로의 경로 값을 모두 더해 가장 작은 값이 나오는 경로를 택하는 것인거다.
(스위치 데이터베이스에 BPDU 수신할 때 받은 인터페이스의 경로 값을 합산하여 저장함.)
아래 그림에서 포트에 설정된 경로 값을 확인할 수 있다.
브릿자 ID가 4096인 스위치는 루트 브릿지로 향하는 세그먼트가 하나뿐이며 경로 값은 19이다.
브릿지 ID가 8192인 스위치는 두 개의 경로가 있으며 하나는 경로 값이 38(19+19), 다른 하나는 경로 값이 119(100+19)이다.
경로가 두 개인데 한 쪽 경로의 값이 훨씬 작으니 스위치는 작은 경로 값의 세그먼트를 통신경로로 사용할 것이 분명하다.
이제 포트를 선출하는 방법에 대해서 알아보자.
▻ Root Port 선출
루트 브릿지로 향하는 가장 가까운 포트가 먼저 선출되며 이를 루트 포트(Root Port)라고 한다.
데이터와 BPDU 프레임이 이동하는 포트이다.
루트 포트를 선출하는 기준은 다음과 같다.
- 가장 작은 경로 값을 가지는 포트
- 인접한 스위치의 브릿지 ID가 가장 낮은 포트
- 인접한 스위치의 포트 ID가 가장 낮은 포트(포트 ID: 포트 번호)
위의 기준을 적용해본다면 스위치들의 루트 포트는 다음과 같이 정해진다.
- 브릿지 ID가 4096인 스위치들은 첫 번째 기준 에 의거하여 루트 스위치로 향하는 경로 값이 가장 적은 포트(경로값:19)를 루트 포트로 정하게 된다. 첫 번째 기준을 충족하기 때문에 다른 기준은 볼 필요가 없다.
- 브릿지 ID가 8192인 스위치는 왼쪽으로 향하는 경로가 훨씬 작기 때문에 왼쪽 포트(경로값:38)를 루트 포트로 선택한다.
- 만약 경로 값이 양쪽 모두 같았다면?
- 두 번째 기준 인 브릿지 ID가 가장 낮은 스위치를 접한 포트를 선택했을 것이다.
- 하지만 아래 그림을 보다시피 인접 스위치들은 모두 동일한 Bridge ID(4096)을 가지고 있다. 그럼 두 번째 기준 또한 부합되지 않는 것이다.
- 세 번째 기준 을 확인해보자. 인접한 스위치 모두 포트 번호가 2번이라고 가정하면 결국 이 기준 또한 적용되지 않는다.
- 마지막으로 스위치는 자신의 포트 번호를 보고 가장 낮은 포트 번호(숫자가 적을 수록 낮은 포트)를 루트 포트로 채택하게 된다.
▻ Designated 선출
지정 포트는 루트 포트, 아래에 서술한 블락 포트도 아닌 포트를 이르는 말이다.
단순 포워딩 포트라고 봐도 무방하다.
이 포트또한 데이터와 BPDU 프레임을 전송하는 포트이다.
지정 포트를 선출하기 위한 규칙은 루트 포트를 선출하는 규칙과 거의 동일하다.
블락 포트가 아닌 지정 포트를 먼저 선출하는 이유는 루트 포트와 지정 포트가 아닌 포트가 블락 포트로 지정되기 때문이다.
- 가장 작은 경로 값을 가지는 포트
- 스위치의 브릿지 ID가 가장 낮은 포트
- 스위치의 포트 ID가 가장 낮은 포트 우선 순위(포트 ID: 포트 번호)
하지만 이런 규칙들은 포트 선출 과정을 이해하기 어렵게 만들기 때문에 위에서 언급했던 규칙 한 가지를 활용하여 포트 선출 과정을 보도록 해보자.
하나의 세그먼트에는 반드시 하나의 지정 포트가 있어야 한다.
세그먼트 하나에는 지정 포트가 하나씩 반드시 있어야 한다는 암묵적인 룰이 있다.
스위치가 실제 포트 선출에 있어 사용하는 규칙이라기보다 포트를 지정하는 과정에서 나타나는 특징인거다.
아래 루트 포트가 존재하는 세그먼트에 빈 자리가 남아 있는 곳은 모두 지정 포트로 채웠다.
하나의 세그먼트에는 하나의 지정 포트가 반드시 존재해야 하기 때문이다.
이제 포트가 지정되지 않은 마지막 세그먼트를 살펴보도록 하자.
▻ Alternated Port 선출
블락 포트는 루트 포트도, 지정 포트도 아닌 포트로 데이터 통신을 하지 않는 포트를 의미한다.
그러나 BPDU는 수신한다. 블락 포트가 BPDU를 제외한 모든 트래픽을 송수신하지 않음으로써 루프가 도는 것을 방지한다.
아래 그림에서 남은 하나의 세그먼트에서 블락 포트를 지정해줘야 한다.
마지막 세그먼트에서의 포트 결정 (붉은색 표시)
지정 포트 선출 과정에서 하나의 세그먼트에는 반드시 하나의 지정 포트(Designated port)가 있어야 한다고 했다.
그렇다는건 위 세그먼트에서도 두 포트 중 하나는 지정 포트가 되어야하고 남은 하나의 포트가 블락 포트가 되어야 함을 의미한다.
바로 여기서 지정 포트 선출을 위해 지정 포트 선출 기준이 사용된다.
- 가장 작은 경로 값을 가지는 포트
- 스위치의 브릿지 ID가 가장 낮은 포트
- 스위치의 포트 ID가 가장 낮은 포트 우선 순위(포트 ID: 포트 번호)
위의 그림에서는 1번으로 인해 브릿지 ID가 4096인 스위치(Path Cost:19)는 총 경로 값이 19이므로 지정 포트가 될 것이다.
브릿지 ID가 8192인 스위치는 총 경로 값 119(110+19)이다.
그렇다면 최종적으로 아래와 같이 포트가 지정될거다.
▶ 실습 LAB
- 위 그림을 물리적 구성으로 완성하고 실습 진행
- VLAN 10은 하늘색 선이 표시된 곳으로만 갈 수 있도록 STP 설정하고 동일한 VLAN 끼리 통신이 되는지 확인
- 메인 경로 장애 시 백업 경로로 우회되는지 테스트
▶ 스위치 기본 설정
▸ DSW-1 스위치 설정
1. VLAN 생성
# 컨피그 터미널 진입
conf ter
# VLAN 10 생성
vlan 10
name VLAN10
exit
# VLAN 20 생성
vlan 20
name VLAN20
exit
2. VLAN 확인
sh vlan br
3. Trunk 설정
int range g0/0,g0/1,g0/2,g0/3
no shutdown
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 10,20
4. Trunk 확인
sh int tr
▸ DSW-2 스위치 설정
1. VLAN 생성
# 컨피그 터미널 진입
conf ter
# VLAN 10 생성
vlan 10
name VLAN10
exit
# VLAN 20 생성
vlan 20
name VLAN20
exit
2. VLAN 확인
sh vlan br
3. Trunk 설정
int range g0/0,g0/1,g0/2,g0/3
no shutdown
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 10,20
4. Trunk 확인
sh int tr
▸ AWS-1 스위치 설정
1. VLAN 생성
# 컨피그 터미널 진입
conf ter
# VLAN 10 생성
vlan 10
name VLAN10
exit
# VLAN 20 생성
vlan 20
name VLAN20
2. VLAN 확인
sh vlan br
3. Trunk 설정
int range g0/0,g0/1
no shutdown
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 10,20
4. Trunk 확인
sh int tr
5. Access 포트 설정
int g0/2
no shut
sw mo ac
sw ac vlan 10
exit
int g0/3
no shut
sw mo ac
sw ac vlan 20
exit
▸ AWS-2 스위치 설정
1. VLAN 생성
# 컨피그 터미널 진입
conf ter
# VLAN 10 생성
vlan 10
name VLAN10
exit
# VLAN 20 생성
vlan 20
name VLAN20
2. VLAN 확인
sh vlan br
3. Trunk 설정
int range g0/0,g0/1
no shutdown
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 10,20
4. Trunk 확인
sh int tr
5. Access 포트 설정
int g0/2
no shut
sw mo ac
sw ac vlan 10
exit
int g0/3
no shut
sw mo ac
sw ac vlan 20
exit
▶ 스패닝 트리 설정
▸ DSW-1 스위치
1. VLAN 10의 priority 값을 4096으로 변경 (DSW-1을 VLAN10의 Root Bridge로 선정)
conf ter
spanning-tree vlan 10 priority 4096
2. VLAN 20의 priority 값을 8192으로 변경 (DSW-1을 VLAN20의 Backup로 선정)
spanning-tree vlan 20 priority 8192
3. VLAN 10 STP 정보 확인
# VLAN 10의 스패닝 트리 확인
sh spanning-tree vlan 10
VLAN 10의 루트 브릿지로 선정된 것을 확인할 수 있음.
4. VLAN 20 STP 정보 확인
sh spanning-tree vlan 20
▸ DSW-2 스위치
1. VLAN 10의 priority 값을 8192으로 변경 (DSW-2을 VLAN10의 Backup로 선정)
conf ter
spanning-tree vlan 10 priority 4096
2. VLAN 20의 priority 값을 4096으로 변경 (DSW-2을 VLAN20의 Root Bridge로 선정)
spanning-tree vlan 20 priority 8192
3. VLAN 10 STP 정보 확인
# VLAN 10의 스패닝 트리 확인
sh spanning-tree vlan 10
4. VLAN 20 STP 정보 확인
sh spanning-tree vlan 20
VLAN 20의 루트 브릿지로 선정된 것을 확인할 수 있음.
▶ Alternated Port 확인
▸ ASW-1 스위치
VLAN 10의 Alternated Port 확인
sh spanning-tree vlan 10
의도한대로 g0/1 포트가 Blocking 되었음.
VLAn 20의 Alternated Port 확인
sh spanning-tree vlan 20
의도한대로 g0/0 포트가 blocking 되었음.
▸ ASW-2 스위치
VLAN 10의 Alternated Port 확인
sh spanning-tree vlan 10
의도한대로 g0/1 포트가 Blocking 되었음.
VLAn 20의 Alternated Port 확인
sh spanning-tree vlan 20
의도한대로 g0/0 포트가 blocking 되었음.