네트워크 DNS 정리

Park Jae Hong·2022년 12월 4일
0

DNS 서버의 기본 동작

: 클라이언트에서 조회 메시지를 받고 조회 내용에 응답하는 형태로 정보를 회답하는 일

✔ 조회 메세지 정보

  • 이름 : 서버나 메일 배송 목적지(메일 주소에서 @ 뒷부분의 이름)와 같은 이름

  • 클래스 : DNS의 구조를 고안 했을때 인터넷 이외에도 네트워크에서의 이용까지 검토하여 이것을 식별하기 위해 클래스 라는 정보를 준비 ( 그러나 지금은 인터넷 이외의 네트워크는 소명 되었으므로 클래스는 항상 인터넷을 나타내는 ‘IN’ 이라는 값이 된다.)

  • 타입 : 이름에 어떤 타입의 정보가 지원되는지를 나타낸다. (Ex - 타입이 A(address) 이면 이름에 IP 주고가 지원되는 것을 나타내며, MX(Mail eXchange)이면 이름에 메일 배송 목적지가 지원 되는 것을 나타낸다. 또한 이 타입에 따라 클라이언트에 회답하는 정보의 내용이 달라짐.)

✔ 클라이언트 회답

: 조회 메시지(이름,클래스,타입) 에 해당하는 값(타입이 A 이면 IP, MX이면 메일 목적지)을 회답한다.

📌 기타 타입
PTR : IP 주소에서 이름을 조사할 때 사용
CNAME : 이름에 닉네임(alias)을 붙이기 위해 사용
NS : DNS 서버의 IP 주소를 등록할 때 사용
SOA : 도메인 자체의 속성 정보를 등록할 때 사용


도메인의 계층

: 회사에서 ‘사업부’ 등 ‘부’라는 호칭을 사용하는 것 처럼 DNS 에서는 ‘ . ’ 으로 사용.

✔ www.cyber.co.kr

kr : 도메인의 최상위 ( kr은 대한민국이 할당된 도메인)
co : 국내 도메인을 분류 하기 위함 (회사를 나타냄)
cyber : 회사에 할당된 도메인
www : 도메인의 최하위 (서버의 이름)

✔ DNS 서버에 등록한 정보를 찾아내는 방법

: 액세스 대상의 웹 서버가 어느 DNS 서버에 등록되어 있는지를 찾아내기 위함

  • 하위의 도메인을 담당하는 DNS 서버의 IP 주소를 그 상위의 DNS 서버에 등록한다
  • 상위의 DNS 서버를 또 그 상위의 DNS 서버에 등록하는 식으로 차례대로 등록한다.

  1. lab.glasscom.com 도메인을 담당하는 DNS 서버를 glasscom.com 의 DNS 서버에 등록

  2. glasscom.com 의 DNS 서버를 com 도메인의 DNS 서버에 등록


  3. 상위 DNS 서버에 가면 하위의 DNS 서버의 IP 주소를 알 수 있고, 거기에 조회메시지를 보낼 수 있다.

  • 최상위 도메인(kr,com 등) 에도 상위 도메인 루트 도메인 이 있다.

💡 루트 도메인이란 ?
루트 도메인은 서브도메인이 없는 도메인을 의미 한다.

  • 보통 com 이나 jp라는 도메인명이 없으므로 도메인을 쓸 때는 생략한다. 하지만 루트 도메인을 명시적으로 써야 하는 경우에 "www.lab.glasscom.com." 처럼 끝에 마침표를 찍어서 루트 도메인을 나타내지만, 보통은 그렇게 쓰지 않으므로 루트 도메인을 알아차리지 못한다. 위 같은 경우 루트 도메인이 존재 하므로 DNS 서버에 com 이나 co 의 DNS 서버를 등록 한다. 이렇게해서 하위의 DNS 서버를 상위 DNS 서버에 등록하여 루트 도메인에서 차례로 아래쪽으로 거슬러 내려 간다.
  • 루트 도메인의 DNS 서버를 인터넷에 존재하는 DNS 서버에 전부 등록하면 어느 DNS 서버도 루트 도메인에 액세스할 수 있게 됩니다. 그 결과 클라이언트에서 어딘가의 DNS 서버에 액세스하면 여기에서부터 루트 도메인을 경유하여 도메인의 계층 아래로 찾아가서 최종적으로 원하는 DNS 서버에 도착. 루트 도메인의 DNS 서버에 할당된 IP 주소는 전 세계 13개 밖에 없고 좀 처럼 변경되지 않으므로 이것을 각 DNS 서버에 등록하는 작업은 어렵지 않고 실제로 루트 도메인의 DNS 서버에 관한 정보는 DNS 서버 소프트웨어와 함께 설정 파일로 배포되어 있으므로 DNS 서버 소프트웨어를 설치하면 자동으로 등록이 완료된다.

✔ DNS 서버는 캐시 기능으로 빠르게 회답 가능

: DNS 서버는 한번 조사한 이름을 캐시 에 기록할 수 있는데, 조회한 이름에 해당하는 정보가 캐시에 있으면 그 정보를 회답하기 때문이다. 그러면 그 위치에서 계층 구조를 아래로 향하여 찾을 수 있고 루트 도메인부터 찾기 시작하는 것보다 이방법이 더 편리하다.

💡 캐시란 ?
한 번 사용한 데이터를 데이터의 이용 장소와 가까운 곳에 있는 고속의 기억 장치에 저장하여 두 번째 이후의 이용을 고속화하는 기술이다.
(CPU 와 메모리 사이에 두는 캐시 메모리나 디스크 장치의 데이터를 메모리나 디스크 장치의 데이터를 메모리에 캐시하는 방법 등을 이전부터 사용했는데, 네트워크에서도 캐시 기술에 의해 고속화하는 방법이 일반화되어 있다.)

주의 사항
캐시에 정보를 저장한 후 등록 정보가 변경되는 경우도 있으므로 캐시 안에 저장된 정보는 올바르다고 단언할 수 없으므로 DNS 서버에 등록하는 정보에는 유효기한을 설정하고, 캐시에 저장한 데이터의 유효 기한이 지나면 캐시에서 삭제한다. 또한 조회에 회답할 때 정보가 캐시에 저장된 것인지, 아니면 등록처 DNS 서버에서 회답한 것인지 알려준다.


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

: IP 주소의 상대에는 액세스 대상 웹 서버에 메시지를 송신하도록 OS의 내부에 있는 프로토콜 스택에 의뢰한다. (웹 서버에 보내는 HTTP 의 메시지는 디지털 데이터를 송신하도록 의뢰) 또한 디지털 데이터를 송.수신하는 동작은 브라우저뿐만 아니라 네트워크를 이용하는 어플리케이션 전체에 공통이므로 이 동작은 웹에 한정되지 않고 모든 네트워크 어플리케이션에 해당된다.

  • 데이터 송.수신 동작의 추적

    : DNS 서버에 IP 주소를 조회할 때와 같이 Socket 라이브러리에 들어있는 프로그램 부품을 이용하는데, IP 주소를 조회할 때처럼 프로그램 부품을 하나씩 호출하고 끝나지 않고 복수의 부품을 결정된 순번대로 호출해야 하므로 조금 복잡하다. 그러므로 데이터 송신의 동작 전체를 이해하지 않으면 어떤 의미인지 이해하기 어려워, 데이터 송.수신 동작 전체의 개념을 이해하는 것이 중요하다.

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

    : 데이터를 송.수신하는 컴퓨터 사이에 데이터 통로가 있고, 이것을 통해 데이터가 흐르면서 상대측에 도착하는데, 한쪽 끝에서 파이프(데이터 통로)에 데이터를 쏟아부으면 파이프 안을 통해 반대쪽 끝까지 도착하고 거기에서 데이터를 추출할 수 있다. ( 양방향이기 때문에 어느쪽에 데이터를 넣어도 상관없다.)
    📌 파이프(데이터 통로)는 최초부터 존재하는 것이 아니므로 파이프를 연결하는 동작이 필요하다

  1. 소켓을 만든다. (소켓 작성 단계)
    : 서버쪽에서 소켓을 만들고, 소켓에 클라이언트가 파이프를 연결하기를 기다린다.
  2. 서버측의 소켓에 파이프를 연결한다. (접속 단계)
  3. 데이터를 송.수신한다. (송.수신 단계)
  4. 파이프를 분리하고 소켓을 말소한다. (연결 끊기 단계)
    : 어느 쪽을 분리해도 상관 없다.

✔ 위 네가지 동작을 실행하는 것은 OS 내부의 프로토콜 스택이다

: 브라우저 등의 애플리케이션은 자체에서 파이프를 연결하거나 거기에 데이터를 쏟아붓지 않고, 프로토콜 스택에 의뢰해서 파이프를 연결하거나 데이터를 쏟아붓는다.

  • 의뢰 동작은 Socket 라이브러리에 넣은 프로그램 부품을 호출하여 실행되지만, 데이터 송.수신용 프로그램 부품은 애플리케이션에서 의뢰받은 내용을 그대로 프로토콜 스택에 전달하는 중개역을 수행할 뿐 실질적인 작업은 하지 않는다.
    (즉, Socket 라이브러리와 프로토콜 스택을 한 몸인 것으로 보고 일체화된 동작을 설명하는 쪽이 이해하기 쉽다.)

✔ 소켓의 작성 단계

: DNS 서버에 조회를 보낼 때와 같이 Socket 라이브러리 프로그램 부품을 호출하는 것이 요점, DNS 서버의 경우 gethostbyname 이라는 이름의 프로그램 부품 (리졸버) 을 호출했지만, 이번에는 몇개의 프로그램 부품을 결정된 순번대로 호출한다.

  • 준비
  1. 클라이언트측의 소켓을 만드는 방법은 소켓 라이브러리의 socket이라는 프로그램 부품 호출
  2. socket을 호출한 후의 동작은 리졸버를 호출했을 때와 같이 socket 내부에 제어가 넘어가서 소켓을 만드는 동작을 실행한다.
  3. 이것이 끝나면 애플리케이션에 제어가 돌아온다. 
소켓이 생기면 디스크립터 가 돌아오고 애플리케이션은 이것을 받아 서 메모리에 기록해 둔다.

💡 디스크립터란 ?
애플리케이션에 번호표 같은 것으로 소켓을 식별하는 역할.
EX) 브라우저에서 2개의 창을 열어 2개의 웹 서버에 동시에 액세스하는 경우 2개의 데이터를 송.수신 동작이 동시에 진행되므로 2개의 소켓을 만들어야 합니다 그럼 하나하나의 소켓을 식별해야 하는데, 이것이 디스크립터이다.

  • 접속

  1. 만든 소켓을 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다.

  2. 애플리케이션은 Socket 라이브러리의 connect 프로그램 부품을 호출하여 이 의뢰 동작을 실행한다.
    (connect 를 호출 할 때 지정하는 값은 디스크립터, 서버 IP 주소, 포트 번호이다.)

  3. 최초의 디스크립터는 소켓을 만들 때 돌아온 디스크립터이고 여기서 지정한 디스크립터는 connect가 프로토콜 스택에 통지한다.

  4. 프로토콜 스택이 통지받은 디스크립터를 보고 어느 소켓을 서버측의 소켓에 접속할지 판단하여 접속 동작 실행.

📌 IP 주소는 네트워크에 존재하는 각 컴퓨터를 식별하기 위해 각각에 서로 다른 값을 할당한 것이고, IP 주소로는 소켓을 지정할수 없어 이때 필요한 것이 포트 번호이다.
또한 접속 상대측에서 소켓을 식별하기 위해 사용한다. 포트 번호는 종류에 따라 미리 결정된 값을 사용한다는 규칙이 있다. (웹은 80번 메일은 25)
Ex) 전화를 걸었을 때 “ㅇㅇ님 계십니까 ?” 라고 말하여 통화할 상대를 바꿔달라는 중간 과정이 포트 번호이다.

  • 송.수신
  1. 송신을 하기 위한 write 프로그램 부품을 호출.

  2. write를 호출할 때 디스크립터와 송신 데이터를 지정한다.

  3. 프로토콜 스택이 송신 데이터를 서버에게 송신하고 소켓에는 연결된 상대가 기록되어 있으므로 디스크립터로 소켓을 지정하면 연결된 상대가 판명되어 그곳을 향해 데이터를 송신한다.

  4. 이 때 송신 데이터는 네트워크를 통해 전부 그대로 액세스 대상의 서버에 도착하고 그러면 서버는 수신 동작을 실행하여 받은 데이터의 내용을 조사하고 처리하여 응답 메시지를 반송한다.

  5. 다음 송신하는 동작을 할수 있는데 수신할 때 Socket 라이브러리의 read라는 프로그램 부품을 통해 프로토콜 스택에 수신 동작을 의뢰하고 수신한 응답 메시지를 저장하기 위한 메모리 영역을 지정하는데 이 메모리 영역을 수신 버퍼라고 한다.

  6. 응답 메시지가 돌아올 때 read가 받아서 수신 버퍼에 저장하고 수신 버퍼는 애플리케이션 프로그램이 내부에 마련된 메모리 영역이므로 수신 버퍼에 메시지를 저장한 시점에서 메시지를 애플리케이션에 건내준다.


  • 종료
  1. 종료를 하기 위해 close 프로그램 부품을 호출 연결 끊기 단계로 들어가 의뢰한다. 그

  2. 소켓 사이를 연결한 파이프와 같은 것이 분리되고 소켓도 말소된다.

profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글