우리는 브라우저에서 사이트 이름을 입력하여 접속한다.
이는 해당 사이트의 서버로 요청을 보내 응답을 받은 결과다.
이렇게 서버로 요청하기 위해서는 서버의 주소를 알아야 한다.
서버의 주소는 127.0.0.1과 같이 사람이 이해하기 어려운 숫자로 이루어져 있다.
그러나 우리는 브라우저에서 실제 서버의 주소를 입력하지 않았다.
이는 브라우저가 DNS에 요청하여 사이트 이름에 해당하는 실제 주소를 받아왔기 때문이다.
DNS는 domain name system의 약자로,
컴퓨터의 ip주소와 그에 해당하는 이름을 저장해 놓은 분산된 데이터베이스다.
DNS는 대표적으로 이름을 ip 주소로 변환해 준다.
별명과 이름을 맵핑할 수 있다.
: 컴퓨터 이름에 사람의 이해를 돕기위해 실제 복잡한 이름말고 별명을 부여할 수 있다.
예를 들면 실제 'servereast.backup1.ibm.com'의 컴퓨터에 'www.ibm.com' 별명을 붙일 수 있다.
이 경우 'servereast.backup1.ibm.com'와 같은 실제 이름을 canonical name이라고 한다.
메일 서버를 맵핑 해준다.
도메인 아래에 메일 서버의 이름을 알려준다.
부하 분배
많은 요청을 처리하기 위해 웹 서버를 복제해 놓은 경우 DNS가 요청을 적절히 분배해 준다.
DNS는 아래와 같이 계층적 구조로 이루어져 있다.
처음 DNS요청이 가는 곳이다.
Root DNS는 TLD DNS의 주소를 알고 있다.
'.kr', '.com', '.org'으로 끝나는 모든 도메인의 주소를 알고 있다.
예를 들어 '.com' DNS는 'www.google.com'의 주소를 알고 있다.
'www.google.com' 내부에 속한 호스트들의 주소를 알고 있다.
ip 주소를 받아오는 요청의 흐름을 알아보자.
두 가지 방식의 요청이 있다.
DNS 계층에는 포함되지 않지만,
빠른 응답과 네트워크 부하를 줄이기 위한 DNS 캐시가 존재한다.
이를 Local DNS server라 한다.
먼저 클라이언트(브라우저)가 Local DNS server로 ip 주소를 요청한다.
만약 캐시에 ip 주소가 있으면, 응답해 준다.
없으면 Local DNS server는 root DNS server에 해당 도메인을 처리하는
TLD DNS server의 주소를 받아 온다.
다시 Local DNS server는 TLD DNS server에 해당 도메인을 처리하는
Authoritative server의 주소를 받아 온다.
다시 Local DNS server는 Authoritative server에 요청하여 해당 ip를 받아 온다.
받아온 ip 주소를 클라이언트에게 알려준다.
먼저 클라이언트(브라우저)가 Local DNS server로 ip 주소를 요청한다.
만약 캐시에 ip 주소가 있으면, 응답해 준다.
없으면 Local DNS server는 root DNS server에 ip 주소를 요청한다.
root DNS server는 TLD DNS server에 ip 주소를 요청한다.
TLD DNS server는 Authoritative server에 ip 주소를 요청한다.
Authoritative server는 ip 주소를 리턴한다.
TLD DNS server는 응답받은 ip주소를 리턴한다.
root DNS server는 응답받은 ip 주소를 리턴한다.
Local DNS server는 응답받은 ip 주소를 클라이언트에게 리턴한다.
원칙적으로 Root DNS server로 요청을 보내지만,
Root DNS server에 부하를 줄이기 위해,
대부분 Local DNS server에 TLD server주소가 캐시되어 있다.
DNS는 분산된 데이터베이스다.
따라서 DNS가 가지는 레코드가 존재한다.
이를 RR(resource record)이라고 부른다.
RR은 다음과 같은 구성이다.
name : 요청하는 이름을 나타낸다.
type : 맵핑타입을 나타낸다.
type 'A' : hostname과 ip address 맵핑이다.
type 'CNAME' : alias name -> canonical name 맵핑이다.
type 'NS' : domain name(e.g, google.com) -> authoritative server hostname 맵핑이다.
type 'MS' : name -> mail server name 맵핑이다.
value : 타입에 해당하는 값을 나타낸다.
ttl : 레코드 유효 기간을 나타낸다.
DNS 요청, 응답을 위한 메시지는 다음과 같다.
요청과 응답 모두 같은 형식이다.
identification : 고유 식별자로 어떤 요청에 대한 응답인지 구분하기 위함이다.
flags : 요청인지 응답인지, authoritative 서버로의 응답인지 등을 나타낸다.
questions : query를 위한 name, type을 명시한다. 여러 요청을 할 수 있는 가변 길이다.
요청의 수를 # questions에 표시한다.
answers : 응답받은 RR 들이다. 응답 또한 여러 개일 수 있고, # answers RRs에 표시한다.
authority : authoritative sever가 보내는 응답은 여기에 나타낸다.
이 또한 여러 개일 수 있고, # authority RRs에 나타낸다.
additional info : 추가 정보를 표시한다.
예를 들어 메일 서버의 이름을 요청한 경우 추가로 메일 서버의 ip 주소도 여기에 나타내어 응답한다.
이 또한 여러 개 일 수 있고, # additional RRs에 나타낸다.
참고
컴퓨터 네트워크 - 이화여대 이미정 교수님
Computer Networking: A Top-Down Approach 6th ed. J.F. Kurose and K.W. Ross