개발 서적 완독하기/성공과실패를결정하는1%네트워크

성공과 실패를 결정하는 1% 네트워크 - IP 주소를 DNS 서버에 조회한다.

코드 살인마 2022. 12. 3. 23:53
728x90

Story 02 IP 주소를 DNS서버에 조회한다.

1. IP 주소의 기본

인터넷은 TCP/IP의 개념에 기초하여 만들어졌다. TCP/IP는 서브넷이라는 작은 네트워크를 라우터로 접속하여 전체 네트워크가 구성되어진다.

 

서브넷이란, 허브에 여러 대의 PC가 접속한 상태라고 생각한다. 여기에 ‘번지’ 라는 형태로 네트워크 주소를 할당한다.

좀 더 큰 범위인 ‘동’에 해당하는 번호는 서브넷에 할당(네트워크 번호), ‘번지’에 해당하는 번호는 컴퓨터에(호스트 번호) 할당한다. 네트워크 번호와 호스트 번호를 합쳐서 IP주소라 한다.

 

액세스 대상의 서버까지 메시지를 운반할 때는 이 IP주소에 따라 액세스 대상의 위치를 파악하고 운반한다.

만약 메시지를 보내면 서브넷 안에 있는 허브가 운반하고 보낸 측에서 가장 가까운 라우터에 도착한다. 이후, 라우터가 메시지를 보낸 상대를 확인하고, 다음 라우터로 보내도록 지시하고, 이를 반복하여 최종적으로 수신측에 메시지가 도착한다. 이것이 IP 주소와 TCP/IP에 대한 기본적인 개념이다.

 

돌아가 IP주소는 네트워크 번호와 호스트 번호를 합친 건데, 어느 부분이 네트워크 번호인지, 호스트 번호인지 알 수 없다. 이것을 판단하기 위해 IP주소에 덧붙이는데, 이 정보를 ‘넷마스크’라 한다.

Ex) 10.11.12.13 / 255.255.255.0 / 기준으로 앞이 IP, 뒤가 넷마스크이다.

 

넷마스크가 1인 부분이 네트워크 번호, 0이 호스트 번호이다. 아래 그림을 참고하면 이해가 더 쉽다.

 

Untitled

이 외에도 호스트 번호가 모두 1이면 서브넷에 있는 기기 전체에 패킷을 보내는 브로드캐스트를 나타낸다.

Ex) 10.11.12.255/24. 호스트번호가 255 즉 1임으로 브로드캐스트임

2. 도메인명과 IP 주소를 구분하여 사용하는 이유

URL에 IP주소를 입력해도 잘 동작하지만, 숫자로 이루어진 IP주소를 기억하기 어렵기 때문에 도메인을 사용하는 것이 좋다.

 

그렇다면, 아예 기억하기 어려운 IP주소 대신 도메인명을 통해 통신하면 어떨까? 물론 사용자 입장에서는 더 쉬울 순 있어도, 현재 IP 주소는 4바이트이지만 도메인은 255바이트까지 취급할 수 있기 떄문에 시간이 느려지고 네트워크 속도도 느러질 것이다.

3. Socket 라이브러리가 IP 주소를 찾는 기능을 제공한다.

도메인을 IP주소로 변환하기 위해 DNS 서버에 요청을 보내야 하는데 이를 어떻게 할까?

 

DNS 서버에 요청을 보낸다는 건 DNS 서버에 대해 클라이언트로 동작한다고 볼 수 있다. 여기서 DNS 클라이언트는 DNS 리졸버 또는 리졸버라 부른다.

 

리졸버는 Socket 라이브러리에 존재하며, Socket 라이브러리는 네트워크 기능을 호출하기 위한 프로그램의 집합체이다.

4. 리졸버를 이용하여 DNS 서버를 조회한다.

리졸버를 호출하는 방법은 Socket의 gethostbyname함수를 이용하면 된다.

Ex) <메모리영역> = gethostname(”www.naver.com”);

 

위와 같이 리졸버를 호출하면 리졸버가 DNS 서버에 요청한다. 응답 메시지 속에는 IP 주소가 포함되어 있어, 이를 이용하여 브라우저에서 지정한 메모리 영역에 써 놓는다. 이후, 브라우저는 웹 서버에 메시지를 보낼 때는 메모리 영역에서 IP 주소를 추출하여 HTTP의 request 메세지와 함께 OS에 건네준다.

5. 리졸브 내부의 작동

리졸부 내부에서는 DNS 서버에 문의하기 위한 메시지를 만드는 작업이 진행된다. 이때 메시지 송신 동작은 리졸버가 스스로 실행하는 것이 아니라 OS의 내부에 포함된 프로토콜 스택을 호출하여 실행을 의뢰한다. 리졸버도 브라우저와 마찬가지로 네트워크에 대해 데이터를 송수신하는 기능이 없기 때문이다.

 

리졸버가 프로토콜 스택을 호출하면 LAN 어댑터를 통해 메시지가 DNS 서버에 송신된다. 이후 응답이 오면 프로토콜 스택을 경우하여 리졸버에게 건네지고, 리졸버는 내부에서 이를 해독한 후, IP 주소를 추출하여 애플리케이션에 IP 주소를 건네준다.