브라우저가 HTTP Request Message를 만들고 나면 이것을 OS에 의뢰하여 엑세스 대상이 있는 웹 서버에 송신한다.
(브라우저는 URL을 해독하거나 HTTP 메시지를 만들지만,
메시지를 네트워크에 송출하는 기능은 없다.
실제 네트워크에 송출하는 역할은 OS가 한다.)
그런데 OS에 송신을 의뢰할 때는 도메인명이 아니라 IP주소로 웹 서버를 지정해야 한다. 그러므로 브라우저는 HTTP 메시지를 만든 후에 도메인명을 IP주소로 바꿔야 한다.
웹사이트에 접속 할 때 우리는 외우기 어려운 IP 주소 대신 도메인 이름을 사용한다.
그러므로 도메인명을 입력했을 때 해당 도메인을 실제 네트워크상에서 사용하는 IP 주소로 바꾸고 해당 IP 주소로 접속하는 과정이 필요하다.
이러한 과정을 수행하는 전체 시스템을 DNS(Domain Name System)
라고 한다.
ex. oing.com -> 216.3.128.12
DNS 서버에 조회한다는 말은 DNS 서버에 조회 요청 메시지를 보내고, 응답 메시지를 받는다는 뜻이다.
이는 DNS 서버에 대해 클라이언트로 동작한다고 말할 수 있다.
이렇게 DNS의 클라이언트에 해당하는 것을 DNS 리졸버, 줄여서 리졸버
라고 부른다.
그리고 DNS의 원리를 이용해 IP주소를 조사하는 것을 네임 리졸루션
이라고 한다. 이 리졸루션을 실행하는 것이 리졸버이다.
Socket 라이브러리
란 OS에 포함되어 있는 네트워크의 기능을 애플리케이션에서 호출하기 위해 모아둔 네트워크용 표준 라이브러리이다.
리졸버는 Socket 라이브러리의 기능중 하나이다.
Socket 라이브러리에 있는 프로그램은 애플리케이션에서 간단히 호출하여 사용할 수 있다.
실제 브라우저 등의 애플리케이션 프로그램을 만들 때 리졸버의 프로그램명(ex. getHostByName)과 웹 서버의 이름(ex. www.oing.com.kr)을 쓰기만 하면 리졸버를 호출할 수 있다.
// 예시일 뿐!!!
void 프로그램명 (매개변수...) {
String host = getHostByName("www.oing.com.kr");
}
이런식으로 리졸버를 호출하면 리졸버가 DNS 서버에 조회 메시지를 보내고, DNS 서버로부터 IP주소가 담긴 응답 메시지를 받아온다.
브라우저는 이 IP주소와 미리 만들어둔 Http Request Message를 OS에 건네서 송신을 의뢰하면 끝이다!
이 때 애플리케이션에서 호출된 리졸버가 어떤식으로 작동하는지 간단히 살펴보자.
프로토콜 스택
을 호출하여 DNS 서버에 메시지 송신참고) DNS 서버에 메시지를 송신할 때에도 역시 DNS 서버의 IP주소가 필요하다. 다만 DNS 서버의 IP주소는 TCP/IP 설정 항목의 하나로 컴퓨터에 미리 설정되어 있으므로 신경 쓸 필요 없다.
지금까지 애플리케이션(브라우저) - 리졸버 - DNS 서버 사이의 작동을 알아봤다.
이제부터 DNS 서버의 동작에 대해 알아보자!
DNS 서버의 기본 동작은 클라이언트에서 조회 메시지를 받고, 조회에 내용에 응답하는 메시지를 반송하는 것이다.
클라이언트가 보내는 조회 메시지에는 다음 3가지 정보가 포함되어 있다.
DNS 서버에는 이 3가지 정보에 대응하여 클라이언트에 응답할 항목이 등록되어 있다.
예를 들어 www.oing.co.kr 서버의 IP 주소를 조사할 때 클라이언트는 다음 세가지 정보를 포함한 조회 메시지를 DNS 서버에 보낸다
앞의 예시는 조회 메시지를 받은 DNS 서버에 해당 IP주소가 등록되어 있는 경우를 가정한 설명이다. 하지만 인터넷에는 막대한 수의 서버가 있으므로 이것들을 전부 하나의 DNS 서버에 등록하는 것은 불가능하다.
그러므로 결국 정보를 분산시켜서 다수의 DNS 서버에 등록해두고, 다수의 DNS 서버가 연대하여 어디에 정보가 등록되어 있는지 찾아내는 구조로 설계되게 되었다.
위 그림처럼 맨위의 DNS 서버로부터 시작해 밑으로 하나씩 타고 내려가는 구조로 정보를 탐색한다.
생각해보면 우리가 지금까지 접했던 도메인명은 이런식으로 .
으로 이루어져있었다.
바로 이 .
이 도메인간의 계층을 구분한다.
오른쪽에 위치한 것이 상위의 계층을 나타낸다.
그러므로 위의 예시에서는 com이라는 도메인 아래에 example이 있고, 그 아래에 blog라는 도메인이 있다고 볼 수 있다.
서브도메인은 인터넷 도메인의 하위 부분을 나타낸다. 일반적인 도메인은 "example.com"과 같은 형식으로 구성되어 있으며, 여기서 "com"은 최상위 도메인(Top-Level Domain, TLD)이고 "example"은 도메인 이름이다.
서브도메인은 이러한 기본 도메인 아래에 생성되며, 서브도메인 이름은 기본 도메인 이름 앞에 추가적인 접두어로 구성된다.
예를 들어, "subdomain.example.com"과 같이 서브도메인은 "subdomain"이라는 접두어를 가지고 기본 도메인 "example.com" 아래에 생성된다.
서브도메인은 기본 도메인과는 별개의 웹 사이트, 블로그, 또는 서비스를 호스팅하기 위해 사용될 수 있다. 예를 들어, "blog.example.com"이라는 서브도메인은 기본 도메인 "example.com"과는 다른 웹 블로그를 호스팅하기 위해 사용될 수 있다.
인터넷에는 DNS 서버가 수만 대나 있으므로 닥치는 대로 뒤지면서 찾을 수는 없다.
그래서 위와 같이 계층을 타고 조회하도록 설계했다.
예를들어, blog.oing.com
이라는 도메인의 ip를 찾기 위해서는
(root) -> com -> oing.com -> blog.oing.com 이런식으로 상위 도메인부터 차근차근 찾게된다.
이를 위해서는 blog.oing.com이라는 도메인을 담당하는 dns 서버를 oing.com 담당 dns에 등록하고, oing.com 담당 dns 서버를 com을 담당하는 dns 서버에 등록해야한다!
또한 root 도메인의 dns 서버를 인터넷에 존재하는 모든 dns 서버에 등록해야 한다.
이를 통해 어떤 dns 서버도 root 도메인 dns 서버에 엑세스할 수 있게 된다.
그 결과, 클라이언트에서 어딘가의 dns 서버에 엑세스하면 root 도메인을 경유하여 도메인의 계층 아래로 타고타고 찾아가서 최종적으로 원하는 dns 서버에 도착할 수 있다.
이 글은 성공과 실패를 결정하는 1%의 네트워크를 읽고 정리한 글입니다.