스패닝 트리 프로토콜(Spanning Tree Protocol) 기초
스패닝 트리 프로토콜(STP)이 왜 필요한지, 어떻게 동작하는지를 설명하고, 코스트 계산 방법과 포트 상태 변화 과정을 다룹니다.
핵심 요약
- 이중화(Redundancy)를 위한 링크는 **루프(Loop)**를 유발하며, STP는 특정 포트를 차단(Block)하여 루프를 방지
- 스위치 간 **BPDU(Bridge Protocol Data Unit)**를 교환하여 루트 브리지(Root Bridge)를 선출
- 브리지 ID = 우선순위(Priority, 기본값 32768) + MAC 주소이며, 가장 낮은 브리지 ID가 루트 브리지로 선출
- 포트 역할: 루트 포트(Root Port), 지정 포트(Designated Port), 대체 포트(Alternate/Blocked Port)
- 포트 상태 전환: Blocking → Listening(15초) → Learning(15초) → Forwarding, 총 30~50초 소요
- STP 결정 순서: 최소 브리지 ID → 최소 루트 경로 코스트 → 최소 송신자 브리지 ID → 최소 송신자 포트 ID
- STP는 기본적으로 활성화되어 있으며, VLAN별로 동작(PVST)
Part 1: STP 소개
STP가 필요한 이유
네트워크에서 이중화(Redundancy)는 필수적이지만, 스위치 간 이중 링크는 **루프(Loop)**를 발생시킵니다. 루프가 발생하면 **브로드캐스트 스톰(Broadcast Storm)**이 일어나 네트워크가 마비됩니다.
루프 발생 예시
두 대의 스위치(SW1, SW2)가 이중 링크로 연결된 상황을 생각해 보겠습니다:
- H1이 ARP 브로드캐스트를 전송
- SW1이 이 프레임을 모든 포트로 플러딩(Flooding)
- SW2가 수신 후 다시 모든 포트로 플러딩
- 해당 프레임이 다시 SW1으로 돌아옴
- 무한 반복 → 브로드캐스트 스톰 발생
브로드캐스트 프레임에는 IP 패킷의 TTL(Time To Live)과 같은 메커니즘이 없기 때문에, 이더넷 프레임은 영원히 루프를 돌게 됩니다.
STP의 루프 방지 방법
STP는 **특정 포트를 차단 상태(Blocked)**로 만들어 루프를 방지합니다. 이를 위해 스위치들은 서로 **BPDU(Bridge Protocol Data Unit)**를 교환합니다.
브리지 ID (Bridge ID)
브리지 ID는 두 가지 요소로 구성됩니다:
브리지 ID = 우선순위(Priority) + MAC 주소
(기본값 32768)
루트 브리지 선출 (Root Bridge Election)
- 모든 스위치가 BPDU를 교환
- 가장 낮은 브리지 ID를 가진 스위치가 루트 브리지로 선출
- 우선순위가 같으면 가장 낮은 MAC 주소를 가진 스위치가 선출
주의: 오래된 스위치는 MAC 주소가 낮아서 의도치 않게 루트 브리지가 될 수 있습니다. 우선순위를 수동으로 변경하여 원하는 스위치를 루트 브리지로 지정하는 것이 권장됩니다.
포트 역할 (Port Roles)
STP는 각 포트에 역할을 부여합니다:
| 포트 역할 | 약어 | 설명 |
|---|---|---|
| 루트 포트(Root Port) | R | 루트 브리지로 가는 최단 경로의 포트 (비루트 스위치에 1개씩) |
| 지정 포트(Designated Port) | D | 각 세그먼트에서 루트 브리지로 가장 가까운 포트 |
| 대체 포트(Alternate/Blocked Port) | A/ND | 루프 방지를 위해 차단된 포트 |
- 루트 브리지의 모든 포트는 지정 포트(Designated Port)
- 비루트(Non-Root) 스위치는 루트 포트 1개를 가짐
- 루프가 발생하는 링크에서 한쪽 포트가 **대체 포트(Alternate)**로 차단됨
포트 상태 (Port States)
포트가 활성화되면 즉시 트래픽을 전달하지 않고, 다음 상태를 거칩니다:
Listening (15초) → Learning (15초) → Forwarding- Listening: BPDU를 송수신하지만, 데이터 프레임은 전달하지 않음
- Learning: MAC 주소를 학습하지만, 데이터 프레임은 아직 전달하지 않음
- Forwarding: 데이터 프레임을 정상적으로 전달
STP 기본 동작
- STP는 Cisco 스위치에서 기본적으로 활성화되어 있음
- PVST(Per-VLAN Spanning Tree) 방식으로 각 VLAN마다 독립적으로 STP가 동작
STP 설정 확인
토폴로지
show spanning-tree 명령으로 STP 상태를 확인할 수 있습니다.
SW1 출력 예시
SW1#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 0011.bb0b.3600
Cost 4
Port 1 (FastEthernet0/14)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 0019.aa9e.b000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- ----
Fa0/14 Root FWD 4 128.1 P2p
Fa0/24 Desg FWD 4 128.2 P2p출력 해석:
- Root ID: 루트 브리지의 정보 (Priority 32769, MAC 0011.bb0b.3600)
- Bridge ID: 이 스위치 자신의 정보 (Priority 32769, MAC 0019.aa9e.b000)
- sys-id-ext: VLAN 번호가 우선순위에 추가됨 (32768 + VLAN 1 = 32769)
- Fa0/14: 루트 포트(Root) — 루트 브리지 방향
- Fa0/24: 지정 포트(Desg) — 정상 포워딩
- Cost 4: 루트 브리지까지의 경로 코스트
SW2 출력 예시 (비루트, 차단 포트 존재)
SW2#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 0011.bb0b.3600
Cost 4
Port 1 (FastEthernet0/14)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 001a.a1e2.4400
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- ----
Fa0/14 Root FWD 4 128.1 P2p
Fa0/24 Altn BLK 4 128.2 P2p- Fa0/24가 Altn BLK (Alternate Blocked) 상태 — 루프 방지를 위해 차단됨
SW3 출력 예시 (루트 브리지)
SW3#show spanning-tree
VLAN0001
Spanning tree enabled protocol ieee
Root ID Priority 32769
Address 0011.bb0b.3600
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 0011.bb0b.3600
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- ----
Fa0/14 Desg FWD 4 128.1 P2p
Fa0/24 Desg FWD 4 128.2 P2p- “This bridge is the root” 메시지가 표시됨 — 이 스위치가 루트 브리지
- 루트 브리지의 모든 포트는 지정 포트(Desg FWD)
STP 타이머 요약
| 타이머 | 기본값 | 설명 |
|---|---|---|
| Hello Time | 2초 | BPDU 전송 간격 |
| Max Age | 20초 | BPDU를 수신하지 못하면 토폴로지 변경으로 판단 |
| Forward Delay | 15초 | Listening, Learning 각 상태의 지속 시간 |
Part 2: STP 코스트 계산
STP 코스트 값
STP는 링크 속도에 따라 코스트 값을 부여합니다:
| 링크 속도 | 코스트 |
|---|---|
| 10 Mbps | 100 |
| 100 Mbps | 19 |
| 1000 Mbps (1 Gbps) | 4 |
코스트 계산 토폴로지
5대의 스위치가 서로 다른 속도의 링크로 연결된 토폴로지입니다.
BPDU의 루트 경로 코스트 필드
BPDU에는 루트 경로 코스트(Root Path Cost) 필드가 포함되어 있습니다. 루트 브리지는 코스트 0으로 BPDU를 전송하고, 각 스위치는 수신 포트의 코스트를 더해갑니다.
단계별 코스트 계산
SW2에서의 코스트 계산:
SW1(루트 브리지)에서 출발한 BPDU가 각 스위치에 도달할 때마다, 수신 포트의 링크 코스트가 누적됩니다.
SW4에서의 코스트 계산:
SW3, SW5에서의 코스트 계산:
각 스위치는 가장 낮은 코스트의 경로를 선택하여 루트 포트를 결정합니다.
동일 코스트 시 타이브레이커 (Tiebreaker)
동일한 코스트 값을 가진 경로가 여러 개일 경우, 다음 기준으로 결정합니다:
- 포트 우선순위(Port Priority) — 낮은 값이 우선
- 인터페이스 번호 — 낮은 번호가 우선
STP 결정 순서 (중요)
STP가 포트 역할을 결정할 때 사용하는 순서입니다. 반드시 기억해야 합니다:
1. 최소 브리지 ID (Lowest Bridge ID) → 루트 브리지 선출
2. 최소 루트 경로 코스트 (Lowest Path Cost) → 루트 포트 선출
3. 최소 송신자 브리지 ID (Lowest Sender Bridge ID) → 지정 포트 선출
4. 최소 송신자 포트 ID (Lowest Sender Port ID) → 최종 타이브레이커참고: STP는 OSPF와 달리 “단순(dumb)“합니다. 각 스위치는 자신이 수신한 BPDU 정보만 알 뿐, 전체 네트워크 토폴로지를 알지 못합니다. OSPF처럼 전체 토폴로지 데이터베이스를 구축하지 않습니다.
Part 3: STP 포트 상태
포트 상태 상세
STP 포트는 다음 4가지 상태를 가집니다:
| 상태 | 데이터 프레임 전달 | MAC 주소 학습 | 지속 시간 |
|---|---|---|---|
| Blocking | 아니오 | 아니오 | 20초 (Max Age) |
| Listening | 아니오 | 아니오 | 15초 (Forward Delay) |
| Learning | 아니오 | 예 | 15초 (Forward Delay) |
| Forwarding | 예 | 예 | - (정상 동작) |
상태 전환 시간
포트가 활성화된 후 트래픽을 전달하기까지의 시간:
Listening → Learning → Forwarding
15초 15초
= 총 30초만약 Blocking 상태에서 시작하면:
Blocking → Listening → Learning → Forwarding
20초 15초 15초
= 총 50초즉, 최악의 경우 포트가 트래픽을 전달하기까지 50초가 걸립니다. 이것이 RSTP(Rapid Spanning Tree Protocol)가 등장한 이유이기도 합니다.
상태 전환 확인
show spanning-tree 명령으로 포트의 상태 전환을 관찰할 수 있습니다:
SW1#show spanning-tree
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- ----
Fa0/1 Desg LIS 19 128.1 P2p시간이 지나면:
SW1#show spanning-tree
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- ----
Fa0/1 Desg LRN 19 128.1 P2p최종적으로:
SW1#show spanning-tree
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- ----
Fa0/1 Desg FWD 19 128.1 P2pLIS → LRN → FWD 순서로 전환되는 것을 확인할 수 있습니다.
디버그 명령
STP 이벤트를 실시간으로 확인하려면 다음 명령을 사용합니다:
SW1#debug spanning-tree events이 명령은 포트 상태 변화, BPDU 수신/전송, 토폴로지 변경 등의 이벤트를 실시간으로 출력합니다.
참고: STP 포트 상태는 인터페이스 단위로 동작합니다. 스위치 전체가 아닌, 각 인터페이스가 독립적으로 상태를 전환합니다.