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