728x90
- Chapter 08 도메인 이름과 인터넷 주소
- < 08 - 01 : Domain Name System >
- DNS : Domain Name System 의 약자 , IP주소와 도메인 이름 사이에서의 변환을 수행하는 시스템을 가리킨다. DNS 의 중심에는 DNS 서버가 있다
- 도메인 이름 : 인터넷에서 서비스를 제공하는 서버들 역시 IP 주소로 구분이 된다. 그러나 기억하기 쉽지 않은 IP주소의 형태로 서버의 주소정보를 기억하는건 어렵기에 기억하기도 좋고 표현하기도 좋은 형태의 도메인 이름이라는 것을 IP 주소에 부여해서, 이것이 IP주소를 대신하도록 하고있다.
- DNS 서버 : 네이버에 접속하는 방법은 주소창에 ip인 222.122.195.5를 직접 입력하는것과 www.naver.com 을 입력하는 두가지의 접속방법이있다. ip주소를 통해 네이버에 접속할 경우에는 해당서버에 곧바로 접속하지만 도메인 이름은 해당 서버에 부여된 가상의 주소이지 실제주소가 아니기에 실제주소로 변환하는 과정을 거쳐서 네이버에 접속한다. 도메인이름을 실제주소로 변환해주는 작업을 하는게 DNS 서버이고 도메인네임으로 접속요청이 오면 DNS서버에 변환을 요청해서 접속하게 된다.
- 모든 컴퓨터에는 디폴트 DNS서버를 통해서 도메인 이름에 대한 IP주소 정보를 얻게된다. 그러나 디폴트 DNS가 모든 도메인의 IP주소를 알고 있지는 않다. 디폴트DNS가 모르는 도메인이름일 경우에 다른 DNS서버에 물어서라도 가르쳐 준다.
- 디폴트 DNS서버는 자신이 모르는 정보에 대한 요청이 들어오면 한단계 상위 계층에 있는 DNS Server에게 물어본다. 이러한식으로 계속 올라가다 보면 최상이 DNS서버인 Root DNS서버에게까지 질의가 전달되는데 Root DNS서버는 해당 질문을 누구에게 재 전달해야 할지 알고 있다. 그래서 자신보다 하위에 있는 DNS서버에게 다시 질의를 던져서 결국은 IP주소를 얻어내며 , 그 결과 질의가 진행된 반대방향으로 전달이 되어 결국에는 질의를 시작한 호스트에게 IP주소가 전달된다.
- 이렇듯 DNS는 계층적으로 관리되는 일종의 분산 데이터베이스 시스템이다.
- < 08-2 : IP 주소와 도메인 이름 사이의 변환 >
- 프로그램상에서 도메인 이름을 쓸 필요가 있는가?
- IP주소를 일정하게 유지하는 것은어렵다. 특히ᅟISP서비스를 제공하는 통신사업자의 도움으로 IP를 유지하고 있다면 시스템과 관련된 여러가지 이유로 IP주소의 변경이 언제든지 발생할 수 있다.
- 즉 IP주소는 도메인 이름에 비해 상대적으로 변경의 확률이 높다. 때문에 IP주소를 바탕으로 프로그램을 작성하는 것은 좋은 방법이 아니다.
- 만약 IP주소가 코드에 들어가있다면 IP주소가 바뀔때마다 코드를 컴파일한뒤 새로운 클라이언트 프로그램을 고객들에게 재설치시켜야하는 등의 불편함이 있다
- 그러므로 도메인 이름은 일단 등록하면 평생유지가 가능함으로 이를 이용해서 코드를 작성하는 편이 더 좋다.
- 도메인 이름을 이용해서 IP 주소 얻어오기
- 다음 함수를 이용하면 문자열 형태의 도메인 이름으로부터 IP의 주소정보를 얻을 수 있다.
- #include
struct hostent * gethostbyname(const char * hostname);
-> 성공시 hostent구조체 변수의 주소값, 실패시 NULL 포인터 반환
- hostent구조체의 형태는 아래와 같다.
- struct hostent
{
char * h_name; //official name
char ** h_aliases; // alias list
int h_addrtype; // host address type
int h_length; // address length
char ** h_addr_list; // address list
}
- 구조체 형태를 통해 IP 정보 뿐만 아니라 여러 다른 정보들도 반환된다는 걸알 수있다.
- h_name : 이 멤버에는 공식도메인 이름 (Official domain name) 이라는 것이 저장된다. 공식 도메인 이름은 해당 홈페이지를 대표하는 도메인 이름이라는 의미를 담고 있지만 실제 우리에게 잘 알려진 유명 회사의 도메인 이름이 공식 도메인 이름으로 등록되지 않은 경우가 많다.
- h_aliases : 하나의 아이피에 도메인이름은 여러개가 할당이 가능하다 . 공식 도메인 이름 이외에 해당 메인 페이지에 접속할 수 있는 다른 도메인 이름정보가 여기에 들어가있다.
- h_addrtype : gethostbyname 함수는 IPv4 뿐만 아니라 IPv6까지 지원한다. 때문에 h_addr_list로 반환된 IP주소의 주소체계에 대한 정보를 이 멤버를 통해 반환한다. IPv4의 경우에는 AF_INET이 저장된다.
- h_length : 함수호출의 결과로 반환된 IP주소의 크기정보가 담긴다. IPv4의 경우에는 4바이트 이므로 4가 저장되고 IPv6의 경우에는 16 바이트이므로 16이 저장된다.
- h_addr_list : 가장 중요한 멤버이다. 이멤버를 통해서 도메인 이름에 대한 IP주소가 정수의 형태로 반환된다. 참고로 접속자수가 많은 서버는 하나의 도메인 이름에 대응하는 IP를 여러 개 둬서, 둘 이상의 서버로 부하를 분산시킬수 있는데 이러한 경우에도 이 멤버를 통해서 모든 IP의 주소정보를 얻을 수 있다.
728x90
'책 > 윤성우 TCPIP' 카테고리의 다른 글
09-1 소켓의 옵션과 입출력 버퍼의 크기 (0) | 2020.12.10 |
---|---|
chapter 08 -2 , ip주소와 도메인 이름 사이의 변환 (3) (0) | 2020.12.09 |
< 08-2 : IP 주소와 도메인 이름 사이의 변환 예제 > (0) | 2020.12.08 |
07 -1 TCP 기반의 Half-close (0) | 2020.12.06 |
ubuntu vscode 에서 메인함수 argv[] 인자에 값 넣는법 (0) | 2020.11.13 |