개발자로서 네트워크의 구조나 동작 원리를 이해하는 것은 필수적인 기본 역량 중 하나일 것이다. 이런 이유로 나도 네트워크의 복잡한 구조를 파악하기 위해 상당한 노력을 기울여왔다. 네트워크 관련 서적이나 강의를 틈나는 대로 읽고 유튜브 강의도 종종 보면서 네트워크의 계층이나 프로토콜에 대한 지식을 쌓았고, 최근에 홈 서버를 구축하면서 배운 내용을 연계해서 이해보려고도 노력했다.
그럼에도 책이나 강의에서 다루는 네트워크 관련 내용은 상당히 이론적이로 추상화된 지식을 다루는데 집중하고 있기 때문에, 실제 네트워크가 물리적으로 어떻게 구성이 되어있는지, 어떤 장비가 어떻게 사용 되는지에 대해서는 구체적으로 알기 어렵다. 이런 지식은 일반적으로 네트워크 인프라 엔지니어의 담당 영역이라서 개발자의 입장에서는 자세히 알 필요는 없다고 생각이 들기도 한다.
하지만 현대 네트워크에서는 가상 네트워크가 물리적인 인프라 만큼이나 중요한 지위를 차지하고 있고, 이런 가상화된 네트워크는 실제 물리 디바이스를 본떠 설계되기도 하기 때문에, 물리 장비에 대한 기본적인 이해가 가상 네트워크 환경에 친숙해지기 위해 필요하다는 생각이 들었다.
1. 기본 개념 정리
1) LAN (Local Area Network) 과 WAN (Wide Area Network)
LAN 은 로컬 네트워크, 즉 집이나 회사 내부에서 구축된 소규모 네트워크를 말한다. 라고 보통 이야기 되는데, 사실 이건 다소 모호한 개념이고, 썩 학술적인 개념으로 들리지 않는다. 내 생각에 LAN 은 두가지 관점에서 생각해 볼 수 있다.
- 공인 IP 가 아니라 사설 IP 대역을 공유하는 네트워크
- 같은 대역으로 묶여서 라우터(L3) 를 거치지 않고 L2 레이어로 통신할 수 있는 네트워크
만약에 집에서 라우터를 통해 나가야 하는 외부의 인터넷 세상은 상기 두가지 기준에서 LAN 이 아닌 WAN 으로 구분될 것이다. 그런데 시점을 바꿔보면 데이터 센터에서는 공인 IP 또한 특정 대역을 공유하여 라우팅 없이 통신하고, 이건 LAN 의 동작방식과 유사한데 이건 LAN 인가 WAN 인가...? 이건 뭐 우리집에서 보면 여전히 WAN 일 것이고 내부에서 보면 LAN 일 것이므로 어쩔 수 없이 상대성이 생길 수 밖에 없는 것 같다.
2) 이더넷 (Ethernet)
이더넷은 앞서 설명한 LAN 에서 패킷을 주고받는 표준화된 프로토콜이다. L2 레이어(데이터 링크 계층) 에서 동작하며 MAC Address 를 사용하여 장치 간 통신을 수행한다. LAN 카드(NIC, Network Interface Card) 나 허브, 스위치, 브리지가 이러한 레이어에서 사용되는 장비이다. 원래 이더넷은 CSMA/CD 라는 소통 방식을 사용하였는데, 이젠 허브가 다 스위치로 대체 되었기 때문에 각각의 장치가 독립적으로 연결되어 충돌이 일어나지 않고, 더이상 사용되지 않는 것으로 알고 있다. 하지만 무선 네트워크 (Wifi) 환경에서는 포트의 구분이 없고, 동시에 신호가 수신되면 분리할 방법이 없기 때문에 이와 유사한 CSMA/CA 라는 알고리즘으로 충돌을 예방한다고 한다.
3) ARP (Address Resolution Protocol)
L2, L3 레이어에서 동작하는 프로토콜로 IP 를 기반으로 MAC Address 를 알아내기 위해 사용된다. 이러한 프로토콜이 필요한 이유는 L2 레벨에서의 통신의 경우, 목적지의 MAC 주소가 필요하기 때문이다. ARP 는 L2 장비의 브로드캐스트를 통해 연결된 모든 장치에 요청을 보내고, 요청을 받은 장치는 요청의 IP 가 자신의 IP 와 일치하는 경우 MAC 주소를 응답한다. 브로드 캐스트를 사용하므로 당연히 ARP 는 LAN 영역의 모든 장치에 도달하게 된다. (때문에 LAN 의 영역은 ARP 가 도달 가능한 범위라고도 표현할 수 있다.)
매 요청마다 ARP 로 MAC 주소를 가지고 오는 건 비효율적이므로 네트워크 장치는 로컬 캐시에 ARP 결과를 유지한다.
위 사진을 보면 172.30.1.51 에 대한 MAC 주소 정보가 없었다가 ping 을 보낸 후에는 ARP 캐시가 갱신된 것을 볼 수 있다. 이러한 캐시 또한 TTL 이 있기 때문에 일정시간 경과후 삭제된다. 참고로 스위치나 브리지에서는 ARP 를 사용하지 않고 그냥 요청지의 MAC 주소를 읽어서 캐싱해놓는 식으로, 다소 수동적으로 MAC Address 테이블을 유지한다. 근데 생각해보면 당연한게 이런 장비들은 능동적으로 요청을 보내는 주체가 아니기 때문에 뜬금없이 ARP 를 보낼 이유는 없다. 다만 요청의 MAC Address 를 장비가 모르는 경우, 브로드 캐스트를 통해 알아내는 과정을 거친다.
4) 라우팅(Routing)
라우팅이란 거대한 WAN 세상에서 라우터들끼리 자율적으로 라우터 간의 경로를 구성하여, 패킷을 목적지까지 효율적으로 전달해주는 것을 말한다. 라우터들은 효율적인 경로를 자율적으로 구성하기 위하여 통일된 프로토콜에 따라서 서로 소통을 하며, 이러한 프로토콜을 기반으로 최단경로를 찾는 알고리즘을 내부적으로 수행한다.
라우터는 동일한 노드들이 쌓여있는 것이 아니라 계층적인 (hierarchical) 구조를 이루고 있고, 때문에 여러 프로토콜이 정의되는데 크게 IGP, BGP 가 있으며 알고리즘으로는 다익스트라(요청 전달에는 음수를 가지는 간선이 없음), 플로이드 워셜, 경로 벡터 같은 걸 사용한다. 구체적인 프로토콜이나 알고리즘을 다루는 것은 아무래도 개발자가 커버하는 범위는 아닌 거 같아서 스킵. 아무래도 내부에서 스위칭하는 수준의 네트워크 장비만 잘 알면 될 것 같음
2. 네트워크 장비
1) L1 계층 장비 : 허브(Hub), 리피터(Repeater)
별다른 설명이 필요없는 가장 기본적인 L1 계층(물리 계층) 네트워크 장비. 이 장비는 수신한 전기신호를 다른 모든 포트로 그대로 뿌리는 Flooding 를 수행한다. 스위치로 대체되어 요새는 거의 사용되지 않는다. 비슷한 동작원리를 가진 리피터(Repeater) 라는 장비가 있는데 이건 전기신호를 멀리 보내야 할때 중간에 전기신호를 다시 발생해줄 수 있는 리피터를 사용하여, 패킷 손실을 줄이기 위한 목적으로 사용된다.
2) L2 계층 장비 : 브리지(Bridge), 스위치(Switch)
이 장비들은 허브의 Flooding 에서 발생하는 Collision 현상을 방지하여 효율을 향상시키기 위해 등장했다. 브리지와 스위치를 사용하면 장비간의 Collision 도메인이 분리가 되어 자신의 대역을 충돌없이 사용할 수 있게 된다. 이 두 장비는 모두 Mac 주소를 기반으로 수신된 패킷을 적절한 대상으로 스위칭 해주며, 사실상 거의 같은 역할을 수행한다고 볼 수 있다. 차이점이라면 스위칭이 구현된 방식에 있는데, 브리지는 스위칭 작업을 내부 소프트웨어가, 스위치는 전용 하드웨어 칩이 수행하도록 하여 속도에서 많은 차이를 보이게 된다. 그래서 현재 브리지는 사용되지 않고 스위치로 대체되었다. (가상 브리지 제외)
스위치는 L2 계층의 장비로 처음 등장하였지만, 통신 기술이 발전하면서 L3 스위치, L4 스위치와 같이 더 높은 계층의 정보를 이용해 스위칭을 수행할 수 있도록 진화(?) 되었다. 그러나 스위치가 더 높은 계층에서도 스위칭을 한다고 해서 후술할 L3 장비인 라우터와 혼동하지 않아야 한다. 왜냐하면 스위치는 수신된 패킷을 정해진 장비로 스위칭 해준다는 본연의 역할을 할 뿐, 라우팅 프로토콜(OSPF, BGP 등)을 통해 스스로 최적의 경로를 탐색하는 역할을 가지고 있지 않기 때문이다. 이는 즉, WAN 영역에 포함될 수 없으며 결국 내부 장비간의 트래픽 분배에 역할만을 수행한다는 것을 의미한다.
3) L3 계층 장비 : 라우터(Router)
라우터는 상기 설명한 라우팅을 수행하는 WAN 세상에 연결되는 장비이다. 사실 개발자 수준에서 라우터의 라우팅 로직에 대해서 자세히 알 필요는 없는 것 같아서 건너 뛰도록 한다.
뭔가 좀 더 깊이 알고자 정리를 시작했는데 사실 가상 인프라 환경에서 정말로 어떤일이 일어나는지 이해를 하기에는 한참 부족한 것 같다. 특히 Kubernetes 에서 CNI 들이 어떻게 네트워크를 구성하고 구현되는 방식은 정말로 많이 복잡해서... 여튼 나중에 더 보충하도록 한다 ...ㅠㅠ