사용자는 접속하려는 서버의 모든 IP 주소를 외우고 있지 않다. 여러 개의 숫자로 나열되어 있는 IP 주소는 접근성이 떨어져 쉽게 기억할 수 있도록 도메인 주소를 사용한다. HTTP 메시지로 만든 이후 사용자가 작성한 도메인 주소에 매칭되는 IP 주소를 찾아야 한다.

1. IP 주소의 기본

HTTP 의 메시지를 만들면 HTTP 메시지를 OS 에 의뢰하여 액세스 대상의 웹 서버에게 송신한다. 브라우저는 URL 을 해독하거나 HTTP 메시지를 만들지만, 메시지를 네트워크에 송출하는 기능은 없으므로 OS 에 의뢰하여 송신한다. 이때 URL 안에 쓰여있는 서버의 도메인명에서 IP 주소를 조사해야 한다. OS 에 송신을 의뢰할 때는 도메인명이 아니라 IP 주소 로 메시지를 받을 상대를 지정해야 하기 때문이다. 그러므로 HTTP 메시지를 만드는 동작의 다음은 도메인명에서 IP 주소를 조사하는 동작이 된다.

2. 도메인명과 IP 주소를 구분하여 사용하는 이유

TCP/IP 의 네트워크는 이 IP 주소로 통신 상대를 지정하므로 IP 주소를 모르면 상대에게 메시지를 전달할 수 없다. 그러므로 OS 에 메시지 송신을 의뢰할 때는 IP 주소를 조사해야 한다.

그렇다면 URL 안에는 서버명이 아니라 IP 주소를 쓰면 좋을 것이라고 생각할 수도 있다. 실제 서버명 대신에 IP 주소를 써도 올바르게 작동한다. 하지만 숫자로 나열한 IP 주소는 기억하기 어렵다. 그러므로 URL 안에는 IP 주소가 아니라 서버의 이름을 쓸 수 있도록 하는 쪽이 좋다.

그렇다면 차라리 IP 주소 같은 것은 그만두고 이름으로 상대를 지정하여 통신하는 것이 좋을 것이라는 의견도 있을 수 있다. 하지만 IP 주소는 32비트, 즉 4바이트에 해당하는 개수밖에 없지만, 도메인명은 적어도 수십 바이트부터 최대 255바이트나 있다. IP 주소라면 4바이트분의 수치만 취급하면 되지만, 도메인명이라면 수십 바이트에서 255바이트까지의 문자를 취급해야 한다. 그러면 그만큼 라우터가 부하되어 데이터를 운반하는 동작에 더 많은 시간이 걸리면서 네트워크의 속도가 느려진다.

사람은 이름을 사용하고, 라우터는 IP 주소를 사용한다는 방법이 고안되었고, 현재 이 방법이 정착되어 있다. 이름을 알면 IP 주소를 알 수 있다거나 IP 주소를 알면 이름을 알 수 있다는 원리를 사용하여 양쪽의 차이를 해소하는 것이 DNS 이다.

3. Socket 라이브러리가 IP 주소를 찾는 기능을 제공한다

IP 주소를 조사하는 방법은 간단하다. 즉 가장 가까운 DNS 서버에 ‘www.lab.cyber.co.kr 이라는 서버의 IP 주소를 가르쳐 주세요.’ 라고 질문한다. 그러면 DNS 서버가 ‘그 서버의 IP 주소는 xxx.xxx.xxx.xxx 입니다' 라는 식으로 응답한다.

DNS 서버에 조회한다는 것은 DNS 서버에 조회 메시지를 보내고, 거기에서 반송되는 응답 메시지를 받는 것이다. 이것은 DNS 서버에 대해 클라이언트로 동작한다고도 말할 수 있다. 이 DNS 클라이언트에 해당하는 것을 DNS 리졸버 또는 단순히 리졸버 라고 부른다. 그리고 DNS 의 원리를 사용하여 IP 주소를 조사하는 것을 네임 리졸루션(name resolution, 이름 확인) 이라고 하는데, 이 리졸루션을 실행하는 것이 리졸버(resolver) 이다.

Socket 라이브러리OS 에 포함되어 있는 네트워크의 기능을 애플리케이션에서 호출하기 위한 부품을 모아놓은 것이다. 리졸버는 그 속에 들어있는 프로그램 부품의 하나이다. Socket 라이브러리 속에는 데이터 송수신할 때 사용하는 부품을 비롯하여 다수의 프로그램 부품이 들어있다.

4. 리졸버를 이용하여 DNS 서버를 조회한다

Socket 라이브러리에 들어있는 프로그램은 부품화되어 있고 애플리케이션에서 간단히 호출하여 이용할 수 있다. 구체적으로, 브라우저 등의 애플리케이션 프로그램을 만들 때 다음과 같이 리졸버의 프로그램명(gethostbyname) 과 웹 서버의 이름(www.lab.cyber.co.kr) 을 쓰기만 하면 리졸버를 호출할 수 있다.

35DBBEA6-303C-4B60-863F-49F8047B9E4A.jpeg

이렇게 해서 리졸버를 호출하면 리졸버가 DNS 서버에 조회 메시지를 보내고, DNS 서버에서 응답 메시지가 돌아온다. 이 응답 메시지 속에 IP 주소가 포함되어 있으므로 리졸버는 이것을 추출하여 브라우저에서 지정한 메모리 영역에 써넣는다. 이렇게 IP 주소를 조회하는 동작이 끝난다. 브라우저가 웹 서버에 메시지를 보낼 때는 이 메모리 영역에서 IP 주소를 추출하여 HTTP 의 리퀘스트 메시지와 함께 OS 에 건네주어 송신을 의뢰한다.

5. 리졸버 내부의 작동

EEC80408-3C44-4112-BCCE-A65E6F8EF00C.jpeg

네트워크 애플리케이션(브라우저)이 리졸버를 호출하면 제어가 리졸버의 내부로 넘어간다.(2)

Socket 라이브러리의 내용에 있는 리졸버가 움직이기 시작하여 애플리케이션에서 의뢰받은 작업을 실행한다. 리졸버에 제어가 넘어가면 여기에서 DNS 서버에 문의하기 위한 메시지를 만든다. 이것은 브라우저가 웹 서버에 보내는 HTTP 의 리퀘스트 메시지를 만드는 것과 유사하다. 만든 메시지를 DNS 서버에 보낸다.(3) 메시지 송신 동작은 리졸버가 스스로 실행하는 것이 아니라 OS 내부에 포함된 프로토콜 스택을 호출하여 실행을 의뢰한다. 리졸버도 브라우저와 같이 네트워크에 대해 데이터를 송수신하는 기능이 없기 때문이다.