03. 전 세계의 DNS 서버가 연대

1. DNS 서버의 기본 동작

DNS 서버는 조회 메시지를 받고 등록된 정보를 찾아 클라이언트에 회답한다.

  1. 조회 메시지

    주소를 알고 싶은 이름과 네트워크를 식별하기 위한 클래스, 지원되는 타입 정보가 포함되어 있다.

  2. 등록된 정보 찾고 회답

    설정 파일에서 이름, 클래스, 타입이 모두 일치하는 리소스 레코드를 찾아 등록되어 있는 주소를 회답한다.

    타입이 MX인 경우는 복수의 메일 서버가 등록되어 있을 수 있으므로 우선 순위와 메일 서버의 이름을 회답한다.

2. 도메인의 계층

모든 서버를 1대의 DNS 서버에 등록하는 것은 불가능하다. 그래서 정보를 분산시켜 여러 DNS 서버에 등록해야 한다.

여러 DNS 서버에 정보가 분산되어 있기 때문에 주소를 알고 싶은 이름이 어떤 DNS 서버에 있는지 찾아내야 한다.

DNS 서버에 있는 모든 이름들은 계층적 구조를 가진다.

  • 예시 : example.co.kr
    • 점으로 계층을 구분하는데, 점으로 구분한 하나하나가 도메인이다.
    • 가장 뒤에 있는 kr이 최상위 도메인이고, 가장 앞에 있는 example이 최하위 도메인이다.
    • sub.example.co.kr 처럼 여러개의 하위 도메인을 할당할 수 있다.

3. 필요한 정보가 있는 DNS 서버를 찾는 방법

  • 루트 도메인

    • com이나 kr보다 상위에 있는 최상위 도메인이다.
    • 루트 도메인을 써야 하는 경우는 끝에 마침표를 찍어 루트 도메인을 나타낸다.
    • 전 세계에 13개가 있고, 잘 변경되지 않는다.
  • 필요한 정보가 있는 DNS 서버를 찾는 방법

  1. 루트 도메인의 정보가 있는 DNS 서버의 IP 주소를 모든 DNS 서버에 등록한다. 그렇게 되면 어느 DNS 서버를 가도 루트 도메인의 정보가 있는 DNS 서버에 액세스할 수 있다.
  2. 하위 도메인의 정보가 있는 DNS 서버의 IP 주소를 한 단계 상위 도메인의 정보가 있는 DNS 서버에 등록한다. 그러면 최상위 도메인의 정보가 있는 DNS 서버에서 한 단계씩 하위로 가서 결국 최하위의 DNS 서버의 IP 주소를 알 수 있게된다.

각각의 DNS 서버에 조회 메시지를 보내서 원하는 DNS 서버에 도달한다.

4. DNS 서버의 캐시 기능

DNS 서버는 한 번 조사한 이름을 캐시에 기록하여 다음부터 빠르게 찾을 수 있다.

유효기간이 지나면 캐시에서 삭제하며, 회답할 때 찾은 정보가 DNS 서버에서 회답한 것인지, 캐시에 저장된 것인지 알려준다.

04. 프로토콜 스택에 메시지 송신 의뢰

1. 데이터 송•수신 동작의 개요

소켓 라이브러리의 데이터 송•수신 프로그램 부품을 호출하면, 프로그램 부품은 프로토콜 스택에 의뢰 내용을 전달하는 중개역을 수행한다.

  • 데이터 송•수신 프로그램 부품을 호출 시 실행되는 동작

(데이터의 출입구인 소켓을 서버측에서 만들고 대기한다.)

  1. 클라이언트측에서 소켓을 만든다.
  2. 서버측의 소켓에 파이프를 연결한다.
  3. 데이터를 송•수신한다.

(서버측에서 파이프를 제거하고 다시 소켓을 만든 후 대기한다.)

  1. 파이프를 분리하고 클라이언트측의 소켓을 말소한다.

2. 소켓의 작성 단계

소켓 라이브러리의 soket을 호출하면 소켓이 생기고, 디스크립터가 돌아온다. 애플리케이션은 디스크립터를 메모리에 기록한다.

디스크립터란?

보유하고 있는 소켓들을 식별하기 위해 사용하는 것이다. 브라우저에서 웹 서버를 동시에 액세스할 수 있으므로 복수의 소켓을 만들어 송•수신 동작을 진행해야하기 때문에 각각의 소켓에는 디스크립터가 필요하다.

3. 파이프를 연결하는 접속 단계

소켓 라이브러리의 connect를 호출하여 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다. 이때 지정한 소켓의 디스크립터와 서버의 IP 주소, 포트 번호를 전달한다.

네트워크의 어느 컴퓨터인지는 IP 주소로 알 수 있다면, 포트 번호로 어떤 소켓인지를 알 수 있다. 상대 서버도 복수의 소켓을 가지고 있기 때문이다.

포트 번호는 웹은 80번, 메일은 25번과 같이 애플리케이션의 종류에 따라 미리 결정된 값을 사용한다.

연결되면 프로토콜 스택은 상대의 IP 주소, 포트 번호 등의 정보를 소켓에 기록한다.

4. 메시지를 주고받는 송•수신 단계

소켓 라이브러리의 write를 호출하여 송신 데이터를 보내도록 프로토콜 스택에 의뢰한다.

호출할 때 디스크립터와 HTTP 리퀘스트 메시지를 지정한다.

소켓에 기록된 연결 상대에게 데이터를 송신하면, 서버는 수신 동작을 실행하여 응답 메시지를 반송한다.

응답 메시지가 돌아오면 소켓라이브러리의 read를 호출하여 수신 동작을 하도록 프로토콜 스택에 의뢰한다. 그러면 수신 버퍼에 응답 메시지를 저장한다. 수신 버퍼는 애플리케이션 프로그램 내부에 마련된 메모리 영역이다.

5. 연결 끊기 단계에서 송•수신 종료

소켓 라이브러리의 close를 호출하여 연결을 끊도록 프로토콜 스택에 의뢰한다.

그전에 응답 메시지를 송신한 웹 서버측에서 먼저 close를 호출하여 연결을 끊는다. 그 후에 클라이언트측에 연결이 끊겼다고 통지하면 클라이언트에서도 close를 호출하여 연결을 끊는다.


2주차 분량의 책을 읽고 정리하였다. 3회독 하면서 흐름을 이해했지만 아직 궁금한게 남아있다.

  • 포트 번호가 웹은 80번, 메일은 25번인데.. 그럼 웹을 두 개 이상 띄우면 어떻게 구분하지??
  • 소켓과 파이프는 어떤걸까
    • 파이프 = 세션 (가상의 논리적 회선)
  • 연결을 끊을 때 소켓을 말소하는 이유는 무엇일까

출처

성공과 실패를 결정하는 1%의 네트워크 원리

0개의 댓글

Powered by GraphCDN, the GraphQL CDN