CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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




[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.