- 브라우저의 주소 표시줄에 www.google.com을 입력합니다.
- 브라우저는 DNS 레코드의 캐시를 확인하여 www.google.com의 해당 IP 주소를 찾습니다.
- 요청한 URL이 캐시에 없으면 ISP의 DNS 서버가 DNS 쿼리를 시작하여 www.google.com을 호스팅하는 서버의 IP 주소를 찾습니다.
- 브라우저가 서버와의 TCP 연결을 시작합니다.
- 브라우저가 웹 서버에 HTTP 요청을 보냅니다.
- 서버가 요청을 처리하고 응답을 다시 보냅니다.
- 서버가 HTTP 응답을 보냅니다.
- 브라우저는 응답받은 데이터를 파싱하여 화면에 렌더과정을 통해 화면에 웹페이지 내용물 출력합니다.
DNS는 Domain Name System의 약자로, 웹 사이트의 이름(URL)과 링크된 특정 IP 주소를 유지 관리하는 데이터베이스입니다.
DNS 상에서 도메인에 관한 설정을 하기 위해 사용되는 일련의 문자들을 DNS 레코드라고 합니다.
인터넷의 모든 단일 URL에는 고유한 IP 주소가 할당되어 있습니다.
IP 주소는 우리가 액세스를 요청하는 웹사이트의 서버를 호스팅하는 컴퓨터에 속합니다.
DNS의 주요 목적은 인간 친화적인 탐색입니다.
ex)
www.google.com
or
142.250.207.110
URL을 사용하여 웹사이트 이름을 기억하고 DNS가 올바른 IP에 매핑하여 작업을 수행하도록 하는 것이 더 쉽습니다.
DNS 레코드를 찾기 위해 브라우저는 4개의 캐시를 확인합니다.
-
먼저 브라우저 캐시를 확인합니다. 브라우저는 이전에 방문한 웹 사이트에 대해 고정된 기간 동안 DNS 레코드 저장소를 유지합니다. 따라서 DNS 쿼리를 실행하는 첫 번째 위치입니다.
-
둘째, 브라우저는 OS 캐시를 확인합니다. 브라우저 캐시에 없으면 OS가 DNS 레코드의 캐시도 유지 관리하므로 브라우저는 레코드를 가져오기 위해 기본 컴퓨터 OS에 시스템 호출(예: Windows의 gethostname )을 수행합니다.
-
셋째, 라우터 캐시를 확인합니다. 컴퓨터에 없으면 브라우저는 자체 DNS 레코드 캐시를 유지 관리하는 라우터와 통신합니다.
-
넷째, ISP 캐시를 확인합니다. 모든 단계가 실패하면 브라우저는 ISP로 이동합니다. 귀하의 ISP는 DNS 레코드 캐시를 포함하는 자체 DNS 서버를 유지하며, 브라우저는 귀하가 요청한 URL을 찾을 수 있는 마지막 희망으로 이를 확인합니다.
앞서 언급했듯이 내 컴퓨터가 www.google.com을 호스팅하는 서버에 연결하려면 www.google.com의 IP 주소가 필요합니다.
DNS 쿼리의 목적은 웹사이트의 올바른 IP 주소를 찾을 때까지 인터넷에서 여러 DNS 서버를 검색하는 것입니다.
이러한 유형의 검색을 재귀 검색이라고 합니다.
필요한 IP 주소를 찾거나 찾을 수 없다는 오류 응답을 반환할 때까지 검색이 DNS 서버에서 DNS 서버로 반복적으로 계속되기 때문입니다.
이 상황에서 우리는 ISP의 DNS 서버를 인터넷의 다른 DNS 서버에 응답을 요청하여 의도한 도메인 이름의 적절한 IP 주소를 찾는 책임이 있는 DNS 재귀자라고 합니다.
다른 DNS 서버는 웹 사이트 도메인 이름의 도메인 아키텍처를 기반으로 DNS 검색을 수행하므로 name 서버라고 합니다.
오늘날 접하는 많은 웹사이트 URL에는 3단계 도메인, 2단계 도메인 및 최상위 도메인이 포함되어 있습니다.
이러한 각 단계에는 DNS 조회 프로세스 중에 쿼리되는 자체 name 서버가 포함되어 있습니다.
www.google.com의 경우, 처음에 DNS recursor가 root name server에 연결합니다.
root name 서버는 .com 도메인 name server로 리다이렉트합니다.
.com name server는 google.com name server로 라디아렉트합니다.
google.com name server는 DNS 레코드에서 www.google.com에 매칭되는 IP 주소를 찾고 DNS recursor로 반환하고 이를 다시 브라우저로 보냅니다.
이러한 요청은 요청 내용 및 요청 대상 IP 주소(DNS 리커서의 IP 주소)와 같은 정보가 포함된 작은 데이터 패킷을 사용하여 전송됩니다.
이러한 패킷은 올바른 DNS 서버에 도달하기 전에 클라이언트와 서버 간에 여러 네트워킹 장비를 통해 이동합니다.
이 장비는 라우팅 테이블을 사용하여 패킷이 목적지에 도달하는 가장 빠른 방법을 파악합니다.
이러한 패킷이 손실되면 요청 실패 오류가 발생합니다.
그렇지 않으면 올바른 DNS 서버에 도달하고 올바른 IP 주소를 얻은 다음 브라우저로 돌아올 것입니다.
브라우저가 올바른 IP 주소를 수신하면 정보를 전송하기 위해 IP 주소와 일치하는 서버와 연결을 구축합니다. 브라우저는 인터넷 프로토콜을 사용하여 이러한 연결을 구축합니다. 사용할 수 있는 여러 인터넷 프로토콜이 있지만 TCP는 많은 유형의 HTTP 요청에 사용되는 가장 일반적인 프로토콜입니다.
컴퓨터(클라이언트)와 서버 간에 데이터 패킷을 전송하려면 TCP 연결을 설정하는 것이 중요합니다. 이 연결은 다음 프로세스를 사용하여 설정됩니다.TCP/IP three-way handshake. 이것은 클라이언트와 서버가 SYN(동기화) 및 ACK(확인) 메시지를 교환하여 연결을 설정하는 3단계 프로세스입니다.
-
클라이언트 시스템은 인터넷을 통해 서버에 SYN 패킷을 보내 새 연결을 위해 열려 있는지 묻습니다.
-
서버에 새 연결을 수락하고 시작할 수 있는 열린 포트가 있는 경우 SYN/ACK 패킷을 사용하여 SYN 패킷의 ACK 응답으로 응답합니다.
-
클라이언트는 서버로부터 SYN/ACK 패킷을 수신하고 ACK 패킷을 전송하여 이를 확인합니다.
그런 다음 데이터 전송을 위해 TCP 연결이 설정됩니다.
TCP로 연결이 되었다면, 데이터를 전송합니다.
클라이언트의 브라우저는 GET 요청을 통해 서버에게 www.google.com 웹페이지를 요구합니다.
요청을 할 때 비밀 자료들을 포함하던지, form을 제출하는 상황에서는 POST 요청을 사용할 수도 있습니다.
이 요청을 할 때 다른 부가적인 정보들도 함께 전달이 됩니다.
- browser identification(User-Agent 헤더)
- 받아들일 요청의 종류(Accept 헤더)
- 추갖거인 요청을 위해 TCP connection을 유지를 요청하는 connection 헤더
- 브라우저에서 얻은 쿠키 정보
- 기타 등등
샘플 GET 요청 (노란색 하이라이트 된 부분 헤더):
(HTTP 요청의 내용을 보고 싶으면 Firebug같은 툴을 사용해서 볼 수 있습니다.)
서버에는 브라우저에서 요청을 수신하고 요청 처리기로 전달하여 응답을 읽고 생성하는 웹 서버(예: Apache, IIS)가 포함되어 있습니다.
요청 핸들러는 요청, 요청 헤더 및 쿠키를 읽어 요청 내용을 확인하고 필요한 경우 서버의 정보를 업데이트하는 프로그램(ASP.NET, PHP, Ruby 등으로 작성됨)입니다.
그런 다음 특정 형식(JSON, XML, HTML)으로 응답을 조합합니다.
서버 응답에는 상태 코드, 압축 유형( Content-Encoding) , 페이지를 캐시하는 방법( Cache-Control ), 설정할 쿠키, 개인 정보 등을 비롯하여 요청한 웹 페이지가 포함됩니다.
HTTP 서버 응답 예:
위의 응답을 보면 첫 줄에 상태 코드가 표시됩니다. 이는 응답 상태를 알려주므로 매우 중요합니다. 숫자 코드를 사용하여 자세히 설명하는 5가지 유형의 상태가 있습니다.
-
1xx는 정보 메시지만을 나타냅니다.
-
2xx는 일종의 성공을 나타냅니다.
-
3xx는 클라이언트를 다른 URL로 리디렉션합니다.
-
4xx는 클라이언트측 오류를 나타냅니다.
-
5xx는 서버 부분의 오류를 나타냅니다.
따라서 오류가 발생하면 HTTP 응답을 보고 어떤 유형의 상태 코드를 받았는지 확인할 수 있습니다.
브라우저는 단계적으로 HTML 콘텐츠를 표시합니다.
HTML기본 틀, 뼈대 스켈레톤을 렌더링합니다.
그런 다음 HTML 태그를 확인하고 이미지, CSS 스타일시트, JavaScript 파일 등과 같은 웹 페이지의 추가 요소에 대한 GET 요청을 보냅니다.
이러한 정적 파일은 브라우저에 의해 캐싱되므로 다음에 페이지를 다시 방문할 때, 서버로부터 다시 불러오지 않습니다.
결국에는 브라우저에 www.google.com이 표시되는 것을 볼 수 있습니다.