본문 바로가기

네트워크/네트워크이론

[스위치] 스패닝 트리 ( STP - Spanning Tree Protocol )

스패닝 트리 알고리즘이란?
- 스위치나 브리지에서 발생하는 루핑을 막아주기 위한 프로토콜
- 스위치나 브리지 구성에서 출발지부터 목적지까지의 경로가 두 개 이상 존재할 때 한 개의 경로만을 남겨 두고 
   나머지는 모두 끊어 두었다가 사용하던 경로에 문제가 발생하면 그 때 끊어 두었던 경로를 하나씩 살린다.

< 브리지 ID >
- 브리지나 스위치들이 통신 할 때 서로를 확인하기 위해 하나씩 가지고 있는 번호
- 브리지 ID가 만들어지는 규칙


위의 그림에서 보듯이 브리지 ID는 16Bit의 브리지 우선순위 ( Bridge Priority )와 48Bit의 Mac Address로 만들어진다.

 앞쪽의 Bridge Priority는 16Bit로 만들어지기 때문에 올 수 있는 수는 0부터 2의 16제곱 -1까지가 된다.
따라서 Bridge Priority에 올 수 있는 수는 0부터 65535까지가 된다. 그런데 Bridge Priority는 Default로 그 중간에
해당하는 값인 32768을 사용한다. 즉 아무런 구성을 하지 않은 스위치나 브리지에서 Bridge Priority이라는 것이다.

 Bridge Priority 뒤에 오는 Mac Address는 스위치에 고정되어 있는 값이다. 따라서 자신의 고유 Mac Address가
Bridge Priority 뒤에 붙게 된다.
 예를 들어 Mac Address가 0260.8c01.1111인 스위치의 브리지 ID는 다음과 같다. ( Bridge Priority : Default 32768 )

 위 그림은 16진수로 표현한 것이고, 아래쪽이 2진수로 표현되어 있는 것이다. 이렇게 만들어진 Bridge ID는 나중에
스패닝 트리 프로토콜을 수행 할 때 아주 중요한 값으로 사용된다.

< Path Cost >
 Path란 장비와 장비가 연결되어 있는 링크를 뜻한다. 즉, Path Cost란 브리지가 얼마나 가까이, 그리고 빠른 링크로
연결되어 있는지를 알아보기 위한 값이다.

- IEEE에서 각 속도마다 위 표와 같은 Path Cost 값을 정의한다.
- 10Mbps, 100Mbps, 1Gbps, 10Gbps가 자주 사용된다.

 아래 그림은 위의 표를 바탕으로 Path Cost를 계산한 것이다.

- 스위치 A와 스위치 B는 10메가로 연결되어 있다. 따라서 스위치 B에서 스위치 A로 가는 Path Cost는 100이다.
- 스위치 A와 스위치 C는 100메가로 연결되어 있다. 따라서 스위치 C에서 스위치 A로 가는 Path Cost는 19이다.
- 스위치 C와 스위치 D는 100메가로 연결되어 있다. 따라서 스위치 D에서 스위치 C로 가는 Path Cost는 19이다.
- 스위치 D에서 스위치 A로 가는 Path Cost는 스위치 D에서 스위치 C로 가는 Path Cost 19와 다시 스위치 C에서
  스위치 A로 가는 Path Cost 19를 더한 값인 38이 된다.

< 스패닝 트리 프로토콜의 기본 동작 >
1. 네트워크 당 하나의 루트 브리지 ( Root Bridge ) 를 갖는다.
- 스패닝 트리 프로토콜을 수행할 때 기준이 되는 브리지나 스위치를 루트 브리지라 한다.

2. 루트 브리지가 아닌 나머지 모든 브리지 ( Non Root Bridge ) 는 무조건 하나씩의 루트 포트
  ( Root Port )를 갖는다.
- 루트포트란 루트 브리지에 가장 빨리 갈 수 있는 포트를 뜻한다.
- 네트워크 당 하나씩의 루트 브리지가 있으므로 루트 브리지를 제외한 나머지 모든 브리지는 자동으로
  Non Root Bridge가 된다. 따라서 브리지들은 루트 브리지쪽으로 가장 가까이 있는 로트 포트를 하나씩 지정해 주어야 한다.

3. 세그먼트당 하나씩의 데지그네이티드 포트 ( Designated Port ) 를 갖는다.
- 세그먼트란 브리지 또는 스위치 간에 서로 연결된 링크를 말한다. 즉, 브리지나 스위치 서로 연결되어 있을 때 이
  세그먼트에서 반드시 한 포트는 데지그네이티드 포트를 선출해야 한다.
- 데지그네이티드 포트 : 지정 포트

- 스패닝 트리 프로토콜에서는 루트 포트나 데지그네이티드 포트가 아닌 나머지 모든 포트는 다 막아버린다.
  즉 루트 포트와 데지그네이티드 포트를 뽑는 목적은 어떤 포트를 살릴지 결정하기 위해서이다.

< 스패닝 트리의 우선 순위 >
- 루트 브리지와 포트나 데지그네이티드 포트가 될 지 정하는 방법
1. 누가 더 잡은 Root BID를 가졌는가?
2. 루트 브리지까지의 Path Cost 값은 누가 더 작은가?
3. 누구의 BID ( Sender BID )가 낮은가?
4. 누그의 포트 ID가 더 낮은가?

- 브리지 ( 스위치 )는 스패닝 트리 정보를 자신들끼리 주고 받기 위해서 특수한 프레임을 사용하는데 이를
  BPDU ( Bridge Protocol Data Unit )이라고 한다. BPDU는 루트 브리지의 BID인 Root BID, 루트 브리지까지
  가는 경로 값인 Root Path Cost, 보내는 브리지의 BID인 Sender BID, 그리고 어떤 포트에서 보냈는지 알 수
  있게 하는 Port ID 정보등이 실려있다.

- 브리지나 스위치가 부팅을 하면 이들은 각가의 포트로 BPDU를 매 2초 마다 내보내면서 서로의 스패닝 트리
  정보를 주고 받게 된다. 즉 브리지는 이 BPDU를 서로 주고 받으면서 누가 루트 브리지이고 어떤 포트가 루트
  포트가 될 지, 그리고 어떤 포트가 데지그네이티드 포트를 결정하게 되다. BPDU는 스패닝 트리 프로토콜에서
  우체부와 같으며, 아주 중요한 역할을 한다.

< 루트 브리지 선정 >

위 그림에서 보듯이 이 네트워크에는 3대의 스위치가 있다. 그리고 각 스위치는 그림처럼 BID ( Bridge ID )를 갖는다.
( BID는 전체 64Bit로 구성되어 있고 가장 앞의 16비트에는 브리지 우선 순위 ( Bridge Priority )가, 뒤에 오는
48비트에는 브리지 또는 스위치의 맥어드레스가 위치 )

이제 루트 브리지를 선정하게 되는데, 조건은 무조건 낮은 BID를 갖는 브리지 ( 스위치 )가 루트 브리지가 된다.

위 그림의 스위치 B와 스위치 C는 서로 매 2초마다 뿌려지는 프레임인 BPDU를 주고 받는다.

브리지가 맨 처음 부팅하고 나서 내보내는 BPDU에는 Sender BID 정보는 물론 자기 자신의 BID를 넣게 된다.
루트 브리지의 BID 역시 자기 자신의 BPDU를 넣게 된다. ( 막 부팅이 끝나 다른 BPDU를 받지 못하였기 때문이다. )

다음과 같이 스위치 B와 스위치 C는 루트 브리지 BID를 자기 자신의 BID로 세팅하여 BPDU를 서로 주고 받는다.

▶ 스위치 B의 상황

- 스위치 B가 BPDU를 내보내고 얼마 지나지 않아 스위치 C로 부터 BPDU가 도착한다. 스위치 C의 BPDU를 도착한다.
스위치 C의 BPDU를 열어보니 여기에는 루트 브리지의 BID가 32768.3333.3333.3333으로 되어 있다.
스위치 B는 자신이 알 고 있던 정보, 즉 루트 브리지의 BID가 32768.2222.2222.2222라는 정보와 방금 스위치 C로 부터
받은 정보를 비교한다. 여기서 서로 비교하여 낮은 BID가 루트 브리지가 된다. 따라서 루트 브리지의 BID는
32768,2222,2222,222가 된다. 즉, 스위치 B는 방금 스위치 C에서 받은 BPDU를 무시한다.

▶ 스위치 C의 상황
- 스위치 C 역시 처음 부팅하고 나서 자신의 BID를 루트 브리지 BID라고 해서 세팅한 BPDU를 내보내고 얼마 되지
않아 스위치 B로부터 BPDU를 받는다. 스위치 B로부터 받은 BPDU에는 루트 브리지 BID가 32768.2222.2222.2222로
되어 있다. 이 값과 자신이 방금 보낸 BPDU에 있는 루트 브리지 ID 32768.3333.3333.3333을 비교해본다.
비교해 보니 스위치 B로 부터 받은 BPDU에 더 좋은 루트 브리지 ID ( 낮은 수의 BID )가 있는 것을 확인한다.
따라서 이제부터 스위치 C는 자신이 BPDU에 있는 루트 브리지 BID를 스위치 B의 BID로 바꾸어 다른 곳으로
전송하게 된다. 즉, 스위치 B를 루트 브리지로 인정하고 그의 명령을 따르게 된다.

▶ 스위치 A의 상황
- 스위치 A는 다른 스위치와 마찬가지로 맨 처음 부팅했을 때는 누가 루트 브리지인지 알지 못한다. 어느 누구에게도
BPDU를 받지 못했기 때문이다. 부팅을 마친 스위치 A는 자신의 BPDU에 루트 브리지의 BID를 자신의 BID인
32768.1111.1111.1111로 실어서 양 쪽의 스위치 B와 스위치 C에게 보낸다.
이 때 스위치 B와 스위치 C에서 역시 BPDU가 스위치 A쪽으로 날아온다. 스위치 B와 스위치 C에서 보낸 BPDU에
들어 있는 루트 브리지 BID 필드에는 스위치 B의 BID인 32768.2222.2222.222 값이 들어 있다.


위 그림에서 보듯 스위치 A와 스위치 B 중 BID가 더 낮은 32768.1111.1111.1111보다 낮은 수가 되어 스위치 C가
루트 브리지가 되는 것이다.

실제 시스코 스위치 Catalyst 2950에서 브리지 Priority 값을 변경 시키는 방법

  sw-3(config)# spanning-tree clan 1 priority 100
브리지의 Priority를 Dafault 값인 32768을 100으로 변경한다는 뜻이다.
브리지의 Priority 값이 바뀐 것은 ' show spanning-tree ' 명령어를 이용하여 확인 할 수 있다.

< Non Root Bridge의 루트 포트 선정 >

- 루트 브리지가 아닌 나머지 모든 브리지 ( Non Root Bridge )는 무조건 하나 씩의 루트 포트 ( Root Port )를 갖는다.

스위치 B와 스위치 C에서 루트 포트를 선정하려면 우선 Root Path Cost를 알아봐야 한다.
Root Past Cost는 쉽게 브리지까지의 Path Cost라고 생각하면 된다. 따라서 맨 처음 루트 브리지 스위치 A를 출발 할
때의 Root Path Cost는 0이 된다. 아래의 그림을 확인하면 알 수 있다.

▶ 스위치 B의 E0 포트에서 Root Path Cost 값 : 0 + 19 = 19
▶ 스위치 C의 E1 포트에서 Root Path Cost 값 : 19 + 19 = 38
  - 스위치 B의 E0 포트에서 Root Path Cost 값 19가 스위치 B의 E1 포트로 전달되고 다시 아래쪽 링크를 통해서 
    스위치 C의 E1포트로 전송됨
▶ 스위치 C의 E0 포트에서 Root Path Cost 값 : 0 + 19 = 19

 Root Path Cost 값을 계산하였으니 이제 루트 포트를 선정한다. 지금까지 계산한 Root Path Cost 값이 낮은
스위치 B의 E0 포트와 스위치 0의 E0 포트가 루트 포트로 선정된다.

< 데지그네이티드 포트 선정 >
- 루트 브리지까지의 Path Cost. 즉, 세그먼트 상에서 Root Path Cost를 서로 비교하여 더 작은 Root Path Cost를
가진 포트가 데지그네이티드 포트로 선정된다.

위 그림에서 R은 루트 포트이다. 그리고 데지그네이티드 포트를 찾기 위해 각 포트 별로 Root Path Cost를 구한다.
(각 링크는 100Mbps)

세그먼트 1을 보면 스위치 A의 E0와 스위치 B의 E0가 연결되어 있다. 이때 스위치 A의 E0는 자기가 루트 브리지이기
때문에 Root Path Cost가 0이 된다. 스위치 B의 E0포트의 Root Path Cost가 0이 된다. 따라서 세그먼트 1에서는
스위치 A의 E0포트가 데지그네이티드 포트가 된다.

세그먼트 2에서도 세그먼트 1에서와 같은 방법으로 스위치 A의 E1포트가 데지그네이티드 포트로 선정된다.
세그먼트 3에서도 서로 연결된 두 포트의 Root Path Cost 값이 같다. 이렇게 같으면 스패닝 트리 프로토콜 우선 순위
4가지 단계를 거친다. 
1단계 : 누가 더 작은 Root BID를 가졌는가?
  - 스위치 B와 C의 Root BID는 같다. 
    즉, 32786.1111.1111.1111이라는 똑같은 루트 BID를 가지기 때문에 결론이 나지 않는다.
2단계 : 루트 브리지까지의 Path Cost 값은 누가 더 작은가?
  - 모두 Root Path Cost 값이 같기 때문에 비교 할 수 없다.
3단계 : 누구의 BID가 더 낮은가?
  - Sender BID란 BPDU에 스패닝 트리 정보를 실어 보낼 때 발신자의 주소를 넣는 것과 같다. 즉, 자기 자신의 BID를 
   말하는 것이다. 따라서 스위치 B의 Sender BID는 32786.2222.2222.2222이고, 스위치 C의 Sender BID는
   32786.3333.3333.3333이기 떄문에 스위치 B의 E1포트가 데지그네이티드 포트로 선정된다.


여기서 ND란? Non Designated Port를 뜻 한다. 즉, 루트 포트나 데지그네이티드 포트가 아닌 나머지 포트를 의미한다.

< 스패닝 트리의 5가지 상태 변화 >
스패닝 트리 프로토콜을 구현해 나가는 과정에서 모든 스위치나 브리지의 포트들은 언제나 5가지로 상태가 변한다.
Disabled : 이 상태는 포트가 고장나서 사용 할 수 없거나 네트워크 관리자가 포트를 일부러 Shut Down 시킨 상태
   - 데이터 전송 X
   - 맥 어드레스를 배울 수 있는 여부 X
   - BPDU를 주고 받을 수 있는 여부 X

Blocking : 스위치를 맨 처음 켜거나 DIsabled되어 있는 포트를 관리자가 다시 살렸을 때 그 포트는 블로킹 상태로
    이 상태에서는 데이터 전송은 되지 않고 오직 BPDU만 주고 받을 수 있다. 
    ( 맨 처음 스위치가 켜지면 서로 BPDU를 주고 받으면서 루트 브리지를 선정하고, 루트 포트를 선정하고,
    데지그네이티드 포트를 선정하고, Non Designated 포트를 선정하는 과정이 스위치의 블로킹 상태에서 일어난다. )
    - 데이터 전송 X
    - 맥 어드레스를 배울 수 있는 여부 X
    - BPDU를 주고 받을 수 있는 여부 O

▶ Listening : 블로킹 상태에 있던 스위치 포트가 루트 포트나 데지그네이티드 포트로 선정되면 포트는 바로
    리스닝 상태로 넘어간다. 물론 리스닝 상태에 있던 포트도 네트워크에서 새로운 스위치가 접속했거나 브리지나
    스위치의 구성 값들이 바뀌면 루트 포트나 데지그네이티드 포트에서 Non Designated 포트로 상황이 변할 수 있다.
    - 데이터 전송 X
    - 맥 어드레스를 배울 수 있는 여부 X
    - BPDU를 주고 받을 수 있는 여부 O

Learning : 리스닝 상태에 있던 스위치 포트가 포워딩 딜레이 ( Forwarding Delay ) 디폴트 시간인 15초 동안 
    그 상태를 계속 유지하면, 리스닝 상태에서 러닝 상태로 넘어간다. 러닝 상태에서 비로소 맥 어드레스를 배워
    맥 어드레스 테이블을 만들게 된다.
    - 데이터 전송 X
    - 맥 어드레스를 배울 수 있는 여부 O
    - BPDU를 주고 받을 수 있는 여부 O

Forwarding : 스위치 포트가 러닝 상태에서 다른 상태로 넘어가지 않고, ( 루트 포트나 데지그네이티드 포트에서
    Non Designated 포트로 바뀌지 않았다는 의미이다. ) 다시 포워딩 딜레이 디폴트 시간인 15초 동안 그 상태를
    계속 유지하면 러닝 상태에서 포워딩 상태로 넘어가게 된다. 즉, 블로킹 상태에 있던 포트가 리스닝과 러닝을 거쳐
    포워딩 상태로 오려면 디폴트 딜레이인 15가 두 번 지난 30초가 된다. 
    - 데이터 전송 O
    - 맥 어드레스를 배울 수 있는 여부 O
    - BPDU를 주고 받을 수 있는 여부 O


 





좌측의 그림을 보면 리스닝, 러닝, 포워딩 상태에서 다시 블로킹 상태로
화살표가 있는 것을 볼 수 있다. 이는 리스닝, 러닝, 포워딩 상태에 있던
포트도 루트 포트나 데지그네이티드 포트에서 Non Designated포트로
바뀌면, 언제든지 바로 블로킹 상태로 넘어갈 수 있다는 의미이다. 또 모든
포트에서 Disable 상태 쪽으로 화살표가 있다는 것은 포트가 어떤 상태에
있든지 사용자에 의한 Shut Down 명령이나 포트의 고장으로 인하여
언제든지 Disable 상태로 변할 수 있다는 의미이다.







< 참조 : http://blog.naver.com/darkangelo?Redirect=Log&logNo=90083377355 >