본문 바로가기
Network Infra 쉽게 이해하기/L2 Network 쉽게 이해하기

Spanning Tree Protocol(STP) 쉽게 이해하기 #2

by 네트워크 엔지니어 환영 2021. 4. 17.
반응형

지난 문서에서는 스패닝 트리 프로토콜에 대해 소개했습니다. 일선의 실무 현장에서 흔히 사용되는 박스형 네트워크 구조와 그로 인한 브로드캐스트 폭풍의 발생, 그리고 그것을 막기 위해 스패닝 트리 프로토콜을 사용한다고 말씀드렸죠. 일명 Loop(이하 루프)가 도는 것을 막는다고 설명했습니다. 그리고 스패닝 트리 프로토콜 동작 과정은 2가지로 나뉜다고도 말씀드렸습니다. 

동작 과정 1> Root Switch, Non Root Switch 선출
동작 과정 2> Root / Designated / Alternated Port(이하 루트 / 지정 / 블락 포트) 선출

먼저 동작 과정 1에 해당하는 스패닝 트리 구조 내에서 Root Switch(이하 루트 스위치)로 선정될 스위치를 찾습니다. 루트 스위치는 스패닝 트리 구조에서 구심점 역할을 하며 모든 Non Root Switch(이하 일반 스위치)들은 루트 스위치를 바라보고 가장 가까운 경로를 탐색합니다. 스위치 간의 역할이 정리되면 동작 과정 2에 따라 일반 스위치들은 루트 스위치로 향하는 가장 가까운 경로에 있는 포트를 루트 포트로 선정하고 루트 포트의 반대 포트를 지정 포트로 지정해 데이터 이동을 가능케 합니다. 그리고 루트 포트도, 지정 포트도 아닌 포트는 결국 일반 데이터 이동이 차단되는 블락 포트가 되죠. 이 과정에 대해 자세히 알아보고자 합니다. 과정을 알아보기에 앞서 Bridge Protocol Data Unit(BPDU)에 대해 알아야 합니다.

 

Bridge Protocol Data Unit(BPDU)

Bridge Protocol Data Unit(BPDU)는 루프 없는 구성, 스패닝 트리를 구성할 때 사용하는 이더넷 프레임입니다. 즉 스위치들 간의 대화 수단인 것입니다. 스위치들은 BPDU를 주고받으며 서로의 우선순위를 확인하고 루트 스위치를 결정합니다. 이를 Configuration BPDU라고 합니다. 또한 스위치 장애 혹은 스위치 간 링크 장애 발생으로 인해 네트워크에 변화가 생기면 루트 스위치에게 보고하는 경우에도 BPDU가 사용되는데 이를 TCN(Topology Change Notification) BPDU라고 합니다. 

그 중에서 Configuration BPDU(이하 설정 BPDU)의 구성을 보면 다음과 같습니다.  

<BPDU 프레임의 구성(출처 : 피터 전님의 랜 스위칭)>

설정 BPDU를 구성하는 다양한 정보들이 보입니다. Root Bridge ID, Path Cost, Port ID 등 경로 구성에 중요한 역할을 하는 요소들이 보입니다. 그중에서 우리가 주목해야 할 것은 'Bridge ID'입니다. Bridge ID(이하 브리지 ID)는 각 스위치가 갖는 일련의 숫자로 스패닝 트리를 구성하고자 하는 스위치들은 이 브리지 ID의 값 크기를 비교하여 서열을 정합니다. 값은 0 ~ 32768이며 값이 작을수록 더 높은 우선순위(서열)을 갖게 됩니다. 이 숫자는 사용자가 임의로 지정할 수 있습니다. 브리지 ID를 다시 자세히 들여다보면 다음과 같이 구성됩니다.

<브리지 ID의 구성(출처 : 피터 전님의 랜 스위칭)>

'MAC 주소'는 여러분이 다 아시는 스위치의 MAC 주소를 의미합니다. 그리고 '우선순위'는 위에서 언급한 숫자인 0 ~ 32768VLAN 번호를 더한 값입니다. 이 두 개 값을 이용하여 브리지 ID를 생성하는 것이죠. 우선순위에 VLAN 번호를 추가로 부여하는 이유는 VLAN별로 스패닝 트리를 구성하는 PVST(Per VLAN Spanning Tree)를 실현하기 위함입니다. VLAN 번호가 없다면 모든 VLAN이 다 같은 우선순위 값을 가질 수밖에 없을 테니 VLAN별로 우선순위를 줄 수 없어 매우 곤란해지겠죠? VLAN 10번의 우선순위만 바꾸고 싶은데 VLAN 20, 30의 우선순위도 함께 바뀔 테니 말입니다.

스패닝 트리 프로토콜이 동작하기 위한 중요한 요소들을 살펴보았으니 본격적으로 스패닝 트리 프로토콜이 동작하는 과정을 살펴보도록 하겠습니다.

 

동작 과정 1 > Root Switch(Root Bridge)와 Non Root Switch(Non Root Bridge) 선출

스패닝 트리 프로토콜 동작 과정에서 눈여겨볼 특이점은 루트 스위치(루트 브리지)를 중심으로 연결되는 스위치들이 뿌리처럼 뻗어나가는 구조를 취한다는 것입니다. 스위치가 추가되면 될수록 Root Bridge(이하 루트 브리지)가 아닌 Non Root Bridge(이하 일반 스위치)들은 모두 루트 스위치를 바라보게 됩니다. 마치 나무의 뿌리 모양처럼 말이죠. 그래야만 루트 브리지(루트 스위치)를 필두로 스위치 간 서열을 정리하고 인터페이스를 차단할 스위치를 정할 수 있겠죠. 그러므로 먼저 루트 브리지를 선출하는 과정을 살펴보겠습니다.

앞서 말씀드린 것처럼 스위치의 서열을 정하는 것은 Bridge ID입니다. 스위치들은 BPDU 프레임을 주고 받으며 브리지 ID를 확인하고 누구의 서열이 더 높은지 판단합니다. 지난 문서에서 봤던 박스형 구조의 스위치 4대가 어떻게 루트 브리지를 정하는지 살펴보도록 하겠습니다.

<스위치들의 브리지 ID>

위 그림에서 스위치들의 브리지 ID를 확인할 수 있습니다. 좌측 상단의 스위치의 브리지 ID가 가장 높고 우측 하단의 스위치의 브리지 ID가 가장 낮군요. 스위치들이 연결되고 스패닝 트리 프로토콜이 동작하기 시작하면 모든 스위치들은 자신이 루트 스위치라고 주장하며 BPDU를 보내기 시작합니다. 그러다 자신보다 더 높은 브리지 ID가 담긴 BPDU를 전달받으면 더 이상 루트 브리지임을 주장하지 않고 BPDU 프레임에 자신이 받은 가장 높은 브리지 ID를 'Root Bridge ID(이하 루트 브리지 ID)'에 담아 다른 스위치들에게 전달하죠. 자신보다 높은 브리지 ID가 담긴 BPDU 프레임을 받아든 스위치들 또한 더 이상 루트 브리지임을 주장하지 않고 일반 스위치로서 움직입니다.

<루트 브리지로 지정된 좌측 상단 스위치>

좌측 상단의 스위치의 브리지 ID가 가장 높기 때문에 루트 브리지로 선정되었습니다. 그리고 인접한 스위치들은 루트 브리지를 인정하고 루트 브리지만을 바라보게 됩니다. 이 인접한 스위치들에 연결되는 스위치들 또한 루트 브리지보다 브리지 ID가 높지 않다면 마찬가지로 루트 브리지를 바라보게 되겠죠. 루트 브리지가 선정되었고 스위치간 서열이 정해졌으니 이제 차단할 포트를 찾는 일이 남았군요.

 

동작 과정 2 > Root / Designated / Alternated Port 선출

브리지 ID를 통해 스위치의 서열을 정했으니 이번엔 각 스위치들의 포트의 서열을 매길겁니다. 이 서열은 스위치 내에서만 적용되며 다른 스위치와 경합하는 것이 아닙니다. 하지만 포트의 서열 또한 루트브리지까지의 거리가 얼마나 가까운 지를 경쟁하는 것이기 때문에 루트 브리지의 영향에서 벗어날 수 없습니다. 그 전에 기억해야 할 요소가 두 가지 있으니 바로 'Segment(이하 세그먼트)'와 'Path Cost(이하 경로값)'입니다.

<Segment의 정의>

세그먼트는 인접한 네트워크 장비간의 연결을 뜻합니다. 위 그림에서는 총 4개의 세그먼트를 확인하실 수 있죠. 장비간 연결이 4개이니까요. 세그먼트가 중요한 이유는 아래 한 가지 규칙 때문입니다. 스패닝 트리 구조 내에서 어느 포트가 어떤 역할을 맡아야 할 지 헷갈릴 때 아래 규칙을 기억하면 쉽습니다.

하나의 세그먼트에는 반드시 하나의 지정 포트가 있어야 한다.  

Path Cost(이하 경로값)은 포트에 적용된 속도를 값으로 변환한 것으로 속도에 대한 적용값은 다음과 같습니다.

<Path Cost(출처 : 피터 전님의 랜 스위칭)>

스위치와 스위치가 연결되면 Speed와 Duplex에 대해 협상을 하고 서로 동일한 Speed와 Duplex를 갖게 되는데 바로 스위치의 포트에 설정된 속도가 표에서의 속도(bandwidth)입니다. 그리고 속도마다 다른 경로값을 부여하고 이를 스패닝 트리 구성에 활용합니다. 다시 말해 스위치 자신의 경로값과 루트 브리지까지의 경로에 위치한 스위치의 경로값을 모두 고려합니다. 루트 브리지로 향하는 경로의 경로값을 모두 더해 가장 작은 값이 나오는 경로를 택하는 것이죠.(스위치 데이터베이스에 BPDU를 수신할 때 받은 인터페이스의 경로값을 합산하여 저장합니다.) 아래 그림에서 포트에 설정된 경로값을 확인할 수 있습니다.

<Path Cost의 정의>

브리지 ID가 4096인 스위치는 루트 브리지로 향하는 세그먼트가 하나뿐이며 경로값은 19입니다. 브리지 ID가 8192인 스위치는 두 개의 경로가 있으며 하나는 경로값이 38(19 + 19), 하나는 경로값이 119(100 + 19)입니다. 경로가 두 개인데 한 쪽 경로의 값이 훨씬 작으니 스위치는 작은 경로값의 세그먼트를 통신경로로 사용할 것이 분명합니다. 세그먼트와 경로값에 대해 알아보았으니 이제 본격적으로 포트를 선출하는 순서에 대해 알아보겠습니다.

Root Port 선출

이 문서의 첫 번째 문단에서 스패닝트리의 구성은 나무 뿌리와 같다고 말씀드렸죠. 가장 중요한 나무 뿌리인 루트 브리지로 향하는 가장 가까운 포트가 먼저 선출되며 이를 루트 포트라고 합니다. 데이터와 BPDU 프레임이 이동하는 포트입니다. 루트 포트를 선출하는 기준은 다음과 같습니다.

1. 가장 작은 경로값을 가지는 포트
2. 인접한 스위치의 브리지 ID가 가장 낮은 포트
3. 인접한 스위치의 포트 ID가 가장 낮은 포트(포트 ID : 포트 번호)

위의 기준을 적용해보면 스위치들의 루트 포트는 다음과 같이 정해집니다. 먼저 브리지 ID가 4096인 스위치들은 첫 번째 기준에 의거 루트 스위치로 향하는 경로값이 가장 적은 포트(경로값 : 19)를 루트 포트를 정하게 됩니다. 첫 번째 기준을 충족했기 때문에 두 번째, 세 번째 기준을 볼 필요가 없죠.

브리지 ID가 8192인 스위치는 왼쪽으로 향하는 경로가 경로값이 훨씬 작기 때문에 왼쪽 포트(경로값 38)를 루트 포트로 선택했습니다. 만약 경로값이 양쪽 모두 같았다면 어떻게 했을까요? 두 번째 기준인 브리지 ID가 가장 낮은 스위치를 접한 포트를 선택했을 것입니다. 하지만 아래 그림을 보시다시피 인접한 스위치들은 모두 같은 브리지 ID값을 갖고 있죠. 그럼 두 번째 기준 또한 적용되지 않을 것입니다. 그럼 세 번째 기준을 볼까요? 인접한 스위치 모두 포트 번호가 2번이라고 가정하면 결국 이 기준 또한 적용되지 않습니다. 마지막으로 스위치는 자신의 포트 번호를 보고 가장 낮은 포트 번호(숫자가 작을수록 낮은 포트)를 루트 포트로 택하게 되죠.

<Root Port 결정>

Designated Port 선출

지정 포트는 루트 포트, 아래에 서술할 블락 포트도 아닌 포트를 이르는 말입니다. 단순 포워딩 포트라고 봐도 되겠네요. 데이터와 BPDU 프레임을 전송하는 포트입니다. 지정 포트를 선출하기 위한 규칙은 루트 포트를 선출하는 규칙과 거의 동일합니다. 블락 포트가 아닌 지정 포트를 먼저 선출하는 이유는 루트 포트와 지정 포트가 아닌 포트가 블락 포트로 지정되기 때문입니다.

1. 가장 작은 경로값을 가지는 포트
2. 스위치의 브리지 ID가 가장 낮은 포트
3. 스위치의 포트 ID가 가장 낮은 포트 우선 순위(포트 ID : 포트 번호)

하지만 이런 규칙들은 포트 선출 과정을 이해하기 어렵게 만들뿐이기 때문에 제가 위에서 언급했던 규칙 한 가지를 활용하여 포트 선출과정을 보도록 하겠습니다.

하나의 세그먼트에는 반드시 하나의 지정 포트가 있어야 한다.  

세그먼트 하나에는 지정 포트가 하나씩 반드시 있어야 한다는 암묵적인(?) 규칙이 있습니다. 스위치가 실제 포트 선출에 있어 사용하는 규칙이라기보다 포트를 지정하는 과정에 나타나는 특징이죠. 스패닝 트리 프로토콜 동작과정을 이해하는데 이게 좀 더 나은 것 같아 먼저 적용해보겠습니다. 아래 루트 포트가 존재하는 세그먼트에 빈 자리가 남아 있는 곳은 모두 지정 포트로 채웠습니다. 하나의 세그먼트에는 하나의 지정 포트가 반드시 존재해야 하기 때문이죠. 

<Designated Port 결정>

이제 포트가 지정되지 않은, 마지막으로 남은 세그먼트를 살펴보도록 하겠습니다.

Alternated Port 선출

블락 포트는 루트 포트도, 지정 포트도 아닌 포트로 데이터 통신을 하지 않는 포트입니다. 그러나 BPDU는 수신하지요. 블락 포트가 BPDU를 제외한 모든 트래픽을 송수신하지 않음으로써 루프가 도는 것을 방지합니다. 아래 그림에서 남은 하나의 세그먼트에서 블락 포트를 지정해야 합니다. 

<마지막 세그먼트에서의 포트 결정(붉은색 표시)>

지정 포트 선출과정에서 하나의 세그먼트에는 반드시 하나의 지정 포트가 있어야 한다고 말씀드렸습니다. 그렇다는건 위 세그먼트에서 두 포트 중 하나는 지정 포트가 되어야하고 남은 하나의 포트가 블락 포트가 되어야 함을 의미하죠. 바로 여기서 지정 포트 선출을 위해 지정 포트 선출 기준이 사용됩니다.

1. 가장 작은 경로값을 가지는 포트
2. 스위치의 브리지 ID가 가장 낮은 포트
3. 스위치의 포트 ID가 가장 낮은 포트 우선 순위(포트 ID : 포트 번호)

위의 그림에서는 1번으로 인해 좌측 포트(Path Cost :19) 경로값이 19이므로 지정 포트가 되겠군요. 반면 브리지 ID가 8192인 스위치의 포트는 총 경로값이 119(100 + 19)입니다. 그럼 다음과 같이 포트가 지정되겠죠.

<Alternated Port 결정>

최종적으로 브리지 ID가 8192인 스위치의 포트가 블락 포트로 지정되었습니다. 블락 포트로는 BPDU만을 수신할 뿐 데이터가 송신/수신될 수 없습니다. ARP와 같이 목적지가 'ff:ff:ff:ff:ff:ff"으로 이루어진 이더넷 프레임은 이 포트에서 막히게 되겠죠. 즉 루프가 돌지 않는 것입니다. 여기서 스위치를 아무데나 더 붙여도 위의 규칙을 지킨다면 각 포트는 알맞는 역할을 갖게 됩니다. 

여기까지가 스패닝 트리 프로토콜의 동작과정입니다. 다음 문서에서는 각 포트의 상태 변화에 따른 포트의 역할 변화를 살펴보겠습니다. 감사합니다.

반응형

댓글