| [ CnUnix ] in KIDS 글 쓴 이(By): guest (guest) 날 짜 (Date): 1995년11월23일(목) 22시41분44초 KST 제 목(Title): Name Resolution in UNIX Unix에서 어떻게 name resolution (name ==> IP address)를 할까에 대하여 제가 생각하기로는 대충 이런 것 같습니다. 1. name resolution 방법은 세가지가 있습니다. A. /etc/hosts를 이용한다. /etc/hosts는 IP address, name, aliases의 형식으로 호스트의 IP address와 alias에 대한 기록이 있는 화일입니다. B. name server를 이용한다. - name server란 name을 주면 IP address를 알려주는 service를 해주는 기계를 말합니다. 대표적으로 BIND(Berkeley Internet Name Domain)의 name server가 있습니다. - 사용할 name server들은 /etc/resolv.conf 화일에 저정합니다. - /etc/resolv.conf에 지정된 name server들은 resolution이 될 때까지 차례로 시도됩니다. C. NIS hosts map을 이용한다. - NIS(Network Information System)이 설치되어 있는 경우 이용될 수 있다. - NIS를 해 보질않아 잘 모름 2. 시스템은 어떠한 방법으로 resolution을 하는가 ? 프로그램은 name으로부터 IP address를 알아내기 위해 gethostbyname(3)을 이용합니다. 이 gethostbyname 함수의 구현은 라이브러리마다 조금 다릅니다. A. UNIX의 기본 C Library ( SunOS 4.1.3의 경우는 맞음. 다른 unix는 확인 안해 봤음) - /usr/lib/libc.a의 기본 C library의 gethostbyname은 /etc/hosts만 이용한다. - 따라서 만약 프로그램이 libc.a의 gethostbyname과 링크가 되었다면 /etc/hosts에 기록된 것이외의 host에 대해서는 "unknown host"라는 예러가 난다. - 문제 해결 방법은 host의 IP address를 다른 방법으로 알아 내서 (nslookup 같은 프로그램을 이용), /etc/hosts에 이 호스트에 대한 정보를 추가한다. B. BIND에서 제공하는 resolver library (4.9.2기준, 그 이전 버전은 확인안 해 봤음) - /etc/hosts와 name server를 이용한다. - 만약 local name server(즉 자신의 시스템에 namer server가 설치되어 있는 경우)가 있으면, local name server를 이용한다. - local name server가 없으면, /etc/hosts를 참조하고, 거기서 해결이 안되면 /etc/resolv.conf에 저정된 name server를 이용한다. C. resolv+ resolver library (2.2.1기준, 다른 버전은 확인안해 봤음) - /etc/hosts, name server, NIS hosts map을 지원한다. - 이들 세 방법의 우선 순위는 /etc/host.conf에 저정한다. - /etc/host.conf의 예 # first try /etc/hosts, next name servers listed in /etc/resolv.conf # last NIS order hosts, bind, nis 3. unknown host라는 에러 메시지에 대한 대응책 A. 원하는 호스트의 IP address를 일일이 /etc/hosts에 넣는다. - /etc/hosts는 어떤 resolver library든지 모드 이용하므로 이 방법이 가장 초보적이다. - 하지만, 일일이 /etc/hosts에 넣는 것도 귀찮고, 이건 관리자만이 할 수가 있다. 그러므로 다음 방법들을 이용하는 것이 좋다. B. source가 available해서 컴파일(링크)가 가능하면 - 위에서 언급한 BIND 또는 resolv+ library를 구해서 인스톨한다. - 일반적으로 이들 라이브러리는 /usr/lib/libresolv.a로 존재한다. - -lresolv 옵션으로 링크를 다시한다. - gethostbyname을 libc.a의 것과 링크시키는 것이 아니라, libresolv.a의 것과 링크시키는 것이다. C. source가 available하지 않거나, 일일이 다시 컴파일 하기 어렵다면 - 일반적으로 대부분의 프로그램들은 C library의 shared library와 링크된다. - libc.a는 static library로서 그 code가 링크시에 실제로 a.out으로 들어간다. - libc.so.* 또는 libc.sa.*는 shared library로서 실행시에 바인딩이 일어난다. - cc 또는 gcc의 링커는 기본적으로 static library와 shared library가 있으면 기존의 C library의 gethostbyname은 일반적으로 shared library와 링크가 된다. - 그러므로 gethostbyname의 shared library를 name server를 이용하는 것으로 교체하면, 기존의 프로그램들은 변경시키지 않고 name server를 이용하도록 고칠 수가 있다. - 위에서 언급한 BIND의 resolver library와 reolv+ resolver library는 모두 shared library version을 가지고 있으므로, 이들을 구해서 인스톨하면 된다. 대충 요약 하면 위와 같습니다. 제가 이런 내용을 조금 정리 해 놓은 것이 있거든요 http://salmosa.kaist.ac.kr/LAB/MEMBER/HSCHAE/Tip/resolve.html ---- 채 흥 석 http://salmosa.kaist.ac.kr/LAB/MEMBER/hschae.html |