네트워크의 2계층 핵심장비 스위치는 2계층 주소인 MAC 주소를 기반으로 동작한다.
네트워크 중간에서 패킷을 받아, 필요한 곳에만 보내주는 네트워크의 중재자 역할을 한다.
스위치가 없던 오래된 이더넷 네트워크에서는 패킷을 전송할 때 서로 경합해, 그로 인한 네트워크 성능 저하가 컸다.
이런 경쟁을 없애고 패킷을 동시에 여러 장비가 서로 간섭 없이 통신하도록 도와주는 장비가 스위치이다.
스위치를 사용하면 여러 단말이 한꺼번에 통신할 수 있어, 통신하기 위해 기다리거나 충돌 때문에 대기하는 문제가 해결되고 네트워크 전체의 통신 효율이 향상된다.
스위치의 핵심 역할은 누가 어느 위치에 있는지 파악하고, 실제 통신이 시작되면 자신이 알고 있는 위치로 패킷을 정확히 전송하는 것이다.
이런 동작은 MAC 주소와 단말이 위치하는 인터페이스 정보를 매핑하는 MAC 주소 테이블을 갖고 있어서 가능하다.
스위치는 전송하려는 패킷의 헤더 안에 있는 2계층 목적지 주소를 확인하고, MAC 주소 테이블에서 해당 주소가 어느 포트에 있는지 확인해, 해당 패킷을 그 포트로만 전송한다.
만약 테이블에 없는 도착지 주소를 가진 패킷이 스위치로 들어오면 스위치는 전체 포트로 패킷을 전송한다. 패킷의 도착지 주소가 테이블에 있으면, 해당 주소가 매핑된 포트로만 패킷을 전송하고 다른 포트로는 전송하지 않는다.
이러한 동작을 3가지로 정리할 수 있다.
스위치는 부팅하면 네트워크 관련 정보가 아무것도 없다. 처음에는 허브 처럼 동작한다.
(허브는 패킷이 들어온 포트를 제외하고 나머지 포트로 패킷을 전달한다.)
허브와 같이 모든 포트로 패킷을 흘리는 동작 방식을 플러딩이라고 한다.
스위치는 LAN에서 동작하므로 자신이 정보를 갖고 있지 않더라도, 어딘가에 장비가 있을 수 있다고 가정하고 플러딩을 수행하는 것이다.
이런 플러딩 동작은 정상적인 동작이나, 이런 동작이 많아지면 스위치가 제 역할을 못하게 되므로
패킷이 스위치에 들어오면 해당 패킷 정보의 MAC 주소를 보고, 이를 학습해 MAC 주소 테이블을 만든 후 이를 통해 패킷을 전송한다.
비정상적인 플러딩
이더넷-TCP/IP 네트워크에서는 ARP 브로드캐스를 미리 주고받은 후, 데이터가 전달되므로 실제로 데이터를 보내고 받을 때는 스위치가 패킷을 플러딩하지 않는다.
이런 스위치 기능을 무력화해, 주변 통신을 모니터링하는 공격 기법이 사용되어 스위치에게 엉뚱한 MAC 주소를 습득시키거나, MAC 테이블을 꽉 차게 해 스위치의 플러딩 동작을 유도할 수 있다.
패킷의 도착지 MAC 주소를 확인하여 원하는 포트로 포워딩하는 스위치의 동작을 정상적으로 수행하려면 MAC 주소 테이블을 만들고 유지해야 한다.
MAC 주소 테이블을 만들고, 유지하는 과정을 어드레스 러닝이라고 한다.
어드레스 러닝은 패킷의 출발지 MAC 주소 정보를 이용한다. 패킷이 특정 포트에 들어오면, 스위치에는 해당 패킷의 출발지 MAC 주소와 포트 번호를 MAC 주소 테이블에 기록한다.
어드레스 러닝은 출발지의 MAC 주소 정보를 사용하므로, 브로드캐스트나 멀티캐스트에 대한 MAC 주소를 학습할 수 없다. 2가지 모두 목적지 MAC 주소 필드에서만 사용하기 때문이다.
사전 정의된 MAC 주소 테이블
스위치는 MAC 어드레스 러닝 작업 외에도 사전에 미리 정의된 MAC 주소 정보를 가지고 있다.
패킷을 처리하기 위한 정보가 아닌, 대부분 스위치 간 통신을 위해 사용되는 주소이다.
스위치에서는 MAC 주소 테이블을 보기 위해 show mac address-table 명령어를 사용한다.
패킷이 스위치에 들어온 경우, 도착지 MAC 주소를 확인하여 자신이 가진 MAC테이블과 비교해 맞는 정보가 있으면 매치되는 해당 포트로 패킷을 포워딩한다.
이때 다른 포트로는 해당 패킷을 보내지 않으므로 이 동작을 필터링이라고 한다.
스위치는 일반적인 유니캐스트에 대해서만 포워딩과 필터링 작업을 수행한다.
출발지 MAC 주소로 브로드캐스트나 멀티캐스트 모두 출발지가 사용되지 않으므로, 이런 트래픽은 전달이나 필터링 작업을 하지 않고, 모두 플러딩 한다.
이더넷 - TCP/IP 네트워크에서는 스위치가 유니캐스트를 플러딩하는 경우는 거의 없다.
패킷을 만들기 전에 통신해야 하는 단말의 MAC 주소를 알아내기 위해 ARP 브로드캐스트가 먼저 수행되어야 하므로, 유니캐스트보다 ARP 브로드캐스트가 먼저 네트워크에 전달된다.
이 ARP를 이용한 MAC 주소 습득 과정에서 이미 스위치는 통신하는 출발지와 목적지의 MAC 주소를 습득할 수 있고, 실제 유니캐스트 통신이 시작되면 이미 만들어진 MAC 주소 테이블로 패킷을 포워딩, 필터링 한다.
ARP와 MAC 테이블은 일정 시간 동안 지워지지 않는데, 이 시간을 에이징 타임이라고 하면 일반적으로 MAC 테이블의 에이징 타임이 단말의 ARP 에이징 타임보다 더 길어, 이더넷 네트워크를 플러딩 없이 효율적으로 운영할 수 있다.
네트워크에서도 다양한 가상화 기술이 쓰이고 있는데, 스위치에서는 VLAN(Virtual Local Arena Network) 이라는 가상화 기술을 사용해왔다.
물리적 배치와 상관없이 LAN을 논리적으로 분할, 구성하는 기술로 하나의 장비를 서로 다른 네트워크를 갖도록 논리적으로 분할한 것이므로 유니캐스트 뿐만 아니라 브로드캐스트도 VLAN 간에 통신할 수 없다.
VLAN 간의 통신이 필요하다면, 서로 다른 네트워크의 통신이므로 3계층 장비가 필요하다.
VLAN을 사용하면 물리적 구성과 상관없이 네트워크를 분리할 수 있고, 물리적으로 다른 층에 있는 단말이 하나의 VLAN을 사용해 동일한 네트워크로 묶을 수 있다.
이러한 VLAN의 할당 방식에는 포트 기반 VLAN과 MAC 주소 기반 VLAN이 있다.
하나의 시스템이나 구성 요소에서 고장이 발생했을 때, 전체 시스템의 작동이 멈추는 요소를
SPoF(Single Point of Failure) 라고 말한다.
네트워크에서도 하나의 장비 고장으로 전체 네트워크가 마비되는 것을 막기 위해, 이중화, 다중화된 네트워크를 디자인하고 구성한다.
네트워크를 스위치 하나로 구성했다면, 역시 그 스위치에 장애가 발생하는 경우에는 네트워크에 장애가 발생한다.
SPoF 를 피하기 위해, 스위치 2대 이상으로 네트워크를 디자인 해야할 것이다. 그러면 모든 문제가 해결될까?
2대 이상의 스위치로 디자인하면 네트워크를 따라 계속 전송되므로 네트워크를 마비시킬 수 있다.
이런 상황을 네트워크 루프(Loop) 라고 한다.
이러한 상황은 대부분 브로드캐스트 스톰(Strom) 이라 불리는 문제로 발생하는데
루프 구조로 네트워크가 연결된 상태에서 단말에서 브로드캐스트를 발생시키면, 스위치는 이 패킷을 패킷이 유입된 포트를 제외한 모든 포트로 플러딩한다.
플러딩된 패킷 -> 다른 스위치로 -> 또 플러딩 -> 다른 스위치로 ...
스위치가 확인하는 2계층 헤더에는 3계층의 TTL과 같은 라이프타임 메커니즘이 없어, 루프가 발생하면 패킷이 죽지 않고 계속 살아남아 패킷 하나가 전체 네트워크 대역폭을 차지할 수 있다. 이는 스위치와 네트워크에 연결된 단말 간 통신이 거의 불가능한 상태가 된다.
브로드캐스트 뿐만 아니라 유니캐스트도 문제를 일으키는데 같은 패킷이 루프를 돌아 도착지 쪽에서 중복 수신되는 혼란을 일으키기도 하지만 중간에 있는 스위치에서도 MAC 러닝 문제가 발생한다.
스위치는 MAC 주소 테이블에서는 하나의 MAC 주소에 대해 하나의 포트만 학습이 가능한데, 동일한 MAC 주소로 여러 포트에서 학습되면 MAC 테이블이 반복 갱신되어 정상적으로 동작하지 않는다. 이를 MAC 어드레스 플래핑(MAC Address Flappings) 이라고 부른다.
그럼 위와 같은 현상들을 방지하기 위해 다시 한대로 되돌아가야 할까? SPoF가 다시 발생한다.
이런 이유로 루프를 자동 감지해 포트를 차단하고, 장애 때문에 우회로가 없을 때 차단된 포트를 스위치 스스로 다시 풀어주는 STP, 스패닝 트리 프로토콜이 개발되었다.
스패닝 트리 프로토콜(Spanning Tree Protocol) 은 루프를 확인하고 적절히 포트를 사용하지 못하게 만들어, 루프를 예방하는 메커니즘이다.
루프를 예방하려면, 전체 스위치가 어떻게 연결되어 있는지 알아야 하는데 그러면 스위치 간에 정보를 전달하는 방법이 필요하다.
이를 위해 스위치는 BPDU(Bridge Protocol Data Unit) 이라는 프로토콜을 통해, 스위치 간에정보를 전달하고 이렇게 수집된 정보를 이용해, 전체 네트워크를 트리로 만들어 루프 구간을 확인한다.
이렇게 확인된 루프 지점을 데이터 트래픽이 통과하지 못하도록 차단해 루프를 예방 하는 것이다.
참조한 책 및 사이트
IT 엔지니어를 위한 네트워크 입문
https://catsbi.oopy.io/315731e3-1730-4690-ad8f-663e0af7621b
https://velog.io/@indongcha/IT-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9E%85%EB%AC%B8-4%EC%9E%A5-%EC%8A%A4%EC%9C%84%EC%B9%98-2%EA%B3%84%EC%B8%B5-%EC%9E%A5%EB%B9%84
https://linkhub.tistory.com/114