DNS 서버는 조회 메시지를 받고 등록된 정보를 찾아 클라이언트에 회답한다.
조회 메시지
주소를 알고 싶은 이름과 네트워크를 식별하기 위한 클래스, 지원되는 타입 정보가 포함되어 있다.
등록된 정보 찾고 회답
설정 파일에서 이름, 클래스, 타입이 모두 일치하는 리소스 레코드를 찾아 등록되어 있는 주소를 회답한다.
타입이 MX인 경우는 복수의 메일 서버가 등록되어 있을 수 있으므로 우선 순위와 메일 서버의 이름을 회답한다.
모든 서버를 1대의 DNS 서버에 등록하는 것은 불가능하다. 그래서 정보를 분산시켜 여러 DNS 서버에 등록해야 한다.
여러 DNS 서버에 정보가 분산되어 있기 때문에 주소를 알고 싶은 이름이 어떤 DNS 서버에 있는지 찾아내야 한다.
DNS 서버에 있는 모든 이름들은 계층적 구조를 가진다.
루트 도메인
필요한 정보가 있는 DNS 서버를 찾는 방법
각각의 DNS 서버에 조회 메시지를 보내서 원하는 DNS 서버에 도달한다.
DNS 서버는 한 번 조사한 이름을 캐시에 기록하여 다음부터 빠르게 찾을 수 있다.
유효기간이 지나면 캐시에서 삭제하며, 회답할 때 찾은 정보가 DNS 서버에서 회답한 것인지, 캐시에 저장된 것인지 알려준다.
소켓 라이브러리의 데이터 송•수신 프로그램 부품을 호출하면, 프로그램 부품은 프로토콜 스택에 의뢰 내용을 전달하는 중개역을 수행한다.
(데이터의 출입구인 소켓을 서버측에서 만들고 대기한다.)
(서버측에서 파이프를 제거하고 다시 소켓을 만든 후 대기한다.)
소켓 라이브러리의 soket을 호출하면 소켓이 생기고, 디스크립터가 돌아온다. 애플리케이션은 디스크립터를 메모리에 기록한다.
디스크립터란?
보유하고 있는 소켓들을 식별하기 위해 사용하는 것이다. 브라우저에서 웹 서버를 동시에 액세스할 수 있으므로 복수의 소켓을 만들어 송•수신 동작을 진행해야하기 때문에 각각의 소켓에는 디스크립터가 필요하다.
소켓 라이브러리의 connect를 호출하여 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다. 이때 지정한 소켓의 디스크립터와 서버의 IP 주소, 포트 번호를 전달한다.
네트워크의 어느 컴퓨터인지는 IP 주소로 알 수 있다면, 포트 번호로 어떤 소켓인지를 알 수 있다. 상대 서버도 복수의 소켓을 가지고 있기 때문이다.
포트 번호는 웹은 80번, 메일은 25번과 같이 애플리케이션의 종류에 따라 미리 결정된 값을 사용한다.
연결되면 프로토콜 스택은 상대의 IP 주소, 포트 번호 등의 정보를 소켓에 기록한다.
소켓 라이브러리의 write를 호출하여 송신 데이터를 보내도록 프로토콜 스택에 의뢰한다.
호출할 때 디스크립터와 HTTP 리퀘스트 메시지를 지정한다.
소켓에 기록된 연결 상대에게 데이터를 송신하면, 서버는 수신 동작을 실행하여 응답 메시지를 반송한다.
응답 메시지가 돌아오면 소켓라이브러리의 read를 호출하여 수신 동작을 하도록 프로토콜 스택에 의뢰한다. 그러면 수신 버퍼에 응답 메시지를 저장한다. 수신 버퍼는 애플리케이션 프로그램 내부에 마련된 메모리 영역이다.
소켓 라이브러리의 close를 호출하여 연결을 끊도록 프로토콜 스택에 의뢰한다.
그전에 응답 메시지를 송신한 웹 서버측에서 먼저 close를 호출하여 연결을 끊는다. 그 후에 클라이언트측에 연결이 끊겼다고 통지하면 클라이언트에서도 close를 호출하여 연결을 끊는다.
2주차 분량의 책을 읽고 정리하였다. 3회독 하면서 흐름을 이해했지만 아직 궁금한게 남아있다.
출처
성공과 실패를 결정하는 1%의 네트워크 원리