이 글은 2021년 7월 기준 기록입니다.
스위치 네트워크를 이중화하면 안정성을 얻지만 동시에 물리적인 루프가 생깁니다. 그리고 스위치는 루프를 스스로 알아채지 못합니다. 브로드캐스트 프레임 하나가 루프를 따라 돌면 끝없이 늘어나고, 장비 간의 연결뿐 아니라 장비에 연결된 단말 장치까지 성능 저하를 겪습니다. 이 문제를 자동으로 해결하기 위한 프로토콜이 STP(Spanning Tree Protocol) 입니다.
루트를 정하는 것이 STP의 첫 단추다
STP는 어느 포트를 살리고 어느 포트를 막을지를 정해야 하는데, 그 판단의 기준점이 되는 스위치가 루트 스위치입니다. 그래서 STP를 다루는 설정도 우선순위를 조정해 루트를 지정하는 데서 시작합니다.
SW1(config)#spanning-tree vlan 1 priority 0
// SW1에서 vlan 1에 대한 STP 우선 순위를 0으로 설정
SW2(config)#spanning-tree vlan 1 priority 4096
// SW2에서 vlan 1에 대한 STP 우선 순위를 4096으로 설정
실습 토폴로지의 라우터 쪽에는 통신 확인용 주소만 잡아 둡니다.
R1(config)#int e0/0
R1(config-if)#no sh
R1(config-if)#ip add 1.1.1.1 255.255.255.0
R1(config-if)#exit
R2(config)#int e0/0
R2(config-if)#no sh
R2(config-if)#ip add 1.1.1.2 255.255.255.0
R2(config-if)#exit
루프가 실제로 부하를 일으키는지는 CPU 사용량으로 확인할 수 있습니다.
// SW3의 cpu 사용량 확인
SW3#show processes cpu
CPU utilization for five seconds: 0%/0%; one minute: 0%; five minutes: 0%
STP가 어떤 결론을 냈는지는 show spanning-tree로 봅니다.
// SW4의 vlan 1에 대한 STP 내용 확인
SW4#show spanning-tree vlan 1
VLAN0001
Spanning tree enabled protocol rstp
Root ID Priority 1
Address aabb.cc00.0100
Cost 200
Port 2 (Ethernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address aabb.cc00.0400
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
Et0/0 Altn BLK 100 128.1 Shr
// BLK는 해당 포트가 차단된 것을 의미함
Et0/1 Root FWD 100 128.2 Shr
Et1/0 Desg FWD 100 128.5 Shr
포트마다 Role과 Sts가 붙어 있고, Altn BLK인 포트가 STP가 막아 둔 포트입니다. 이 포트가 루프를 끊고 있는 지점입니다.
STP를 꺼서 그 차이를 확인해 볼 수도 있습니다. VLAN 단위로 끕니다.
// 모든 스위치에서 vlan 1에 대한 STP 꺼보기
SW1(config)#no spanning-tree vlan 1
SW2(config)#no spanning-tree vlan 1
SW3(config)#no spanning-tree vlan 1
SW4(config)#no spanning-tree vlan 1
스위치들은 BPDU로 서로의 자격을 비교한다
STP의 모든 판단은 스위치들이 주고받는 BPDU(Bridge Protocol Data Unit) 위에서 이루어집니다.
설정 BPDU는 스위치 간의 STP 정보 교환에 사용하며, 루트 브리지 ID, 경로값, 브리지 ID, 포트 ID를 담습니다. TCN BPDU는 토폴로지 변화를 다른 스위치에 알릴 때 사용합니다.
이 네 가지 값이 무엇인지가 곧 STP의 판단 기준입니다.
루트 브리지 ID / 브리지 ID는 우선순위(2 byte; 16 bit)와 MAC 주소(6 byte; 48 bit)를 합친 값입니다. 우선순위는 다시 우선순위 값(4 bit)과 VLAN 번호(12 bit)로 나뉩니다. 우선순위 기본값은 32768입니다. 예를 들어 0001 || 0000 0000 0001은 우선순위 값 4096에 VLAN 1을 뜻합니다.
우선순위가 낮은 스위치가 루트 스위치로 선택되므로, 다음 명령으로 루트 스위치를 임의로 선택할 수 있습니다.
spanning-tree vlan 1 priority XXXX
경로값은 포트의 속도별로 미리 정해진 값입니다. 10 Mbps는 100, 100 Mbps는 19, 1 Gbps는 4, 10 Gbps는 2입니다. 루트 스위치까지의 경로에 해당하는 값을 합산해서 결정합니다. 빠른 링크일수록 값이 작으므로, 합이 작다는 것은 곧 좋은 경로라는 뜻입니다.
포트 ID는 포트 우선순위와 포트 번호를 합친 값입니다. 포트 우선순위 기본값은 128이고, 128.1 같은 형태로 표시됩니다.
STP는 네 단계로 살릴 포트를 정한다
STP의 동작은 순서가 정해져 있습니다. 먼저 전체 스위치 중 루트(root) 스위치를 선택하고, 루트 스위치가 아닌 모든 스위치에서 루트(root) 포트를 선택합니다. 그다음 한 스위치 세그먼트당 지정(designated) 포트를 선택하고, 루트 포트도 지정 포트도 아닌 포트를 대체(alternate) 포트로 두어 차단합니다.
루트 스위치 선택은 간단합니다. 브리지 ID가 가장 낮은 스위치가 루트가 되므로, 개입하려면 우선순위 값을 조정합니다.
루트 포트 선택은 조건을 순서대로 적용해 나가며, 앞선 조건에서 결판이 나면 거기서 멈춥니다.
- 루트 스위치의 ID가 가장 낮은 BPDU를 수신한 포트
- 경로값이 가장 작은 포트
- 인접 스위치의 브리지 ID가 가장 낮은 포트
- 인접 스위치의 포트 ID가 가장 낮은 포트
- 자신의 포트 ID가 가장 낮은 포트
지정 포트 선택은 한 세그먼트당 하나씩 이루어지며, 역시 순서가 있습니다.
- 루트 스위치의 각 포트
- 후순위 BPDU를 수신한 포트
- 경로값이 작은 스위치의 포트
- 브리지 ID가 낮은 스위치의 포트
- 포트 ID가 낮은 포트
두 목록 모두 "루트에 가까운 쪽이 이긴다"로 시작해서, 그것으로 갈리지 않으면 ID의 크기로 내려가는 구조입니다.
BPDU는 눈으로 확인할 수 있다
실제로 오가는 BPDU를 보려면 디버깅을 겁니다. 먼저 실습에 쓸 포트를 살립니다.
SW1(config)#int range e0/0-1
SW1(config-if-range)#no sh
SW2(config)#int range e0/0-1
SW2(config-if-range)#no sh
SW3(config)#int range e0/0-1
SW3(config-if-range)#no sh
SW3(config-if-range)#int e1/0
SW3(config-if)#no sh
SW4(config)#int range e0/0-1
SW4(config-if-range)#no sh
SW4(config-if-range)#int e1/0
SW4(config-if)#no sh
STP 모드를 PVST로 맞추고 우선순위를 정합니다.
SW1(config)#spanning-tree mode pvst
SW2(config)#spanning-tree mode pvst
SW3(config)#spanning-tree mode pvst
SW4(config)#spanning-tree mode pvst
SW1(config)#spanning-tree vlan 1 priority 0
SW2(config)#spanning-tree vlan 1 priority 4096
이제 BPDU를 관찰합니다.
// STP bpdu 디버깅하기
SW4#debug spanning-tree bpdu
디버깅은 반드시 꺼 줍니다. 켜 둔 채로 두면 콘솔이 계속 밀려 올라갑니다.
// 모든 디버깅 중지
SW4#un all
Jan 15 00:33:16.285: STP: VLAN0001 Et0/0:0000 00 00 00 0001AABBCC000100 00000064 8001AABBCC000300 8001 0100 1400 0200 0F00
포트는 곧바로 전송 상태가 되지 않는다
STP에서 포트는 다섯 가지 상태를 가집니다. 차단(Blocking), 청취(Listening), 학습(Learning), 전송(Forwarding), 비활성(Disabled)입니다.
포트가 활성화되면 대체 포트는 차단 상태로, 루트 포트와 지정 포트는 청취 상태로 들어갑니다. 어떤 상태에 있든 문제가 발생하면 비활성 상태가 됩니다.
전이에는 방향에 따른 비대칭이 있습니다. 대체 포트가 루트 포트나 지정 포트로 역할이 변경되면 20초 후 청취 상태가 되지만, 루트 포트나 지정 포트가 대체 포트로 역할이 변경되면 즉시 차단 상태가 됩니다. 막는 것은 즉시 하고 여는 것은 기다린다 — 루프를 만들지 않겠다는 원칙이 여기 그대로 드러납니다.
이후에는 청취 상태에서 15초 후 학습 상태가 되고, 학습 상태에서 15초 후 전송 상태가 됩니다.
각 상태의 성격은 다음과 같습니다.
차단 상태는 두 경우에 청취 상태로 변경됩니다. 상대 포트로부터 맥스 에이지(20초) 동안 BPDU를 받지 못했을 때, 그리고 상대 포트로부터 맥스 에이지 동안 후순위 BPDU를 받았을 때입니다.
청취 상태는 전송 상태로 변경시키기 위한 준비 단계입니다. 전송 지연시간(15초) 동안 토폴로지 변경이 없으면 학습 상태로 변경됩니다.
학습 상태는 전송 상태 직전의 단계로, MAC 주소 테이블을 채우기 시작합니다. 전송 지연시간 동안 토폴로지 변경이 없으면 전송 상태로 변경됩니다.
전송 상태는 프레임을 송수신할 수 있는 단계입니다.
비활성 상태는 양 포트의 스패닝 트리 설정이 잘못되거나 설정 사항을 위반한 경우에 들어가며, 데이터뿐 아니라 BPDU도 송수신하지 않습니다.
STP는 루프를 없애 주지만 그 대가로 시간을 요구합니다. 이 시간을 어떻게 줄일 것인가가 이후 STP 조정과 RSTP로 이어지는 주제입니다.
'IT·테크 > 인프라' 카테고리의 다른 글
| 사설 VLAN(Private VLAN) — VLAN 하나 안에서 다시 격리하기 (0) | 2026.08.05 |
|---|---|
| VLAN과 트렁킹, VTP — 브로드캐스트 도메인을 잘라 내는 법 (0) | 2026.08.04 |
| 트랜스패런트 브리징 — 스위치가 MAC 주소 테이블로 프레임을 넘기는 규칙 (0) | 2026.08.04 |
| 시스코 스위치 기본 설정과 동작 확인 — 모드 이동부터 show 명령까지 (1) | 2026.08.03 |
| 이더넷 — LAN을 움직이는 프레임 포맷과 허브·스위치·라우터의 차이 (1) | 2026.08.03 |