HTTP 메시지를 만들어서 OS에게 의뢰하여 액세스 대상에게 송신하게 된다.
브라우저는 URL을 해독해서 HTTP 메시지를 만드는데 이때 URL 안에 쓰여있는 서버의 도메인명에서 IP 주소를 알아내야 한다.
🟩 도메인명과 IP 주소
01. TCP/IP 네트워크
TCP/IP 네트워크는 서브넷이라는 작은 네트워크를 라우터(router)로 접속하여 전체 네트워크를 구성하게 된다.
TCP/IP 네트워크는 IP 주소로 통신 상대를 지정한다.
클라이언트가 HTTP 메시지를 외부 대상에게 보내려고 했을 때 허브가 HTTP 메시지를 받아서 라우터에게 넘겨준다.
라우터는 IP 주소를 보고 다음 상대(라우터)를 확인하고 송신한다.
이것을 계속 반복하면서 클라이언트 HTTP 메시지가 상대방에게 도착하는 방식이다.
02. 클라이언트는 도메인명을 이용해서 웹에 접근한다.
HTTP 메시지를 송신할 때 라우터는 IP 주소를 확인해서 다음 라우터를 넘긴다는 것을 알게됐다.
하지만 사용자 입장에서는 네이버 페이지만 들어간다고 해도 IP 주소가 아닌 도메인명(naver)을 입력해서 들어가게 된다.
사용자는 도메인명을 외우는게 훨씬 편하기 때문이다.
🤔 그러면 라우터 입장에서도 도메인명을 이용해서 다음 라우터에게 넘겨주는게 더 좋지 않을까?
IP 주소의 경우 4byte만 있으면 충분하지만
도메인명의 경우 최대 255byte까지도 필요할 수도 있다.
즉, IP 주소를 이용하는 편이 훨씬 더 효율적이라는 것을 알 수 있다.
결국 사용자는 편리하도록 도메인명을 쓰고 라우터는 효율적인 IP 주소를 사용하는 방법을 채택하게 됐다.
🟩 DNS 리졸버를 이용해서 IP 주소 찾기
01. 도메인명으로 어떻게 IP 주소로 알아낼까?
- Socket 라이브러리가 IP 주소를 찾을 수 있도록 도와준다.
조금 더 자세히 말하자면 Socket 라이브러리에 들어간 DNS 리졸버를 이용해서 DNS 서버를 조회하게 된다.
제어권을 갖게된 DNS 리졸버가 동작한다.
DNS 서버에 조회하기 위한 조회 메시지를 만든다.
메시지 송신을 동작한다.
OS 내부 프로토콜 스택을 호출하여 메시지 송신을 의뢰한다.
DNS 리졸버가 프로토콜 스택을 호출한다.
프로토콜 스택을 호출하여 메시지를 보내는 동작을 실행하여 DNS 서버에게 송신된다.
DNS 서버에 등록되어 있다면 응답 메시지를 클라이언트에게 반송한다.
그게 아니라면 DNS 리졸버가 조회 메시지를 받아서 해독하여 IP 주소를 찾아낸다.
찾아낸 IP 주소를 <메모리 영역>에 저장하게 되고 DNS 리졸버 동작이 끝이 나게된다.
DNS 리졸버 동작이 끝나면 제어권이 다시 애플리케이션에 돌아오고 <메모리 영역>에서 IP 주소를 꺼내서 사용하게 된다.
🟩 DNS 서버란?
01. DNS 서버 기본 동작
- DNS 서버의 기본 동작은 클라이언트에서 조회 메시지를 받고 조회의 내용을 응답하는 형태로 정보를 회답하는 일이다.
DNS 서버는 서버에 등록된 도메인 명과 IP 주소의 대응표를 조사하여 IP 주소를 회답한다.
DNS 리졸버는 DNS 서버에 조회하기 위해서 조회 메시지를 보냈다.
조회 메시지에는 DNS 서버에서 등록된 정보를 찾을 수 있게 도와줄 정보가 들어있다.
밑에서 더 알아보자.
02. 조회 메시지
조회 메시지에는 3가지 정보(이름, 클래스, 타입)가 있다.
02-01. 이름, 값
- 서버나 메일 배송 목적지와 같은 이름, 값
02-02. 클래스
- 인터넷 이외에도 네트워크에서 이용까지 검토하여 식별하기 위한 정보
- 지금은 인터넷 이외의 네트워크는 소멸되었으므로 항상 IN을 가지고 있다.
02-03. 타입
- 어떤 타입의 정보가 지원되는지 나타낸다.
- 타입 A일 경우
- name : 호스트 네임
- value : 호스트 네임에 대한 IP 주소
- 타입 NS일 경우
- name : 도메인
- value : DNS 서버의 호스트 네임
- 타입 CNAME일 경우
- name : 별칭 호스트 네임
- value : 별칭 호스트 네임 name에 대한 정식 호스트 네임
🟩 DNS 서버 구조
🤔 만약 요청한 DNS 서버에 리소스 레코드 목록에 찾는 정보가 없다면 어떻게할까?
DNS 서버는 1대만 있는게 아니다.
즉, 여러 DNS 서버에 계속해서 물어보게 된다.
더 알아보기 위해서 DNS 서버 구조에 대해 먼저 학습하자.
01. 도메인명의 계층적 구조
DNS 서버는 확장성 문제를 다루기 위해서 계층 형태로 구성하고 있다.
대표적으로 세 유형의 DNS 서버를 얘기하자면 루트 DNS 서버, 최상위 레벨 도메인 서버, 책임 DNS 서버가 존재한다.
그렇다면 계층형 구조를 어떤 식으로 이용하는지 알아보자.
현재 블로그(www.programming-hyena.tistory.com)를 주소창에 입력했을 때 어떤 식으로 DNS 서버를 접근하게 될까?
먼저 가장 가까운 DNS 서버(Local DNS Server)에 물어보게 된다.
가장 가까운 DNS 서버에 해당 도메인이 존재한다면 바로 반환하게 된다.
하지만 그렇지 못한 경우 루트 DNS 서버에 물어보면서 점차 계층적으로 내려오면서 찾게된다.
🟩 DNS 캐싱
계층형 구조에서 "가장 가까운 DNS 서버(Local DNS Server)"는 예외이다.
이는 DNS 캐싱을 이용해서 비용을 줄일 수 있기에 존재한다.
첫 번째 사용자가 Local DNS Server에 물어봤을 때는 정보가 없기에 루트 DNS 서버에 물어보면서 8번 송수신이 필요했다.
두 번째 사용자는 Local DNS Server에 똑같이 물어봤는데 이전에 첫 번째 사용자가 물어본 정보가 캐싱되어 있어서 2번의 송수신으로 찾을 수 있었다.
🔗 참고
'🌐 네트워크' 카테고리의 다른 글
HTTPS (0) | 2023.06.19 |
---|---|
[네트워크] 애플리케이션 계층 - HTTP, Cookie, Web Cache (0) | 2023.06.14 |
[네트워크] 애플리케이션 계층 - 네트워크 애플리케이션의 원리 (0) | 2023.06.13 |
[네트워크] 메시지 무결성과 전자서명 (0) | 2023.05.28 |
[네트워크] 암호화의 원리 (0) | 2023.05.28 |