CS/네트워크

스패닝 트리 프로토콜

alpacadabra 2023. 10. 8. 18:28

먼저 스패닝트리란, 그래프의 모든 정점을 포함하면서 루프가 없는 부분그래프(=트리)를 말한다.

하나의 그래프는 여러 스패닝 트리를 가질 수 있는데, 예를 들어

좌측의 그래프는 우측의 두 스패닝 트리를 가질 수 있다. (물론 더 있다)

그리고 최소 스패닝 트리는 여러 스패닝 트리 중에서도 가중치의 합이 최소인 녀석을 말한다.

 

스패닝 트리 프로토콜은 이름에서도 알 수 있듯 스패닝 트리를 만들기 위한 프로토콜이다.

그리고 네트워크는 그래프와 형태가 유사하고 실제로 토폴로지를 그래프로써 표현하곤 한다.

만일 스패닝 트리 프로토콜을 통해 네트워크(그래프)에서 스패닝 트리를 뽑아낼 수 있다면, 모든 노드가 연결되어 있으면서 루프가 없는 이상적인 네트워크가 구성되는 것이다.

 

다만 스패닝 트리 프로토콜은 Layer 3 이상에서는 필요치 않다.

이미 동적 라우팅 프로토콜에서 루프 생성을 막아주고 있고, ttl 필드가 한번 더 막아주기 때문이다.

그렇다면 왜 Layer 2에서는 필요한 것인가?

 

위 그림처럼 스위치가 3개 이상 묶여있으면 브로드캐스트 패킷에 의해 루프가 발생할 수 있기 때문이다. 그리고 프레임은 ttl도 없다.

이러한 브로드캐스트 스톰은 네트워크에 치명적이므로 모든 스위치에서는 stp를 기본적으로 사용하도록 되어 있다.

또한 루프가 없다는게 확인되기 전까지는 포트가 차단된다.

참고로 스패닝 트리 프로토콜(줄여서 stp)은 스위치가 아닌 브리지라는 용어를 사용한다.

지금에야 허브-브리지가 아닌 스위치가 통용되고 있으나 stp가 처음 사용된 1990년대(802.1d)에는 그렇지 않았기 때문이다.

 

stp의 작동 원리를 크게 3단계로 나눠보면,

 

1. 루트 브리지는 브리지 id가 가장 낮은 스위치로 선정한다

브리지 id는 관리자가 설정한 priority(2바이트)와 스위치의 mac 주소(6바이트)를 붙인 것이다.

일반적으로 스위치는 transparent하므로 mac 주소를 갖지 않지만, 관리 목적으로 ip 및 mac을 부여할 수 있다.

 

2. 루트 브리지를 제외한 모든 스위치는 루트 포트를 가져야 한다

루트 포트는 루트 브리지로 가는 비용이 가장 저렴한 포트이다. 비용은 대역폭에 의해 정해진 값이 있다. 예를 들어 100Mbps는 19, 1Gbps는 4다.

 

3. 루트 포트의 반대쪽 포트는 데지그네이티드(Designated) 포트이다

만약 세그먼트에 루트 포트가 없다면,

- 루트까지의 비용이 더 저렴한 포트

- 더 작은 브리지 id를 가진 포트

를 데지그네이티드 포트로 선정하고 다른 쪽은 블로킹(Non-designated)한다.

 

좌측 그림에 위의 3단계를 적용시키면 우측과 같은 그림을 얻을 수 있다.

블로킹된 포트는 bpdu(Bridge Protocol Data Unit)만 주고받으며 실질적인 데이터 전송은 이루어지지 않는다.

따라서 빨간 회선을 제외한 초록 회선이 선택된 스패닝 트리가 되겠다.

 

출처: flackbox.com, 주황불이 들어온 CD1의 G0/2가 Block 상태임을 알 수 있다

만약 트리에 문제가 생기면 스위치들은 재수렴을 시도할 것이다.

수렴 및 재수렴은 stp의 버전에 따라 다르나, 기초적인 stp는 30~50초 정도가 걸리므로 상당히 오래 걸리는 편이다.

이후에는 수렴이 빠른 rstp(Rapid stp, 802.1w)와 vlan에 대응하는 mstp(Multiple stp, 802.1s)가 등장하여 활용도가 더욱 높아졌다.

Cisco 장비의 경우 pvst+(per vlan spanning tree)와 rpvst+(rapid pvst)라는 독자적인 프로토콜이 존재하여 이를 사용하곤 한다.

pvst+와 mstp의 차이점이라면 pvst는 각각의 vlan마다 스패닝 트리를, mstp는 여러 vlan을 그룹으로 묶어 스패닝 트리를 인스턴스화하는 것이다.

 

이미 스패닝 트리가 완성된 토폴로지에서는 엔드호스트(pc, 프린터 등)을 수십대 추가한다고 하여 루프가 생길 수가 없다.

그런데도 연결할 때마다 포트가 활성화될 때까지 대기해야 하는건 불합리한 일이다.

이럴 때는 portfast를 설정하여 대기하지 않아도 바로 사용할 수 있도록 하면 된다.

portfast는 포트마다 각각 설정하거나 한번에 적용시킬 수 있다. 적용된 포트는 stp를 수행하지 않아도 바로 포워딩 상태로 넘어간다.

 

Acc3>en
Acc3#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Acc3(config)#int f0/1
Acc3(config-if)#spanning-tree portfast 
%Warning: portfast should only be enabled on ports connected to a single
host. Connecting hubs, concentrators, switches, bridges, etc... to this
interface  when portfast is enabled, can cause temporary bridging loops.
Use with CAUTION

%Portfast has been configured on FastEthernet0/1 but will only
have effect when the interface is in a non-trunking mode.

Acc3(config-if)#spanning-tree bpduguard enable

하지만 portfast를 설정하면 위와 같이 경고 메세지가 출력되는데, 만약 pc와 같은 싱글 호스트가 아닌 허브, 스위치 등을 연결하면 루프가 발생할 수도 있다는 뜻이다. (아마 새로운 스위치가 다른 2개의 스위치와 연결될 수 있음을 내포하는 듯)

이를 방지하려면 마지막 줄과 같이 bpdu guard를 설정해야 한다.

bpdu가 수신된다는 것은 해당 포트에 스위치가 연결되었거나 stp 공격이 들어왔다는 것을 의미한다.

하지만 의도치 않은 연결은 위 경고문과 같이 루프가 생성될 가능성이 있으니 portfast와 함께 bpdu guard를 설정해주는 것이 좋다.

bpdu gurad가 적용된 포트는 bpdu가 수신될 경우 자동으로 포트를 비활성화 시킨다.

비슷한 기능으로 root guard를 통해 루트 브리지가 변경되는 문제를 막을 수도 있다.