Wisdom’s Cloud
[NETWORK] 17. 스패닝 트리 프로토콜 본문
스패닝 트리 프로토콜(STP, Spanning Tree Protocol)이란?
- 스패닝 트리 프로토콜은 스위치의 루핑을 방지하기 위한 프로토콜이다.
- STP를 이해하기 위해서는 먼저 2가지 개념을 이해할 필요가 있다. 그 첫 번째가 브리지 ID(Bridge ID)이고, 두 번째는 Path Cost다.
- 브리지 ID는 16비트의 브리지 우선순위(Briged Priority)와 48비트의 맥 어드레스로 구성된다. 앞 쪽에 있는 브리지 우선순위는 16비트로 만들어지기 때문에 올 수 있는 수는 0~65535까지가 되며, 디폴트로 그 중간에 해당하는 값인 32768을 사용한다. 브리지 우선순위 뒤에 오는 맥 어드레스는 스위치에 고정되어 있는 값이다. 왼쪽 그림에서 위쪽이 16진수 방식으로 표시한 것이고, 아래쪽이 2진수로 표현되어 있다.
- Path Cost는 말 그대로 길을 가는데 드는 비용이다. 즉 브리지가 얼마나 가까이, 그리고 빠른 링크로 연결되어 있는지를 알아내기 위한 값이다. 원래 STP를 정의하고 있는 IEEE 802.1D에서 이 Cost 값을 계산할 때 1,000Mbps를 두 장비 사이의 링크 대역폭으로 나눈 값을 사용했다. 즉 링크 속도(대역폭)가 빠르면 그만큼 빨리 도착할 테니 Path Cost는 적게 든다. 하지만 다양한 속도가 나오는 바람에 소수점 값이 나오게 되었고, 이를 막기 위해 IEEE는 아예 정수 값으로 오른쪽 그림과 같이 Path Cost를 지정했다.
STP의 기본적인 동작
- 네트워크당 하나의 루트 브리지(Root Bridge)를 갖는다. 즉 하나의 브로드캐스트 도메인에 하나씩의 루트 브리지가 있다.
- 루트 브리지가 아닌 나머지 모든 브리지(Non Root Bridge)는 무조건 하나씩의 루트 포트(Root Port)를 갖는다. 여기서 루트 포트란 루트 브리지 쪽에 가장 가까운 포트를 말한다.
- 세그먼트(Segment) 당 하나씩의 데지그네이티드 포트(Designated Port)를 갖는다. 여기서 세그먼트란 브리지 또는 스위치 간에 서로 연결된 링크라고 보면 되고, 데지그네이티드 포트는 지정 포트로 해석하면 된다. 즉 브리지나 스위치가 서로 연결되어 있을 때 이 세그먼트에서 반드시 한 포트는 지정 포트로 선출되어야 한다는 것이다.
- 루트 포트나 데지그네이티드 포트가 아닌 나머지 모든 포트는 다 막아버린다. 즉 루트 포트와 데지그네이티드 포트를 뽑는 목적은 어떤 포트를 살릴지 결정하기 위한 것이다.
Root Port와 Designated Port의 선정 기준
- 누가 더 작은 Root BID를 가졌는가?
- 루트 브리지까지의 Path Cost 값은 누가 더 작은가?
- 누구의 BID(Sender BID)가 더 낮은가?
- 누구의 포트 ID가 더 낮은가?
- 이 4단계를 설명하기 전에 먼저 BPDU에 대해서 알아야 한다. 브리지는 스패닝 트리 정보를 자기들끼리 주고받기 위해서 특수한 프레임을 사용하는데, 이를 BPDU(Bridge Protocol Data Unit)라고 한다. 이 BPDU에는 루트 브리지의 BID인 Root BID, 루트 브리지까지 가는 경로 값인 Root Path Cost, 보내는 브리지의 BID인 Sender BID, 그리고 어떤 포트에서 보냈는지를 알게 해주는 Port ID 정보 등이 실려 있다.
- 브리지나 스위치가 부팅을 하면 이들은 각각 포트로 BPDU를 매 2초마다 내보내면서 서로의 스패닝 트리 정보를 주고받게 된다. 즉 브리지는 이 BPDU를 서로 주고받으면서 누가 루트 브리지고 어떤 포트가 루트 포트가 될지, 그리고 어떤 포트가 데지그네이티드 포트가 될지를 결정하게 된다.
Root Bridge 선출 방법
- 먼저 스위치 B와 스위치 C가 부팅을 시작했다고 가정하자. 그럼 이제 스위치 B와 스위치 C는 서로 BPDU를 주고받게 된다.
- 브리지가 맨 처음 부팅하고 나서 내보내는 BPDU에는 Sender BID 정보는 물론 루트 브리지의 BID에 자기 자신의 BID를 넣게 된다. 왜냐하면 이 브리지는 이제 막 부팅이 끝나 다른 BPDU를 한 번도 받지 못했기 때문에 일단 이 네트워크에는 자기 혼자 있다고 생각하기 때문이다.
- 이렇게 스위치 B와 스위치 C는 BPDU를 서로 주고받은 후 자기가 알고 있던 정보와 받은 정보를 비교하여, 낮은 BID를 가진 스위치를 루트 브리지로 선출한다. 따라서 스위치 B는 방금 스위치 C에서 받은 BPDU를 무시해버리고, 스위치 C는 자신의 BPDU에 있는 루트 브리지 BID를 스위치 B의 BID로 바꾸어 다른 곳으로 전송하게 된다. 이제 스위치 B와 스위치 C 사이에서 루트 브리지는 선출되었다.
- 하지만 잠시 후 새로운 스위치 A가 부팅을 시작했다고 가정하자. 마찬가지로 스위치 A는 BPDU에 루트 브리지의 BID를 자기 BID로 실어서 양쪽의 스위치 B와 스위치 C에 보낸다. 스위치들이 서로 BPDU 값을 주고받고 나면, 스위치 A의 BID가 제일 낮기 때문에 최종적으로 스위치 A가 루트 브리지가 된다.
- 간단하게 정리하면, BID가 가장 낮은 값을 가지고 있는 브리지가 루트 브리지가 되는 것이다. 중요한 건 브리지나 스위치가 맨 처음 부팅해서 루트 브리지를 찾아가는 과정이므로 이 과정을 꼭 이해해야 한다.
Root Port 선출 방법
- Non Root Bridge인 스위치 B와 스위치 C에서 루트 포트를 뽑으려면 우선 Root Path Cost를 알아봐야 한다. Root Path Cost는 쉽게 루트 브리지까지의 Path Cost라고 생각하면 된다.
- 그림에서 각 스위치들은 패스트 이더넷(100Mbps)으로 연결되어 있다고 가정해보면 Path Cost는 19가 된다.
- 따라서 맨 처음 Root Bridge인 스위치 A를 출발할 때의 Root Path Cost는 0이고, 스위치 B의 E0 포트에서는 Root Path Cost 값이 19(0+19)가 된다.
- 이 값은 스위치 B의 E1 포트로 전달되고 다시 아래쪽 링크를 통해서 스위치 C의 E1 포트쪽으로 전달되며, 스위치 C의 E1 포트에서 Root Path Cost 값은 38(0+19+19)가 된다.
- 마찬가지로 스위치 C의 E0 포트에서는 19, 스위치 B의 E1 포트에서는 38이 된다.
- 따라서 지금까지 계산한 Root Path Cost 값이 낮은 스위치 B의 E0 포트와 스위치 C의 E0 포트를 루트 포트로 선정한다.
Designated Port 선출 방법
- 세그먼트 상에서 Root Path Cost를 서로 비교해서 더 작은 Root Path Cost를 가진 포트가 데지그네이티드 포트로 선출된다.
- 먼저 세그먼트 1을 보면, 스위치 A의 E0 포트는 자기가 루트 브리지이기 때문에 당연히 Root Path Cost가 0이 되고, 스위치 B의 E0 포트는 100Mbps로 루트 브리지와 연결되어 있기 때문에 19가 된다. 따라서 세그먼트 1에서는 스위치 A의 E0 포트가 데지그네이티드 포트로 선출된다.
- 마찬가지로 계산해 보면 세그먼트 2에서도 역시 스위치 A의 E1 포트가 데지그네이티드 포트로 선정된다. 즉 루트 브리지의 모든 포트들은 언제나 데지그네이티드 포트로 선정된다는 사실을 알 수 있다.
- 마지막으로 세그먼트 3에서는 서로 연결된 두 포트의 Root Path Cost가 같기 때문에 이럴 때는 위에서 배운 선정 기준을 따르면 된다.
- 누가 더 작은 Root BID를 가졌는가? 스위치 B나 스위치 C 둘 다 똑같은 루트 BID를 가지고 있기 때문에 1단계에서 판가름이 나지 않는다.
- 루트 브리지까지의 Path Cost 값은 누가 더 작은가? 마찬가지로 2단계에서도 판가름이 나지 않는다.
- 누구의 BID(Sender BID)가 더 낮은가? Sender BID란 BPDU에 스패닝 트리 정보를 실어 보낼 때 발신자의 주소를 넣는 것과 같으며, 자기 자신의 BID를 말한다. 따라서 스위치 B의 BID가 더 작기 때문에 스위치 B의 E1 포트가 데지그네이티드 포트로 선정되고, 스위치 C의 E1 포트는 루트 포트나 데지그네이티드 포트가 아니므로 Non Designated Port가 된다.
- 누구의 포트 ID가 더 낮은가? 만약 3단계에서도 승부가 나지 않는 다면 마지막 4단계로 포트 ID까지 비교해 판단을 내린다.
STP의 5가지 상태 변화
- Disabled: 포트가 고장나서 사용할 수 없거나 네트워크 관리자가 포트를 일부로 Shut Down 시켜놓은 상태다. (데이터 전송 X, 맥 어드레스 배우기 X, BPDU 주고받기 X)
- Blocking: 스위치를 맨 처음 켜거나 Disabled되어 있는 포트를 관리자가 다시 살렸을 때 그 포트는 블로킹 상태로 들어간다. (데이터 전송 X, 맥 어드레스 배우기 X, BPDU 주고받기 O)
- Listening: 블로킹 상태에 있던 스위치 포트가 루트 포트나 데지그네이티드 포트로 선정되면 포트는 바로 리스닝 상태로 넘어간다. 물론 리스닝 상태에 있던 포트도 네트워크에 새로운 스위치가 접속했거나 브리지나 스위치의 구성값이 바뀌면 루트 포트나 데지그네이트드 포트에서 Non Designate 포트로 상황이 변하기 때문에 다시 블로킹 상태로 돌아갈 수 있다. (데이터 전송 X, 맥 어드레스 배우기 X, BPDU 주고받기 O)
- Learning: 리스닝 상태에 있던 스위치 포트가 Fowarding Delay 디폴트 시간인 15초 동안 그 상태를 계속 유지하면 리스닝 상태는 러닝 상태로 넘어간다. (데이터 전송 X, 맥 어드레스 배우기 O, BPDU 주고받기 O)
- Forwarding: 스위치 포트가 러닝 상태에서 다른 상태로 넘어가지 않고 다시 Fowarding Delay 디폴트 시간인 15초 동안 그 상태를 계속 유지하면 러닝 상태에서 포워딩 상태로 넘어가게 된다. (데이터 전송 O, 맥 어드레스 배우기 O, BPDU 주고받기 O)
- 리스닝, 러닝, 포워딩 상태에 있던 포트도 루트 포트나 데지그네이티드 포트에서 탈락되면 바로 블로킹 상태로 넘어갈 수 있으며, 모든 포트들은 어떤 상태에 있든지 사용자에 의한 Shut Down 명령이나 포트의 고장으로 인해 언제라도 Disable 상태로 변할 수 있다.
- 이렇게 5가지 상태 변화를 통해 스위치나 브리지는 링크를 막기도 하고 열기도 하면서 스패닝 트리를 만든다.
'NETWORK' 카테고리의 다른 글
[NETWORK] 19. 스패닝 트리 재편성 (0) | 2021.02.18 |
---|---|
[NETWORK] 18. 스패닝 트리 예시 (0) | 2021.02.17 |
[NETWORK] 16. 서브넷 마스크 (0) | 2021.02.04 |
[NETWORK] 15. A, B, C, D, E 클래스 (0) | 2021.02.04 |
[NETWORK] 14. 루핑, 스패닝 트리 알고리즘 (0) | 2021.01.28 |