📚 네트워크 · 패킷 분석 › 04. 네트워크 장비 실습 — 170편
이전 글: 169. Collision Domain · 다음 글: 171. Router의 Routing Table
스위치를 이중으로 연결하면 한 링크가 끊겨도 통신이 유지됩니다. 하지만 L2에는 IP의 TTL 같은 수명 값이 없어서, 경로가 고리(루프)를 이루면 브로드캐스트 프레임이 끝없이 돌며 복제됩니다. 그 결과 브로드캐스트 폭주(168. Broadcast Domain), MAC 테이블 흔들림(Flapping), 중복 프레임이 생겨 네트워크가 마비됩니다.
STP(Spanning Tree Protocol, IEEE 802.1D) 는 스위치들이 서로 정보를 교환해 루프가 생기는 포트 일부를 논리적으로 막고, 나머지로 나무(Tree) 모양의 경로만 남기는 프로토콜입니다. 막힌 포트는 활성 경로가 끊기면 다시 열려 이중화 역할을 합니다.
| 버전 | 표준 | 특징 |
|---|---|---|
| STP | IEEE 802.1D | 수렴에 30~50초 |
| RSTP | IEEE 802.1w (현재 802.1D에 통합) | 수 초 이내 수렴, 대부분 장비의 기본 |
| MSTP | IEEE 802.1s (현재 802.1Q에 통합) | 여러 VLAN을 묶어 인스턴스별 트리 구성 |
| PVST+ / Rapid PVST+ | Cisco 방식 | VLAN마다 별도 트리 |
STP는 세 단계로 트리를 만듭니다.
① 루트 브리지 선출
모든 스위치가 BPDU를 교환 → Bridge ID가 가장 작은 스위치가 루트
Bridge ID = 우선순위(기본 32768) + MAC 주소 (우선순위가 같으면 MAC이 작은 쪽)
↓
② 각 스위치의 루트 포트(Root Port) 선택
루트까지의 경로 비용 합이 가장 작은 포트 1개
↓
③ 각 링크의 지정 포트(Designated Port) 선택
링크마다 루트에 더 가까운 쪽 포트 1개
↓
나머지 포트 → 차단(Blocking / RSTP에서는 Alternate·Backup 역할, Discarding 상태)
Cisco PVST+ 계열은 우선순위에 VLAN 번호를 더한 값(확장 시스템 ID)을 표시합니다. 예를 들어 기본 우선순위의 VLAN 10은 32768 + 10 = 32778로 보입니다. 우선순위는 4096 단위로만 바꿀 수 있습니다.
링크 속도별 경로 비용(802.1D 기존 값, Cisco 기본)입니다.
| 링크 속도 | 경로 비용 |
|---|---|
| 10 Mbps | 100 |
| 100 Mbps | 19 |
| 1 Gbps | 4 |
| 10 Gbps | 2 |
802.1D의 포트 상태와 기본 타이머입니다.
| 상태 | BPDU 처리 | MAC 학습 | 프레임 전달 | 비고 |
|---|---|---|---|---|
| Blocking | 수신만 | X | X | 루프 방지로 막힌 포트 |
| Listening | 송수신 | X | X | Forward Delay 15초 |
| Learning | 송수신 | O | X | Forward Delay 15초 |
| Forwarding | 송수신 | O | O | 정상 전달 |
| Disabled | X | X | X | 관리자가 끈 포트 |
타이머는 Hello 2초(BPDU 송신 주기), Max Age 20초(BPDU를 못 받으면 정보 폐기), Forward Delay 15초입니다. 그래서 기존 STP는 장애 후 전달 재개까지 최대 약 50초가 걸릴 수 있고, 이를 줄인 것이 RSTP입니다.
BPDU(Bridge Protocol Data Unit) 는 STP 정보를 담은 프레임입니다.
| 항목 | 값 |
|---|---|
| 목적지 MAC (IEEE STP/RSTP/MSTP) | 01:80:c2:00:00:00 |
| 목적지 MAC (Cisco PVST+) | 01:00:0c:cc:cc:cd |
| 주요 내용 | 루트 Bridge ID, 루트까지 비용, 보낸 스위치 Bridge ID, 포트 ID, 타이머, Flag(TC 등) |
| 종류 | Configuration BPDU, TCN(Topology Change Notification) BPDU, RSTP BPDU |
실습 예시 — GNS3 등의 Cisco IOS 계열 스위치에서 STP 상태를 확인하고 루트를 지정하는 명령입니다. 출력은 형식 예시(값은 환경마다 다름, 일부만 표시)입니다.
Switch# show spanning-tree vlan 10
VLAN0010
Spanning tree enabled protocol rstp
Root ID Priority 24586
Address 000c.29aa.0001
Bridge ID Priority 32778 (priority 32768 sys-id-ext 10)
Interface Role Sts Cost Prio.Nbr Type
---------------- ---- --- --------- -------- ----
Gi0/1 Root FWD 4 128.1 P2p
Gi0/2 Altn BLK 4 128.2 P2p
! 코어 스위치를 VLAN 10의 루트로 고정, 단말 포트 보호
spanning-tree mode rapid-pvst
spanning-tree vlan 10 priority 24576
interface GigabitEthernet0/5
spanning-tree portfast
spanning-tree bpduguard enable
실습 예시 — Linux bridge도 STP를 지원합니다(Rocky/Ubuntu 공통, 152. Switch란 무엇인가의 br0 기준, 커널 STP는 802.1D 방식).
sudo ip link set br0 type bridge stp_state 1
bridge -d link show # 포트별 state (forwarding/blocking 등)
cat /sys/class/net/br0/bridge/root_id # 루트 Bridge ID
cat /sys/class/net/br0/bridge/bridge_id # 자신의 Bridge ID
Wireshark에서는 stp로 BPDU를, stp.flags.tc == 1로 토폴로지 변경 알림이 담긴 BPDU를 골라 볼 수 있습니다.
📷 [실습 화면 삽입 위치] Wireshark에서
stp필터로 2초 간격 BPDU를 표시하고 Packet Details에서 Root Identifier·Root Path Cost·Bridge Identifier를 펼친 화면
| 흔적 (Cisco 계열 메시지 예, 장비마다 다름) | 의미 |
|---|---|
%SPANTREE-2-BLOCK_BPDUGUARD | 단말 포트에서 BPDU 수신 → 포트 차단 |
%PM-4-ERR_DISABLE (bpduguard 사유) | 포트가 err-disable 상태로 전환 |
%SPANTREE-2-ROOTGUARD_BLOCK | Root Guard가 우수한 BPDU를 받아 포트 차단 |
| 토폴로지 변경 빈발, MAC Flapping | 링크 불안정, 루프 또는 비인가 BPDU |
관제자가 확인할 질문
오탐 주의: 사용자가 소형 스위치나 공유기를 자리에 연결해 BPDU Guard가 동작하는 일은 흔하며, 대부분 악의보다 정책 위반·실수입니다. 다만 차단 이벤트 자체는 비인가 장비 연결의 증거이므로 기록하고 확인합니다.
01:80:c2:00:00:00, Cisco PVST+ 01:00:0c:cc:cc:cd이며, RSTP가 수렴 속도를 크게 줄였습니다.