kakasoo

[TCP/IP] Domain Name System 본문

프로그래밍/네트워크

[TCP/IP] Domain Name System

카카수(kakasoo) 2020. 7. 18. 13:57
반응형

 

 

IP 주소와 도메인 이름 사이에서 변환을 수행하는 시스템을 가리켜 DNS (Domain Name System) 이라고 하며, DNS의 중심에는 DNS 서버가 있다 - 윤성우 열혈 TCP/IP 소켓 프로그래밍 184P

 

125.209.222.141를 주소창에 입력해보자, 두려워하지 말라, 이상한 게 아니다.

넣으면 네이버가 나온다, 이는 네이버의 IP 주소이다.

자, 다시 정리해보자, 네이버 "도메인" 주소는 www.naver.com 이다.

 

 

네이버

네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요

www.naver.com

 

왜 이 주소가 아닌 숫자를 입력해도 네이버가 나오는 걸까, 이 두 접속 방법의 차이는 무엇일까?

정답은, 문자열로 되어 있는 이 주소는 가상의 주소이지, 실제 주소가 아니라는 점이다.

책에 나와 있다 시피, DNS server의 DNS는 도메인 이름을 IP 주소로 변환해주는 과정을 대신 처리해주고 있다.

모든 컴퓨터에는 디폴트 DNS 서버의 주소가 등록되어 있는데, 이 디폴트 DNS 서버에서 IP 주소 정보를 얻게 된다.

 

정확한 아이피 주소를 알고 싶다면 cmd 창에 "ping <Domain Name>" 을 입력해보자.

 

도메인은 일종의 분산된 데이터베이스로, 자신의 컴퓨터에 있는 DNS 서버에는 찾고자 하는 도메인 이름이 없을 수도 있다.

다만, 자신의 컴퓨터 상에 있는 DNS 서버가 도메인 정보를 가지고 있지 않다고 하더라도, 자신의 parent DNS server로 올라가서, 해당 정보를 찾아다 준다.

끝에 까지 가게 되면 Root DNS server가 있는데, 그 server 단계까지 가게 되면, 어떤 정보가 어느 위치에 있는지를 모두 판별할 수 있기 때문에, 결국에는 어떠한 정보든 찾을 수 있게 된다.

인터넷 상에서 도메인은 이러한 원리로 동작하고 있다.

그런데, 이게 IP 주소가 가진 문제도 해결해주는 장점을 가지고 있다.

바로 IP 주소가 쉽게 바뀐다는 점이다.

 

IP 주소와 도메인 이름 사이의 변환

만약 어떤 사이트의 개발자가 되었다고 가정하자, 우리는 이제 그 사이트에 접속하려는 사용자들을 위해서 서버를 구축할 것이니, IP 주소를 확보하고, 접근할 수 있는 PORT를 정해야 한다.

그런데 우리 고객들에게 IP 주소와 PORT를 이렇게 입력하세요, 라고 cmd 창을 다루라고 말할 것인가.

그럴 수는 없기 때문에 우리는 Domain name 이라는 시스템을 이용하고 있다, 주소만 입력하면 IP와 연동되게.

IP 주소는 ISP 서비스를 제공하는 통신 사업자의 도움으로 운영되는 것인데, 그들의 사정에 의해 IP 주소가 바뀔 수도 있는 것을, Domain Name System이 해결해주고 있다.

원래 도메인 이름에 대응하는 IP 주소를 가져오는 것이었지만,

도메인 이름은 우리가 직접 등록하는 것이고, 또한 평생 유지가 되는 것이니 도메인 이름을 근거로 매 접근마다 "다시" IP 주소를 얻어오게 한다면, IP 주소가 바뀌어도 상관 없지 않을까?

설령 기존에 대응되는 게 바뀌어도 말이다.

 

  • #include <netdb.h>
  • struct hostent* gethostbyname(const char* hostname);
  • 성공 시에는 hostent 구조체 변수의 주소 값을 반환하고, 실패 시에는 NULL 포인터 반환.

이 함수는 도메인 이름을 문자열로 전달하면, 해당 도메인의 IP 주소 정보를 반환하는 함수이다.

다만, 이 hostent는 구조체인데, 구조체에는 다음과 같은 정보들이 담겨 있다.

 

  • char* h_name; // official name == 공식 도메인 이름
  • char** h_aliases; // alias list == 공식적이지 않은, 다른 Domain name들을 의미한다.
  • int h_addrtype; // host address type == 주소 체계에 대한 정보, IPv4 또는 IPv6 등등.
  • int h_length // IP주소의 크기 정보, IPv4는 4byte지만 IPv6는 16byte이다.
  • char** h_addr_list // adress list == 가장 중요한 멤버인데, 접속자가 많을 경우 하나의 도메인이 여러 IP를 가지게 하여 서버의 부하를 줄이는데, 이 때 이런 IP 주소들이 이 변수에 들어가게 된다.

마지막 꺼에 여담을 적자면, 네이버는 끝자리 숫자를 바꿔서 IP를 입력해도 들어가진다.

반응형