vnet 프로젝트: intro

태그:

왜 이런 쓸데없는 것을 시작하였나?

2020년이 시작되었을 때 올해는 몇 가지 이런 것들은 꼭 해보자고 마음을 먹었던 일이 생각난다. 그 중의 하나가 ‘네트워크 레이어에서 동작하는 프로토콜 중 하나를 구현해보자’ 였던 것 같다. 엄청 소소해보이지만 이런 목표를 세운 이유 중 하나는 스스로 네트워크에 대한 기본 지식이 너무 빈약하다고 생각했기 때문이다.

전공 수업을 들으며 네트워크에 대한 지식을 어느 정도 쌓긴했지만 그것은 내 머리속엔 아직 단편적인 지식들의 나열일뿐 그 사실들이 어떻게 유기적으로 이어져서 동작하는지에 대한 감이 없었다. 웹 브라우저에서 주소창에 구글 주소를 입력했을 때 구글 홈페이지가 내 브라우저에 뜨는 과정을 설명하라면 얼마나 잘 설명할 수 있을지 솔직히 별로 자신이 없다.

또한 내가 이런 지식이 부족하다고 느꼈던 것은 이전에 하이퍼렛져를 클라우드 환경에 배포할 때 였는데 클라우드 환경에서 서비스를 배포해야할 일이 있을 때, 단지 어플리케이션을 해당 환경에 배포하는 것 말고도 네트워크 측면으로 보안을 위해 할 수 있는 여러 설정들이 있다. 여러 개의 서브넷을 만들고 어떤 클러스터는 외부에서 접근할 수 없는 서브넷에 두기도 하는 등 다양한 전략을 사용할 수가 있다. 그런데 이런 다양한 전략들을 이해하기위해서는 네트워크에 대한 기본 지식이 필요하다고 생각했다.

내가 잘 모르는 부분에 대해서 검색을 해보고 필요한 정보를 찾고 거기에서 또 모르는 것이 있으면 하나씩 탐색해보고 DFS 방식을 통해서 이해도를 높일 수도 있을 것 같다. 그런데 이제 여기서 나의 욕심과 상상력이 덧붙는다. 기왕하는 것 책이나 블로그, 위키 등 여러 소스를 보면서 내가 직접 모델링해볼 수 있지 않을까? 그리고 만약 네트워크 레이어들을 직접 모델링해서 하나의 인터넷을 구축할 수 있다면? 패킷의 흐름을 투명하게 볼 수 있는, 디버깅하고 모니터링할 수 있는 인터넷이 되는 것이다. 또한 여기에 여러 조미료를 첨가해볼 수도 있을 것 같다.

조미료라는 여러가지를 함의할 수 있다. 조미료 중 대표적인 한 가지는 특정한 사용자들끼리 자신들만의 프로토콜을 통해서 네트워킹을하는 것을 상상하였는데. 그냥 떠오르는 예시로, 자신이 보유하고 있는 비트코인 양에 따라서 사용자의 패킷 전송 우선순위를 높여주는 프로토콜을 만드는 등 다양한 도메인을 이용하여 프로토콜을 만들고 그것을 구축한 네트워크에 배포하여 사용할 수 있게 된다.

그래서 이 프로젝트의 목표가 무엇인가?

일단 위에서 말했듯이 일차적인 목표는 잘 동작하는 네트워크 레이어를 모델링한 후 CLI나 SDK를 통해서 사용자들이 이 네트워크에 참여할 수 있게 하는 것이다. vnet에 참여한 사용자 각각은 모두 물리적인 워크스테이션이 되는 것이다. 자신이 물리적인 노드가 되어 다른 곳에 위치한 호스트와 통신한다.

vnet의 뜻은 무엇인가?

virtual internet이란 뜻으로 지었다. ULN(UseLess Network)같은 것도 생각했다. 더 좋은 이름이 떠오르면 얼마든지 바꿔볼 생각이다.

현재 vnet은 어느 정도 수준에 있는가?

vnet은 OSI 모형에서 말하는 physical layer를 제외한 부분을 모두 만들어본다. 물론 link layer에서도 CSMA/CD와 같은 물리적인 요소에 의해 결정되는 것들도 제외한다. 각 호스트가 패킷을 보내면 전기적 신호로 변환되어 케이블을 타고 다른 호스트에 전달되는데 이런 패킷 전달 부분은 UDP로 추상화하고 만들고있다.

현재 link layer쪽을 공부하면서 모델링을 하고 있고 network layer도 필요한 최소한을 만들어서 link layer와 붙여 놓은 상태이다. 최근에는 RFC826을 읽고 ARP 프로토콜을 만들어서 정말 간단한 시나리오에 대해서 테스트하였다. 아직 갈길이 멀다는 것을 느꼈다.

Github