일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- pyladies
- codepresso
- 플라스크
- 파이썬
- 깃
- React
- 코드프레소
- AWS
- cleancode
- 개발스터디
- 프리온보딩
- 패스트캠퍼스
- mongodb
- 한빛
- git
- 한빛미디어
- Python
- pyladiesseoul
- flask
- env
- fluentpython
- 스터디
- 위코드
- 원티드
- 개발
- 예리님
- 전문가를위한파이썬
- 환경변수
- 리액트
- 코테
- Today
- Total
개발자가 내팔자
[1% 네트워크 원리] 브라우저에 URL을 치면 일어나는 일 (1) - DNS (Domain Name System) 본문
[1% 네트워크 원리] 브라우저에 URL을 치면 일어나는 일 (1) - DNS (Domain Name System)
야생의 개발자 2022. 9. 15. 09:02
네트워크를 공부해보자
원래는 '성공과 실패를 결정하는 1% 네트워크 원리'라는 책인데 너무 길어서 '1% 네트워크 원리'라고 하겠다.
검색 창에 url을 치면 어떤 일이 일어나는지를 순차적으로 따라가면서 설명하는 책인데,
기록하면서 보면 좋을 것 같아 글로 남겨두려고 한다. (면접에도 자주 나오는 질문이긴 함)
브라우저에 URL을 치면 무슨 일이 일어나나요?
url을 치면 DNS 서버로 가서 IP를 얻어온다.
인간이 일일이 IP를 기억하기 쉽지 않고, domain name으로 하자니 비효율적이라 DNS라는 걸 따로 만든 것이다.
브라우저가 직접 DNS에 전송하는 것이 아니고, Socket library에서 제공하는 resolver api를 호출하여
이를 통해 OS에게 LAN을 통해 DNS 서버에 조회 메세지를 전송한다.
DNS 서버가 IP 주소를 알려주면 그걸 받아와서 이제 IP로 요청을 보낼 수 있게 되는 것이다.
그렇다면, DNS 서버는 어떻게 생긴 놈일까?
DNS가 뭔가요?
DNS는 클라이언트에서 메세지를 받아 그에 해당하는 응답을 내려주는 서버 역할을 한다.
조회 메세지를 자세히 살펴보면 다음과 같은 정보가 있다.
- 이름 : 서버나 메일 배송 목적지 이름
- 클래스 : 어떤 네트워크인지 식별하기 위한 클래스. 현재는 인터넷 이외의 네트워크가 소멸되었으므로 항상 'IN'값이다.
(아니 인터넷 이외의 네트워크가 있었다고? 이건 나중에 좀 더 알아봐야겠다.) - 타입 : 어떤 타입의 정보가 지원되는지 나타낸다. 예를 들어 A(Address의 약자)는 IP주소가 지원, MX는 메일 배송 목적지가 지원된다는 뜻. 이 외에도 종류가 여러 개가 있는데, 대략적으로 아래와 같다. 미리미리 익혀두고 배포할 때 이런 용어들 때문에 괜히 겁먹지 않도록 하자.
- PTR : IP 주소에서 이름을 조회할 때 사용
- CNAME : 이름에 닉네임(alias)를 붙이기 위함
- NS : DNS 서버의 IP 주소를 등록
- SOA : 도메인 자체의 속성 정보를 등록
이를 통해 테이블 형태로 이루어진 파일을 통해 데이터를 조회한다.
잠시 생각해보자. 세상엔 도메인이 굉장히 많다.
과연 세상에 DNS 서버가 딱 한대 있을까?
그 한 대로 모든 처리가 가능할까?
당연히 아니다.
내가 어떤 도메인을 DNS에 질의했는데 거기에 해당 도메인에 대한 IP 정보가 없을 수도 있다.
이 때, DNS 서버가 해당 도메인을 알고 있지 않다면, 다른 DNS 서버에게 질의하여 얻어온다.
그 DNS 서버도 모르면 또 다른 DNS 서버를 가고.. 점점 멀어지게 되는 것이다.
물론 다른 DNS 서버를 찾을 때 랜덤으로 찾는 것은 아니다.
하위의 도메인을 담당하는 DNS 서버의 정보를 상위의 DNS 서버가 갖고 있어서 타고 타고 내려갈 수 있다.
당연히 멀어질 수록 속도가 느려질 수 밖에 없을 것이다. 같은 요청을 매번 이렇게 하는 게 번거로우니 보통은 캐싱을 한다.
간단히 그림을 그려봤는데 다음과 같다.
(1) Client PC가 가장 가까운 DNS 서버에 질의한다.
(2) 가장 가까운 DNS 서버에서 가장 가까운 root 서버에 질의한다.
(3) root는 com 도메인 서버가 알고 있을거라고 알려준다.
(4) com 도메인 서버에게 가서 물어본다.
(5) com은 lab이 알고 있을 거라고 말해준다.
(6) lab에게 물어본다.
(7) 해당 도메인을 알고 있어 IP를 알려준다.
(8) 이렇게 알아낸 IP 주소를 Client PC에 반환한다.
물론 실제로는 하나의 DNS 서버가 하나의 도메인만을 담당하고 있지는 않다고 한다.
한 대의 DNS 서버에 여러 개의 도메인이 있을 수도 있고, 상위와 하위의 도메인을 같은 DNS 서버에 등록하는 경우도 있다고 한다.
그림이 복잡해보이겠지만 현실은 보다 더 복잡하다는 뜻이다. 역시 쉬운 게 없다.
이러한 점을 보완하기 위해 DNS는 캐싱을 해두는데, 어느 캐싱이 그렇듯 100% 최신화가 되었다는 보장을 하기 어렵다.
그래서 유효기간을 두고 그 기간이 지나면 캐시에서 삭제한다.
유효기간이 너무 짧으면 비효율적이고, 너무 길면 최신화를 보장하기 어려울 수 있다.
다음 시간에 . . .
오늘은 DNS를 이용하여 IP 주소를 알아오는 것까지 알아보았다.
하지만 이것은 끝이 아니다.
요청을 보내야 하는데, 준비만 하고 출발도 하지 않은 셈이다.
다음 글에서는 이후의 과정을 하나씩 연재하도록 하겠다.
함께 즐거운 네트워크 여행을 떠나보도록 하자!
참고로 이 글에서 출처가 없는 이미지는 figma로 직접 그렸다.