이름과 주소 변환 DNS 해결사 함수 정보통신대학 컴퓨터 학과 도희성 Chap. 11
개요 숫자로 표시 된 주소 호스트 주소 (eg ) 서버 포트 (eg. 메아리서버 포트 9877, 표준시각 포트 13) 이름으로 주소를 표시하자 이름이 기억하기 더 쉬움 숫자 주소는 변할 수 있음 ( 이름은 그렇지 않다 ) IPv6 에서 숫자 주소가 매우 길어진다. 이름과 숫자를 변환하는 함수 gethostbyname, gethostbyport - 호스트 /IPv4 주소 間 getservbyname, getservbyport – 서비스 /port 번호 間 1
영역 이름 시스템 (DNS) 호스트 이름과 IP 주소와의 대응 관계 찾기 위해 사용 호스트 이름의 종류 단순 형 Solaris, freebsd 한정 형 (FQDN) Unpbook.com 기술적으로 절대 이름이라고 하며 반드시 마침표로 끝남. 마지막 마침표는 생략 가능 ( 흔히 생략 : naver.com. ) 끝의 마침표는 해결사에게 한정적임. 즉 가능한 영역 목록을 찾 을 필요가 없음을 알려 준다. 2
자원 기록 DNS 의 항목을 자원 기록 ( RR) 이라고 함. A 호스트 이름을 32bit IPv4 주소로 변환 AAAA Quad A – 32bit 의 4 배라서 128 bit IPv6 주소로 변환 PTR 지시자 기록 IP 주소를 호스트 이름으로 변환 MX 특정한 호스트에 대해 mail 교환기로 동작하도록 명시 CNAME 정규 이름 ftp, www 같은 일반적인 서비스에 할당. 실제 호스트이름 대신에 이 서비스 이름을 사용하면 서비스가 다른 호스트로 이동하더라도 상관하지 않음 3
자원기록 ( CONT.) Free bsdINA INAAAA3ffe:b80:1f8d.1.a00:20ff:fea7:686b INMX5freebsd.unpbook.com. INMX10mailhost.unpbook.com. ftpINCNAMElinux.unpbook.com. wwwINCNAMElinux.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 자신의 DNS 서버에게 의 ip 주소가 무엇인지 질의 3. 질의 받은 DNS 서버는 루트 도메인 서버에게 질의 전달 4. 정보 없다면 ‘.kr’ domain name server 주소 리턴 5. ‘.kr’ domain name server 는 ‘.ac.kr’ name server 주소 리턴 6. 이런 식으로 하위 name server 들이 연결되고 최종적으로 의 ip 주소 리턴 7. 이 정보들은 각 시스템에 cache 형태로 보관 다음 계속적인 질의 는 바로 응답 가능 7
GETHOSTBYNAME 함수 대부분의 응용에서는 주소 대신에 이름을 다루어야 한다. 호스트를 이름으로 찾는 가장 기본적인 함수 성공하면 호스트에 대한 모든 IPv4 주소를 가지고 있 는 hostent 구조를 가리키는 지시자를 리턴 IPv4 만을 다루기 때문에 새로운 프로그램에서는 getaddrinfo 의 사용을 권고한다. 8
GETHOSTBYNAME 함수 ( CONT.) Struct hostent{ 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 n. 별명, 가명 #include Struct hostent *gethostbyname(const char *hostname);
GETHOSTBYADDR 함수 addr : ip 주소, len : 구조의 크기 (4 이다 ), family : AF_INET 이진 IPv4 주소를 취하여 그 주소에 해당하는 호스트 이름을 찾으려 한다. gethostbyname 의 반대 역할. getbyhostname 에서 설명한 것과 같은 hostent 구조에 대한 지시자를 돌려 준다. 10 #include Struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
참고 자료 AIX Advanced International eXecutive 미국 IBM 사가 개발하여 판매하고 있는 UNIX BSD Berkeley Software Distribution 의 약어 년대 초반에 미국 캘리포니아 대학 버클리분교에서 개발한 유닉스 운영체제의 한 종류. 11
GETSERVBYNAME & GETSERVBYPORT 호스트와 마찬가지로 서비스도 흔히 이름으로 알려 짐. 프로그램에서 포트 번호 대신에 이름으로 서비스를 참조하면 포트 번호가 바뀔 경우 /etc/services 파일의 한 줄만 변경하면 된다. 12
GETSERVBYNAME 주어진 이름으로 서비스를 검색한다.(port 를 얻는다 ) Servname 은 반드시 명시, protoname 은 아니다. 프로토콜은 udp 와 tcp 가 있는데 하나의 프로토콜만 지원하는 서비스가 있으므로 잘 알고 써야 함. Struct servent{ char *s_name; char **s_aliases; int s_port; char *s_proto; } 13 #include Struct servent *getservbyname(const char *servname, const char *protoname);
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 주어진 포트 번호와 프로토콜을 이용해서 서비스 검색 함수의 전형적인 호출 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 #include Struct servent *getservbynport(int port, const char *protoname);
GETADDRINFO 함수 gethostbyname 과 gethostbyaddr 함수는 IPv4 만 지원 한다. IPv6 주소의 해결을 위한 결과는 getaddrinfo 함수이 다. 이름을 주소로 그리고 서비스를 포트로 변환시킬 뿐 아니라 주소 목록 대신에 sockaddr 구조를 돌려준다. 16
17 -END-