스패닝 트리 프로토콜 (STP, Spanning Tree Protocol)
- 스위치(STP 알고리즘 사용!)나 브릿지에서 발생하는 루핑을 막아주는 프로토콜이다.
- 스위치나 브릿지 구성에서 출발지부터 목적지까지의 경로가 2개 이상 존재할 때, 1개의 경로만 남겨두고 나머지 모두 끊었다가 사용하던 경로에 문제 발생 시, 끊어 두었던 경로를 하나씩 살린다.
브릿지 우선순위 (Bridge Priority)
- 16비트, 0 ~ 2^16 - 1 (0 ~ 65535)
- 디폴트 값 : 32768
- 낮은 값이 더 높은 우선순위!
Path Cost
- 브릿지가 얼마나 가까이, 얼마나 빠른 링크로 되어 있는지 알아내기 위한 값
- 링크의 속도(대역폭)가 빠를 수록 더 작은 값
- IEEE 802.10(STP 정의 표준)에서 Path Cost 구하는 공식
1,000Mbps / (두 장비 사이의 링크 대역폭) |
ex) 100Mbps로 연결된 링크 => 1,000 / 100 => 10 (Path Cost) |
- 위 공식의 문제 <기가 비트(1,000Mbps)와 ATM의 출현)
- 기가 비트의 Path Cost : 1,000 / 1,000 = 1
- 10기가 비트의 Path Cost : 1,000 / 10,000 = 0.1
- ATM(OC-48, 2.4Gbps)의 Path Cost : 1,000 / 2,400 = 0.42
- 해결책! : IEEE에서 각 속도마다 Path Cost를 정의
BandWidth(대역폭) | 4Mbps | 10Mbps | 16Mbps | 45Mbps | 100Mbps | 155Mbps | 622Mbps | 1Gbps | 10Gbps |
STP Cost(Path Cost) | 250 | 100 | 62 | 39 | 19 | 14 | 6 | 4 | 2 |
STP의 3가지 과정
① 네트워크 당 하나의 루트 브릿지를 선정한다.
② Non Root Bridge 당 하나의 루트 포트를 선정한다.
③ 세그먼트 당 하나의 데지그네이티드(Designated, 지정된) 포트를 선정한다.
루트 브릿지 (Root Bridge)
- 스패닝 트리 프로토콜을 수행할 때, 기준 브릿지 (스위치)
Non Root Bridge
- 루트 브릿지가 아닌 나머지 브릿지
- Non Root Bridge 당 하나씩의 루트 포트(Root Port)를 가져야 한다.
루트 포트 (Root Port)
- 루트 브릿지로 가장 빨리갈 수 있는 포트 (= 루트 브릿지와 가장 가까운 포트)
지정 포트 (Designated Port)
- 세그먼트 당 하나씩의 Designated Port를 가져야 한다. (세그먼트 = 브릿지, 스위치 간 서로 연결된 링크)
- 즉, 브릿지나 스위치가 서로 연결되어 있을 때, 이 세그먼트에서 반드시 한 포트는 Designated Port로 선출되어야 한다.
BPDU (Bridge Protocol Data Unit)
- Root BID(루트 브릿지의 BID), Root Path Cost(루트 브릿지까지의 경로 값), Sender BID(보내는 브릿지의 BID), Port ID(어떤 포트에서 보냈는지) 등을 담고 있다.
- 브릿지나 스위치가 부팅하면 각각의 포트로 매 2초마다 BPDU를 내보내면서 서로의 스패닝 트리 정보를 주고 받는다.
루트 브릿지 및 데지그네이티드 포트와 루트 선출 단계
① 누가 더 작은 Root BID를 가졌는가?
② 루트 브릿지까지의 Path Cost 값이 누가 더 작은가?
③ 누구의 BID(Sender BID)가 더 낮은가?
④ 누구의 포트 ID가 더 낮은가?
Root Bridge 선출하기
<1번 시나리오>
① B와 C는 부팅을 시작하고 서로의 BPDU를 주고 받게된다. 이 때, BPDU에 자신의 BID를 Root BID와 Sender BID에 각각 넣는다. (이제 막 부팅해서 다른 BPDU를 한 번도 못 받았기 때문이다.)
② 각 스위치는 주고받은 BPDU를 뜯어 자신의 BID와 비교한다.
- B의 상황 : 내 BID 값이 더 작으니까, 내가 Root 브릿지이고 C의 BPDU는 무시
- C의 상황 : B의 BID 값이 더 작으니까, 내 BPDU의 Root BID를 B의 BID로 바꾸고 B를 Root 브릿지로 인정.
<2번 시나리오>
① A가 부팅되는 상황. A는 자신의 BID를 담은 BPDU를 B와 C로 전송 (첫 부팅이기 때문에 Sender BID와 Root BID는 자신의 BID) B와 C도 BPDU를 A로 전송한다.
② BPDU를 받아 Root BID를 비교했을 때.
- A의 상황 : 내가 BID값이 낮으니 내가 Root 브릿지이고 B와 C의 BPDU 무시
- B와 C의 상황 : 기존의 Root BID 값보다 A의 BID 값이 작으니 A를 Root BID로 수정하고 Root 브릿지로 인정
∴ 결론
- 스위치는 부팅할 때, BPDU를 2초마다 전송하고 그 안의 Root BID, Sender BID는 자기 자신의 BID 값을 넣는다.
- BID 값을 비교해 낮은 BID를 가진 스위치가 Root 브릿지가 된다.
- 임의로 Root 브릿지를 지정하려면 Priority 값을 작게 주면 된다.
SW (config)# spanning-tree vlan 1 priority 100
SW # show spanning-tree
Non Root Bridge에서 Root Port 선출하기
※ 각 회선은 Fast Ethernet(100Mbps) => Path Cost : 19
① A는 루트 브릿지이다. 때문에 모든 포트의 Root Path Cost는 0이다. 즉, 모두 Root Port
② B와 C의 각 E0 포트는 루트인 A와 Fast Ethernet으로 연결되어 있고, 그 Path Cost는 19이다.
③ B와 C의 각 E1 포트는 서로 Fast Ethernet 으로 연결되어 있고, Root Bridge까지의 거리는 19+19=38이다.
②+③ 결론은 B와 C의 E0 포트가 Root Port로 선출된다.
결론
- 루트 브릿지의 모든 포트는 Root Path Cost가 0이기 때문에 Root Port
- Non Root Bridge에는 반드시 한 개의 루트 포트를 가진다.
데지그네이티드(Designated) 포트 선출하기
※ 데지그네이티드(Designated) 포트 = 활성 포트
① 세그먼트-1, 2의 A는 Root Bridge이고, E0, E1 포트의 Root Path Cost가 0이기 때문에, 당연히 데지그네이티드 포트는 A의 E0, E1 포트가 된다.
② 세그먼트-3의 B와 C의 각 E1 포트는 Root Path Cost가 19로 동일하므로 Sender BID 비교를 한다. B는 C보다 BID 값이 작기 때문에 B의 E1포트가 데지그네이티드 포트가 된다. C의 E1포트는 Non Designated Port(=Blocking Port)로 지정.
결론
- 루트 브릿지는 모든 포트가 데지그네이티드 포트가 될 수 있다.
- 세그먼트 당 한 개의 데지그네이티드 포트를 선출해야 한다.
- Non Designated Port : Root Port나 Designated Port가 아닌 나머지 포트
STP의 5가지 상태변화
Disable
- 포트가 고장나서 사용불가, 네트워크 관리자에 의한 Shutdown
Blocking
- 스위치 부팅 시, Shutdown 포트를 활성화 했을 때
- BPDU 송ㆍ수신 (루트 브릿지, 루트 포트, 데지그네이티드 포트, Non-Designated 포트 선출)
Listening
- 루트 포트나 데지그네이티드 포트로 선정되면 리스닝 상태가 된다.
- BPDU 송ㆍ수신 (새로운 스위치 접속, 브릿지나 스위치 구성값이 바뀌면 루트 포트나 데지그네이티드 포트에서 Non-Designated 포트로 변할 수 있다.)
Learning
- 리스닝 상태에서 있던 스위치 포트가 Forwarding Delay 디폴트 시간인 15초 동안 그 상태를 유지하면 러닝 상태로 넘어 간다.
- BPDU 송ㆍ수신
- MAC Address 학습 (MAC Address Table 생성)
Forwarding
- 러닝 상태에서 있던 스위치 포트가 Forwarding Delay 디폴트 시간인 15초 동안 그 상태를 유지(루트 포트나 데지그네이티드 포트에서 Non-Designated 포트로 바뀌지 않았다는 뜻)하면 포워딩 상태로 넘어 간다.
- 데이터 전송 가능 (데이터 프레임 송ㆍ수신 가능)
- MAC Address 학습
- BPDU 송ㆍ수신
- 블로킹 상태에서 포워딩 상태로 변화하기까지 총 30초 소요.
STP 시나리오 1
※ 모든 회선은 100Mbps
① 모든 스위치는 부팅 시, Blocking 상태이며, BPDU를 주고 받는다.
② C의 루트 브릿지 선정 : BID 값이 제일 낮음
③ 루트 포트와 데지그네이티드 포트 선정 : Root Path Cost가 가장 작은 포트는 Root Port가 되고, Root Path Cost가 동일한 경우 BID를 비교하여 데지그네이티드 포트를 선정한다.
선정된 루트포트와 데지그네이티드 포트는 리스닝, 러닝을 거쳐 포워딩 상태가 된다.
④ Non-Designated 포트는 Blocking 상태이며 링크가 끊어진다.
STP 시나리오2
※ 100Mbps → 19, 1Gbps → 4
① A의 루트 브릿지 선정 : BID 값이 제일 낮음
② 루트 포트 선정 : Root Path Cost가 가장 작은 포트, 데지그네이티드 포트 선정 : Root Path Cost가 동일한 경우 BID가 가장 작은 포트 → 포워딩 상태
③ Non-Designated 포트는 Blocking 상태
스패닝 트리 변화
Hello Time
- 루트 브릿지가 얼마 만에 한 번씩 Hello BPDU를 보내는지에 대한 시간
- 디폴트 타임 : 2초
Max Age
- 브릿지들이 루트 브릿지로부터 얼마 동안 Hello Packet을 받지 못했을 때, 루트 브릿지가 죽었다고 생각하고 새로운 스패닝 트리를 만들기 시작하는가에 대한 시간
- 디폴트 타임 : 20초
Forwarding Delay
- 브릿지 포트가 Blocking 상태에서 Forwarding 상태로 넘어갈 때까지 걸리는 시간
- 블로킹→리스닝(15초)→러닝(15초)→포워딩
- Blocking에서 Forwarding으로 넘어갈 때, 걸리는 시간은 Forwarding Delay의 두 배.
- 디폴트 타임 : 15초
① 루트 브릿지 A는 Non Root Bridge인 B와 C에게 Hello BPDU를 2초 마다 보낸다.
- Non Root Bridge는 받은 Hello BPDU를 자신의 데지그네이티드 포트로 다시 전달한다.
② A와 C간 링크 절단! C는 Hello Packet을 Max Age인 20초 동안 못 받을 시 스패닝 트리 변경!
③ B는 평상 시에도 E1으로 Hello BPDU를 뿌리고 있었으므로, C의 E1 포트는 루트 포트로 전환된다. (Blocking일 때, BPDU 송ㆍ수신 가능) Blocking → Forwarding 30초
- C의 E0 포트는 Blocking(Non-Designated) 상태로 전환된다.
결론
- 한 링크가 끊어졌을 때, STP를 이용해 다른 경로를 살리는데 걸리는 시간 : 50초
- (Max Age : 20s + Forwarding Delay : 15s + Forwarding Delay : 15s) => Convergence Time