스마트폰이나 노트북, 데스크탑부터 페이스북이나 인스타그램의 서버에 이르기까지 인터넷에 연결된 모든 컴퓨터는 숫자를 사용하여 서로르 찾고 통신한다. 이러한 숫자를 흔히 IP 주소라고 부르는데 IP 주소는 192.168.0.1 와 같은 숫자 형태이므로 웹 브라우저를 통해 원하는 웹사이트로 이동하기 위해서는 이 IP 주소를 매번 입력해야 하는 불편함이 있었다. 이러한 불편함을 해소하기 위해 나온것이 google.com과 같은 도메인이다. 그로인해 영어로 된 도메인 이름을 브라우저에 입력하기만 하면 즉시 해당 도메인에 연결된 IP로 접속을 원하는 웹사이트로 이동할 수 있게 되었고 이러한 작업을 수행해주는것이 DNS 프로토콜이다. 이번 글에서는 DNS의 정의와 어떤 기능을 제공하는지에 대해서 써보려고 한다.
서버에는 호스트라는것이 존재하는데 호스트에 대한 하나의 식별자를 호스트 네임이라고 부른다. www.google.com 이나 www.pinterest.com 같은 웹사이트 주소를 호스트 네임이라고 부르며 DNS의 실질적 역할은 사용자가 입력한 호스트 네임을 해당 호스트에 해당하는 IP주소로 변환하는 것이다. 예를 들어 설명하자면 웹 브라우저에 주소 www.youtube.com/video/15 를 입력했을때 DNS 프로토콜은 다음과 같은 순서로 동작된다.
- 브라우저는 사용자가 입력한 주소로부터 호스트 네임(www.youtube.com)을 뽑아내고 이를 DNS 클라이언트 측에 넘긴다
- DNS 클라이언트는 DNS 서버로 호스트 네임을 포함한 요청을 보낸다
- DNS 클라이언트는 DNS 서버로부터 호스트 네임에 대한 IP 주소를 반환받는다
- 브라우저가 DNS 클라이언트로부터 IP 주소를 전달받으면 해당 IP 주소의 80번 포트에 위치하는 HTTP서버로 TCP연결을 실행한다
DNS가 실질적으로 동작한 부분은 2번 -> 3번의 과정이다. 1번의 경우 브라우저에 www.youtube.com 을 입력하면 로컬(브라우저를 사용하기 위해 이용중인 스마트폰이나 컴퓨터등의 장비) DNS 서버가 작동한다. 로컬 DNS 서버는 자주 이용하는 도메인을 캐시에 저장해놓고 있다가 저장중인 도메인으로 요청을 할 경우 DNS 클라이언트에 요청할 필요없이 바로 해당되는 IP 주소로 웹 페이지를 이동시킨다. 만약 캐시에 저장되어있지 않은 도메인일 경우 질의 방법이 두가지로 나누어지는데 크게 반복적 질의와 재귀적 질의로 나눠진다.
반복적 질의는 다음과 같은 순서로 동작된다.
- 브라우저에서 로컬 DNS에 요청 -> 로컬이 DNS가 정보를 가지고 있지 않으면 루트 DNS에 요청
- 루트 DNS는 자기는 모르지만 최상위 DNS는 알고 있을거라고 알려줌 -> 최상위 DNS에 요청
- 최상위 DNS는 자기도 모르지만 책임 DNS는 알고 있을거라고 알려줌 -> 책임 DNS에 요청
- 책임 DNS는 알고있기 때문에 해당 IP 주소를 반환함
- 로컬 DNS는 전달받은 정보를 브라우저에 알려주고 자신의 DNS 레코드에 캐시형태로 해당 정보를 저장함(같은 요청에 대한 신속한 처리를 위함)
재귀적 질의는 다음과 같은 순서로 동작된다.
- 브라우저에서 로컬 DNS에 요청 -> 로컬이 정보를 가지고 있지 않으면 루트 DNS에 알고있냐고 물어봄
- 루트 DNS는 모르기 때문에 최상위 DNS에 물어봄
- 최상위 DNS도 모르게 때문에 책임 DNS에 물어봄
- 책임 DNS는 알고있기 때문에 해당 IP주소를 반환함
- 로컬 DNS는 전달받은 정보를 브라우저에 알려주고 자신의 DNS 레코드에 해당 정보를 저장함
이와같이 반복적 질의는 DNS 서버마다 로컬 DNS가 반복적으로 질문을 하는 방법이고 재귀적 질의는 각각의 DNS 서버가 상위 DNS 서버에 질문을 하는 방법이다. 그림을 보면 알수있다싶이 반복적 질의는 로컬 DNS가 모든 상위 DNS서버에 요청하는것에 반해 재귀적 질의는 요청을 받은 DNS 서버가 직접 다른 DNS 서버에 요청을 한다는 점에서 다르다. 요청의 주체가 다르다고 할 수 있을것이다.
'개발 > 인프라, CS' 카테고리의 다른 글
HTTP Method란? (0) | 2021.03.14 |
---|---|
Linux/Git/Docker 명령어 + Docker Image로 만드는 웹서버 (0) | 2021.01.23 |
HTTPS와 SSL의 작동 구조 (0) | 2020.12.30 |
AWS EC2 웹서버 설치하기 (0) | 2020.02.13 |
우분투 서버 명령어 (0) | 2020.01.18 |