인터넷을 사용해 외부 사이트에 접속하려면 IP주소를 알아야 한다. 하지만 숫자로 나열되어있는 IP주소를 다 외우고 다니는 사람은 없을 것이다. 오늘날에도 우리는 URL안에 IP주소 대신 서버명을 써서 사이트에 접속한다. 그렇다면 차라리 IP 주소 대신 서버명만을 사용하여 통신하는 것이 더 좋지 않을까.
언뜻 좋은 방법처럼 보이지만 효율을 따져보면 절대 좋은 방법이 될 수 없다.
인터넷의 내부에는 다수의 규칙으로 하여금 IP 주소에 의하여 목적지까지 데이터를 운반하는데 IP 주소 대신 이름을 쓴다면 어떻겠는가?
IP주소는 4바이트에 해당하는 크기를 갖고 있다. 하지만 문자로 이루어진 서버명은 최소 수십 바이트에서 최대 255바이트까지 이루어져 있다. 기술의 발전에 따라 라우터의 성능은 계속해서 향상되고 있지만 그 속도에도 한계가 분명히 있고 한계에 다다르면 그로 인한 수많은 문제들이 발생할 것이다. 따라서 문자열로 이루어진 서버명을 사용하여 통신하는 것은 현명한 방법이 아니다.
이러한 고민들을 해결해 주는 것이 바로 DNS라고 할 수 있다.
DNS를 사용해 IP주소를 알아내는 방법은 생각보다 간단하다. 전화번호부처럼 도메인 명과 IP주소를 저장하고 있는 DNS서버에 물어보는 것이다.
원리는 이렇게 간단하지만 브라우저는 이렇게 간단해보이는 일을 어떻게 처리할까?
먼저 DNS 서버랑 통신하는 것이 우선일 것이다. DNS서버에 조회 메시지를 보내고 응답 메시지를 받는 것이다. 즉 DNS 서버에 대해 클라이언트로 작동한다고 할 수 있다.
이 DNS 클라이언트가 DNS 리졸버이다. DNS 리졸버가 DNS 서버에 조회 메시지를 보내고 응답을 받아오는 시스템이다. 브라우저는 이렇게 해서 알아낸 IP주소를 활용하여 통신을 할 수 있게 된다.
리졸버의 작동방식을 간단히 살펴보자.
먼저 애플리케이션에서 리졸버를 호출하면 DNS 서버에 문의하기 위한 메시지를 생성한다. 메시지의 송신을 담당하는 것은 리졸버 스스로가 아닌 OS이다. OS 내부의 프로토콜 스택을 호출하여 DNS 서버에 조회 메시지를 보내는 것이다.
DNS 서버는 해당 도메인에 등록되어 있는 IP주소를 찾아서 클라이언트에게 응답 메시지를 보낸다. 응답 메시지는 조회 메시지를 보낼 때와 마찬가지로 프로토콜 스택을 경유하여 리졸버에 보내지고 리졸버는 메시지에서 IP주소를 추출해 애플리케이션에 최종적으로 보내준다.(실제로는 특정 메모리 영역에 IP주소가 저장된다.)
애플리케이션은 IP 주소가 필요할 때 메모리 영역에 저장된 IP주소를 추출하게 된다.
이렇게 간단해 보이는 작업도 내부에서는 계층과 역할이 구분되어 철저하게 체계적으로 작동하고 있었다는 사실을 깨달았다.
DNS 리졸버와 DNS 서버에 대한 개념도 더 깊게 들어가면 훨씬 복잡하겠지만 간단하게나마 원리를 알 수 있었다.