Skip to Content

스패닝 트리 프로토콜(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)**이 일어나 네트워크가 마비됩니다.

루프 발생 예시

10_Introduction to Spanning Tree_img_p03_01

두 대의 스위치(SW1, SW2)가 이중 링크로 연결된 상황을 생각해 보겠습니다:

  1. H1이 ARP 브로드캐스트를 전송
  2. SW1이 이 프레임을 모든 포트로 플러딩(Flooding)
  3. SW2가 수신 후 다시 모든 포트로 플러딩
  4. 해당 프레임이 다시 SW1으로 돌아옴
  5. 무한 반복 → 브로드캐스트 스톰 발생
10_Introduction to Spanning Tree_img_p03_02

브로드캐스트 프레임에는 IP 패킷의 TTL(Time To Live)과 같은 메커니즘이 없기 때문에, 이더넷 프레임은 영원히 루프를 돌게 됩니다.

STP의 루프 방지 방법

STP는 **특정 포트를 차단 상태(Blocked)**로 만들어 루프를 방지합니다. 이를 위해 스위치들은 서로 **BPDU(Bridge Protocol Data Unit)**를 교환합니다.

10_Introduction to Spanning Tree_img_p05_01

브리지 ID (Bridge ID)

브리지 ID는 두 가지 요소로 구성됩니다:

브리지 ID = 우선순위(Priority) + MAC 주소 (기본값 32768)
10_Introduction to Spanning Tree_img_p06_01

루트 브리지 선출 (Root Bridge Election)

  • 모든 스위치가 BPDU를 교환
  • 가장 낮은 브리지 ID를 가진 스위치가 루트 브리지로 선출
  • 우선순위가 같으면 가장 낮은 MAC 주소를 가진 스위치가 선출

주의: 오래된 스위치는 MAC 주소가 낮아서 의도치 않게 루트 브리지가 될 수 있습니다. 우선순위를 수동으로 변경하여 원하는 스위치를 루트 브리지로 지정하는 것이 권장됩니다.

포트 역할 (Port Roles)

STP는 각 포트에 역할을 부여합니다:

10_Introduction to Spanning Tree_img_p07_01
포트 역할약어설명
루트 포트(Root Port)R루트 브리지로 가는 최단 경로의 포트 (비루트 스위치에 1개씩)
지정 포트(Designated Port)D각 세그먼트에서 루트 브리지로 가장 가까운 포트
대체 포트(Alternate/Blocked Port)A/ND루프 방지를 위해 차단된 포트
10_Introduction to Spanning Tree_img_p08_01
  • 루트 브리지의 모든 포트는 지정 포트(Designated Port)
  • 비루트(Non-Root) 스위치는 루트 포트 1개를 가짐
  • 루프가 발생하는 링크에서 한쪽 포트가 **대체 포트(Alternate)**로 차단됨
10_Introduction to Spanning Tree_img_p09_01

포트 상태 (Port States)

포트가 활성화되면 즉시 트래픽을 전달하지 않고, 다음 상태를 거칩니다:

10_Introduction to Spanning Tree_img_p11_01
Listening (15초) → Learning (15초) → Forwarding
  • Listening: BPDU를 송수신하지만, 데이터 프레임은 전달하지 않음
  • Learning: MAC 주소를 학습하지만, 데이터 프레임은 아직 전달하지 않음
  • Forwarding: 데이터 프레임을 정상적으로 전달

STP 기본 동작

  • STP는 Cisco 스위치에서 기본적으로 활성화되어 있음
  • PVST(Per-VLAN Spanning Tree) 방식으로 각 VLAN마다 독립적으로 STP가 동작

STP 설정 확인

토폴로지

10_Introduction to Spanning Tree_img_p11_02

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/24Altn 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 Time2초BPDU 전송 간격
Max Age20초BPDU를 수신하지 못하면 토폴로지 변경으로 판단
Forward Delay15초Listening, Learning 각 상태의 지속 시간

Part 2: STP 코스트 계산

STP 코스트 값

STP는 링크 속도에 따라 코스트 값을 부여합니다:

링크 속도코스트
10 Mbps100
100 Mbps19
1000 Mbps (1 Gbps)4

코스트 계산 토폴로지

11_Spanning Tree Cost Calculation_img_p02_01

5대의 스위치가 서로 다른 속도의 링크로 연결된 토폴로지입니다.

BPDU의 루트 경로 코스트 필드

11_Spanning Tree Cost Calculation_img_p03_01

BPDU에는 루트 경로 코스트(Root Path Cost) 필드가 포함되어 있습니다. 루트 브리지는 코스트 0으로 BPDU를 전송하고, 각 스위치는 수신 포트의 코스트를 더해갑니다.

단계별 코스트 계산

SW2에서의 코스트 계산:

11_Spanning Tree Cost Calculation_img_p04_01

SW1(루트 브리지)에서 출발한 BPDU가 각 스위치에 도달할 때마다, 수신 포트의 링크 코스트가 누적됩니다.

SW4에서의 코스트 계산:

11_Spanning Tree Cost Calculation_img_p05_01

SW3, SW5에서의 코스트 계산:

11_Spanning Tree Cost Calculation_img_p06_01

각 스위치는 가장 낮은 코스트의 경로를 선택하여 루트 포트를 결정합니다.

동일 코스트 시 타이브레이커 (Tiebreaker)

11_Spanning Tree Cost Calculation_img_p07_01

동일한 코스트 값을 가진 경로가 여러 개일 경우, 다음 기준으로 결정합니다:

  1. 포트 우선순위(Port Priority) — 낮은 값이 우선
  2. 인터페이스 번호 — 낮은 번호가 우선
11_Spanning Tree Cost Calculation_img_p07_02

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 P2p

LIS → LRN → FWD 순서로 전환되는 것을 확인할 수 있습니다.

디버그 명령

STP 이벤트를 실시간으로 확인하려면 다음 명령을 사용합니다:

SW1#debug spanning-tree events

이 명령은 포트 상태 변화, BPDU 수신/전송, 토폴로지 변경 등의 이벤트를 실시간으로 출력합니다.

참고: STP 포트 상태는 인터페이스 단위로 동작합니다. 스위치 전체가 아닌, 각 인터페이스가 독립적으로 상태를 전환합니다.