DNS 해결사 함수

Download Report

Transcript DNS 해결사 함수

정보통신대학 컴퓨터 학과
2005220020
도희성
Chap. 11
이름과 주소 변환
•
DNS
•
해결사 함수
개요

숫자로 표시 된 주소
호스트 주소 (eg. 206.6.226.33)
 서버 포트 (eg. 메아리서버 포트 9877, 표준시각 포트 13)


이름으로 주소를 표시하자
이름이 기억하기 더 쉬움
 숫자 주소는 변할 수 있음(이름은 그렇지 않다)
 IPv6에서 숫자 주소가 매우 길어진다.


이름과 숫자를 변환하는 함수
gethostbyname, gethostbyport - 호스트/IPv4 주소 間
 getservbyname, getservbyport – 서비스/port번호 間

1
영역 이름 시스템(DNS)

호스트 이름과 IP주소와의 대응 관계 찾기 위해 사용

호스트 이름의 종류

단순 형


Solaris, freebsd
한정 형(FQDN)
Unpbook.com
 기술적으로 절대 이름이라고 하며 반드시 마침표로 끝남.
 마지막 마침표는 생략 가능(흔히 생략 : naver.com. )
 끝의 마침표는 해결사에게 한정적임. 즉 가능한 영역 목록을 찾
을 필요가 없음을 알려 준다.

2
자원 기록


DNS의 항목을 자원 기록( RR)이라고 함.
A


AAAA



MX


Quad A – 32bit의 4배라서
128 bit IPv6 주소로 변환
PTR



호스트 이름을 32bit IPv4주소로 변환
지시자 기록
IP주소를 호스트 이름으로 변환
특정한 호스트에 대해 mail 교환기로 동작하도록 명시
CNAME



정규 이름
ftp, www 같은 일반적인 서비스에 할당.
실제 호스트이름 대신에 이 서비스 이름을 사용하면 서비스가 다른
호스트로 이동하더라도 상관하지 않음
3
자원기록(CONT.)
Free bsd
IN
IN
IN
IN
A
AAAA
MX
MX
12.106.32.254
3ffe:b80:1f8d.1.a00:20ff:fea7:686b
5
freebsd.unpbook.com.
10
mailhost.unpbook.com.
ftp
www
IN
IN
CNAME
CNAME
linux.unpbook.com.
linux.unpbook.com.
4
해결사와 이름 서버

해결사 함수

Application이 호스트 이름을 ip주소로 바꾸거나 ip주소를
호스트 이름으로 변환하기 위해 호출하는 함수 집합

종종 BIND라는 프로그램으로 이름 서버 가동

Application들은 해결사 함수를 호출함으로써 DNS서
버와 접촉

흔한 해결사 함수
gethostbyname
 gethostbyaddr

5
DNS서버의 작동 순서

Domain name의 구성
Root domain – ‘.’ 으로 표시 (이 서버는 전세계에 13개)
 Top Level Domain

Country Code Based TLD (국가 기반)
 ‘.kr’, ‘.jp’ 등
 Global TLD (국가 초월)
 ‘.com’, ‘.net’



이 아래에 하위 도메인이 앞에 붙어 나간다.
이런 각 Domain들에게 각 Domain에 관한 이름 정보
를 보관하고 실시간 질의에 응답하는 서버를 DNS서
버라고 부른다.
6
DNS서버의 작동 순서(CONT.)
1.
사용자가 웹에서 URL 입력(eg. www.korea.ac.kr)
2.
자신의 DNS 서버에게 www.korea.ac.kr의 ip주소가 무엇인지 질의
3.
질의 받은 DNS 서버는 루트 도메인 서버에게 질의 전달
4.
정보 없다면 ‘.kr’ domain name server 주소 리턴
5.
‘.kr’ domain name server는 ‘.ac.kr’ name server 주소 리턴
6.
이런 식으로 하위 name server들이 연결되고 최종적으로
www.korea.ac.kr 의 ip주소 리턴
7.
이 정보들은 각 시스템에 cache형태로 보관 다음 계속적인 질의
는 바로 응답 가능
7
GETHOSTBYNAME




함수
대부분의 응용에서는 주소 대신에 이름을 다루어야
한다.
호스트를 이름으로 찾는 가장 기본적인 함수
성공하면 호스트에 대한 모든 IPv4 주소를 가지고 있
는 hostent 구조를 가리키는 지시자를 리턴
IPv4만을 다루기 때문에 새로운 프로그램에서는
getaddrinfo의 사용을 권고한다.
8
GETHOSTBYNAME
함수(CONT.)
#include <netdb.h>
Struct hostent *gethostbyname(const char *hostname);
Struct hostent{
n. 별명, 가명
Char *h_name; //official name of host
Char **h_aliases; //pointer to array of pointers to alias names
Inth_addrtype; // host address type : AF_INET
Inth_length; //length of address : 4
Char **h_addr_list; //ptr to array of ptrs with IPv4 addrs
};

DNS 자원 기록에서의 A기록에 대한 질의를 수행한다.

IPv4 주소만을 돌려줄 수 있다.
9
GETHOSTBYADDR
함수
#include <netdb.h>
Struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);

addr : ip주소, len : 구조의 크기(4이다),
family : AF_INET

이진 IPv4주소를 취하여 그 주소에 해당하는 호스트
이름을 찾으려 한다.

gethostbyname의 반대 역할.

getbyhostname에서 설명한 것과 같은 hostent구조에
대한 지시자를 돌려 준다.
10
참고 자료

AIX
Advanced International eXecutive
 미국 IBM사가 개발하여 판매하고 있는 UNIX


BSD
Berkeley Software Distribution의 약어.
 1980년대 초반에 미국 캘리포니아 대학 버클리분교에서
개발한 유닉스 운영체제의 한 종류.

11
GETSERVBYNAME


& GETSERVBYPORT
호스트와 마찬가지로 서비스도 흔히 이름으로 알려
짐.
프로그램에서 포트 번호 대신에 이름으로 서비스를
참조하면 포트 번호가 바뀔 경우 /etc/services 파일의
한 줄만 변경하면 된다.
12
GETSERVBYNAME
#include <netdb.h>
Struct servent *getservbyname(const char *servname, const char *protoname);

주어진 이름으로 서비스를 검색한다.(port를 얻는다)

Servname은 반드시 명시, protoname은 아니다.

프로토콜은 udp와 tcp가 있는데 하나의 프로토콜만 지원하는
서비스가 있으므로 잘 알고 써야 함.
Struct servent{
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
}
13
GETSERVBYNAME(CONT.)

함수의 전형적인 호출
struct servent *sptr;
sptr=getservbyname(“domain”, “udp”);
//DNS using UDP
sptr=getservbyname(“ftp”,”tcp”);
//FTP using TCP
sptr=getservbyname(“ftp”,NULL);
//FTP using TCP
sptr=getservbyname(“ftp”,”udp”);
//this call will fail – ftp는 tcp만 지원하기 때문에
14
GETSERVBYPORT
#include <netdb.h>
Struct servent *getservbynport(int port, const char *protoname);


주어진 포트 번호와 프로토콜을 이용해서 서비스 검색
함수의 전형적인 호출
struct servent *sptr;
sptr=getservbyport(htons(53), “udp”);
//DNS using UDP
sptr=getservbyport(htons(21), “tcp”);
//FTP using TCP
sptr=getservbyport(htons(21), NULL);
//FTP using TCP
sptr=getservbyport(htons(21), “udp”);
//this call will fail – udp에서 21번 포트 사용하는 서비스 없다.
15
GETADDRINFO



함수
gethostbyname과 gethostbyaddr 함수는 IPv4만 지원
한다.
IPv6 주소의 해결을 위한 결과는 getaddrinfo함수이
다.
이름을 주소로 그리고 서비스를 포트로 변환시킬 뿐
아니라 주소 목록 대신에 sockaddr 구조를 돌려준다.
16
-END17