[네트워크] 2. 브라우저가 웹 서버의 IP 주소를 DNS 서버로부터 조회한다

오잉·2023년 8월 6일
0

NETWORK

목록 보기
2/2

브라우저가 HTTP Request Message를 만들고 나면 이것을 OS에 의뢰하여 엑세스 대상이 있는 웹 서버에 송신한다.
(브라우저는 URL을 해독하거나 HTTP 메시지를 만들지만,
메시지를 네트워크에 송출하는 기능은 없다.
실제 네트워크에 송출하는 역할은 OS가 한다.)

그런데 OS에 송신을 의뢰할 때는 도메인명이 아니라 IP주소로 웹 서버를 지정해야 한다. 그러므로 브라우저는 HTTP 메시지를 만든 후에 도메인명을 IP주소로 바꿔야 한다.

1. Socket 라이브러리의 리졸버를 통해 DNS서버로부터 IP주소를 조회한다.

DNS

웹사이트에 접속 할 때 우리는 외우기 어려운 IP 주소 대신 도메인 이름을 사용한다.
그러므로 도메인명을 입력했을 때 해당 도메인을 실제 네트워크상에서 사용하는 IP 주소로 바꾸고 해당 IP 주소로 접속하는 과정이 필요하다.
이러한 과정을 수행하는 전체 시스템을 DNS(Domain Name System)라고 한다.
ex. oing.com -> 216.3.128.12

DNS 서버에 IP를 조회한다

DNS 서버에 조회한다는 말은 DNS 서버에 조회 요청 메시지를 보내고, 응답 메시지를 받는다는 뜻이다.
이는 DNS 서버에 대해 클라이언트로 동작한다고 말할 수 있다.
이렇게 DNS의 클라이언트에 해당하는 것을 DNS 리졸버, 줄여서 리졸버라고 부른다.
그리고 DNS의 원리를 이용해 IP주소를 조사하는 것을 네임 리졸루션이라고 한다. 이 리졸루션을 실행하는 것이 리졸버이다.

리졸버는 Socket 라이브러리에 있다

Socket 라이브러리란 OS에 포함되어 있는 네트워크의 기능을 애플리케이션에서 호출하기 위해 모아둔 네트워크용 표준 라이브러리이다.
리졸버는 Socket 라이브러리의 기능중 하나이다.

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

Socket 라이브러리에 있는 프로그램은 애플리케이션에서 간단히 호출하여 사용할 수 있다.
실제 브라우저 등의 애플리케이션 프로그램을 만들 때 리졸버의 프로그램명(ex. getHostByName)과 웹 서버의 이름(ex. www.oing.com.kr)을 쓰기만 하면 리졸버를 호출할 수 있다.

// 예시일 뿐!!!
void 프로그램명 (매개변수...) {
    String host = getHostByName("www.oing.com.kr");
}

이런식으로 리졸버를 호출하면 리졸버가 DNS 서버에 조회 메시지를 보내고, DNS 서버로부터 IP주소가 담긴 응답 메시지를 받아온다.

브라우저는 이 IP주소와 미리 만들어둔 Http Request Message를 OS에 건네서 송신을 의뢰하면 끝이다!

리졸버 내부의 작동과정

이 때 애플리케이션에서 호출된 리졸버가 어떤식으로 작동하는지 간단히 살펴보자.

  1. 애플리케이션에서 리졸버 호출
  2. Socket 라이브러리 안에 있는 리졸버가 작동
  3. DNS 서버에 문의하기 위한 메시지 작성
  4. OS 내부에 포함된 프로토콜 스택을 호출하여 DNS 서버에 메시지 송신
    (리졸버도 브라우저처럼 네트워크에 데이터를 송수신하는 기능은 없다)
  5. 프로토콜 스택이 메시지를 보내는 동작을 실행하여 LAN 어댑터를 통해 DNS 서버에 메시지 송신
  6. DNS 서버는 요청에 따라 찾은 IP주소를 응답 메시지에 써서 반송
  7. 프로토콜 스택을 통해 리졸버에 전달되고, 리졸버가 내용 해독해서 애플리케이션에 IP주소 전달

참고) DNS 서버에 메시지를 송신할 때에도 역시 DNS 서버의 IP주소가 필요하다. 다만 DNS 서버의 IP주소는 TCP/IP 설정 항목의 하나로 컴퓨터에 미리 설정되어 있으므로 신경 쓸 필요 없다.

2. 전 세계의 DNS 서버가 연대한다

지금까지 애플리케이션(브라우저) - 리졸버 - DNS 서버 사이의 작동을 알아봤다.
이제부터 DNS 서버의 동작에 대해 알아보자!

DNS 서버의 기본 동작

DNS 서버의 기본 동작은 클라이언트에서 조회 메시지를 받고, 조회에 내용에 응답하는 메시지를 반송하는 것이다.

클라이언트가 보내는 조회 메시지에는 다음 3가지 정보가 포함되어 있다.

  • 이름 : 도메인명
  • 클래스
    • 처음 DNS 구조 만들었을 때 인터넷 이외의 네트워크에서의 이용까지 고려해서 '클래스'라는 정보를 만들었으나, 지금은 인터넷 이외의 네트워크가 소멸
    • 그러므로 클래스는 항상 인터넷을 나타내는 'IN'이라는 값을 가진다
  • 타입
    • 이름에 어떤 타입의 정보가 지원되는지
    • ex. 타입 A : 이름에 IP 주소 지원
      타입 MX : 이름에 메일 배송 목적지 지원
    • 이 타입에 따라 클라이언트에 응답하는 정보 내용 달라짐

DNS 서버에는 이 3가지 정보에 대응하여 클라이언트에 응답할 항목이 등록되어 있다.

예를 들어 www.oing.co.kr 서버의 IP 주소를 조사할 때 클라이언트는 다음 세가지 정보를 포함한 조회 메시지를 DNS 서버에 보낸다

  • 이름 = www.oing.co.kr
  • 클래스 = IN
  • 타입 = A
    그러면 DNS 서버는 등록된 정보들을 뒤져서 이름, 클래스, 타입 세 가지가 일치하는 것을 찾아 IP주소를 응답한다.

도메인의 계층

앞의 예시는 조회 메시지를 받은 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 서버의 작동 과정

인터넷에는 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%의 네트워크를 읽고 정리한 글입니다.

이미지 출처
DNS
DNS 속 표
DNS 계층

profile
오잉이라네 오잉이라네 오잉이라네 ~

0개의 댓글