[Network] 1. 웹 브라우저가 메시지를 만든다.(응용 계층)
본 내용은 "성공과 실패를 결정하는 1%의 네트워크 원리" 책을 읽고 요약/정리 한 내용입니다. 웹 브라우저에서 URL을 입력해서 웹사이트의 정보가 브라우저에 출력될 때까지 일어나는 일을 계층을 따라가며 이해하기 쉽게 설명한 좋은 책이니 추천합니다.
개요
- HTTP 리퀘스트 메시지를 작성한다
- 웹 서버의 IP 주소를 DNS 서버에 조회한다
- 전 세계의 DNS 서버가 연대한다
- 프로토콜 스택에 메시지 송신을 의뢰한다
1. HTTP 리퀘스트 메시지를 작성한다
1. URL 입력
- URL의 앞부분은 액세스방법, 액세스할때의 프로토콜의 종류를 명시하기 위해 사용된다.
2. 브라우저는 URL을 해독한다
https://웹서버명/디렉토리명/파일명
3. 파일명을 생략한 경우
- index.html 또는 default.htm 과 같은 디폴트 페이지를 서버측에서 설정해두는 것이 일반적
4. HTTP의 기본 개념
무엇을 어떻게 하겠다.
- URI: 무엇을
- 메소드: 어떻게
- 스테이터스 코드: 응답메시지의 맨 앞부분에서 결과를 나타내는 코드
5. HTTP 리퀘스트 메시지를 만든다
URL을 해독하고 웹 서버와 파일명을 판단하면 브라우저는 이것을 바탕으로 HTTP 리퀘스트 메시지를 만든다.
- 메시지의 첫번째 행에는 리퀘스트 라인을 쓴다
- 메소드
- URI
- HTTP 버전
- 메시지 헤더: 부가적인 자세한 정보
- Content-Type, E-tag 등
- 공백행
- 메시지 본문: Get인 경우는 쓰지 않는다
6.리퀘스트 메시지를 보내면 응답이 되돌아 온다
스테이터스 코드
첫번째 행에 개요를 나타내고, 두 번째와 세 번째 행에 상세한 상황을 나타낸다
2. 웹서버의 IP 주소를 DNS 서버에 조회한다
1. IP 주소의 기본
서브넷에 네트워크번호를 할당하고, 컴퓨터에 호스트 번호를 할당한다. 이 네트워크 번호와 호스트 번호를 합친것을 IP주소라고 한다. 액세스 대상의 서버까지 메시지를 운반할 때, 이 IP주소에 따라 액세스 대상이 어디에 있는지 판단하고 운반한다. 처음 메시지를 보내면, 서브넷 안에 있는 허브가 운반하고 이를 가장 가까운 라우터까지 보내서 라우터가 메시지를 확인하여 어느 라우터에 보낼지 결정하는 것의 반복을 통해서 상대에게 도착하게 된다
- TCP/IP: 서브넷이라는 작은 네트워크를 라우터로 접속하여 전체 네트워크가 만들어짐
- 서브넷: 허브에 몇대의 PC가 접속된 것이라고 생각해도 무방
허브: 패킷을 중계하는 장치의 일종이며, 리피터 허브와 스위칭 허브의 두가지 유형이 있다
라우터: 패킷을 중계하는 장치의 일종
IP 주소의 표기방법
32비트의 디지털 데이터
IP 주소의 규칙에서는 네트워크 번호와 호스트 번호의 두가지를 합쳐서 32비트로 한다는것만 결정되어 있을 뿐 내역은 결정되어 있지 않다. 이를 위해 사용하는것이 넷마스크(서브넷마스크)
- 10.11.12.13 - IP주소 본체의 표기 방법
- 10.11.12.13 / 255.255.255.0 - IP주소 본체와 같은 방법으로 네트워크를 표기하는 방법
- 10.11.12.13 / 24 - 네트워크 번호의 비트수로 넷마스크를 표기하는 방법
- 10.11.12.0 / 24 -서브넷을 나타내는 주소(호스트 번호의 비트가 모두 0)
- 10.11.12.255 / 24 - 서브넷의 브로드캐스트를 나타내는 주소(호스트 번호의 비트가 모두 1)
2. 도메인명과 IP 주소를 구분하여 사용하는 이유
- 기억하기 어려워서
- 인터넷을 통해 데이터가 운반되는 과정에서 도메인은 많은 용량을 차지하기 때문에(길이가 결정되어있지 않은 데이터를 취급하는것도 문제가 됨)
3. Socket 라이브러리가 IP 주소를 찾는 기능을 제공한다
- DNS: 서버명과 IP 주소를 대응시키기 위해 사용된다. Domain Name System
- DNS 리졸버: DNS 서버에 요청하는 클라이언트를 일컫는다.
- Socket 라이브러리에 들어있는 프로그램이다
- 네임 리솔루션: DNS의 원리를 사용하여 IP주소를 조사하는 행위
- Socket 라이브러리: OS에 포함되어 있는 네트워크 기능을 애플리케이션에서 호출할때 사용하는 라이브러리
4. 리졸버를 이용하여 DNS 서버를 조회한다
리졸버를 호출하여 DNS서버에 조회 메시지를 보내고, DNS서버에서 응답이 되돌아 온다. 응답메시지에 포함된 IP주소를 브라우저에게 제공한다.
5. 리졸버 내부의 작동
- 리졸버를 호출하면, 제어가 리졸버로 넘어간다.
- DNS 서버에 문의하기 위한 바이너리 데이터의 메시지를 만든다.
- 메시지를 DNS 서버에 보낸다.(이 동작은 리졸버가 스스로 실행하는 것이 아니고, OS 내부에 포함된 프로토콜 스택을 호출하여 실행을 의뢰한다.) 프로토콜 스택이 제어를 받아 LAN 어댑터를 통해 메시지를 송신한다.
프로토콜 스택: OS 내부에 저장된 네트워크 제어용 소프트웨어. 프로토콜 드라이버, TCP/IP 소프트웨어라고도 칭한다.
- 조회 메시지가 DNS서버에 도착하고, 서버는 답을 찾는다.
- 서버가 클라이언트에게 응답 메시지를 송신한다.
- 프로토콜 스택을 경유하여 리졸버에게 도착한 메시지는 리졸버가 내용을 해독한 후 애플리케이션에 IP주소를 넘겨준다.(애플리케이션이 지정한 지정한 메모리 영역에 IP주소를 저장한다.)
3. 전세계의 DNS 서버가 연대한다
1. DNS 서버의 기본 동작
클라이언트에서 조회 메시지를 받고 조회의 내용에 응답하는 형태로 정보를 회답
- 조회메시지
- 이름: 서버나 메일 배송 목적지
- 클래스: IN(인터넷을 나타내는 값)
- 타입: 어떤 종류의 정보인지
- A: address
- MX: 메일
2. 도메인의 계층
인터넷에는 막대한 수의 서버가 있으므로, 1대의 DNS 서버에 등록하는것은 불가능하다. 다수의 DNS서버에 등록하고, 연대하여 어디에 정보가 등록되어 있는지를 찾아내는 구조이다.
- 도메인명: DNS 서버에 등록한 정보에는 도메인명이라는 계층적 구조를 가진 이름이 붙어있다.
- www.lab.cyber.co.kr - 오른쪽에 위치할수록 상위의 계층이다.
- .으로 구분하여 사용
계층화 된 도메인을 하나의 서버가 일괄적으로 취급한다. 단, 복수의 서버가 도메인 하나의 정보를 중복으로 갖을수도 있음
3. 담당 DNS 서버를 찾아 IP주소를 가져온다
인터넷에서는 DNS서버가 수만대나 있으므로, 효율적으로 찾는 방법이 있어야 한다.
하위의 도메인을 담당하는 DNS서버의 IP주소를 그 상위의 DNS 서버에 등록하는 식으로 반복한다.
루트도메인: com이나 kr의 상위에 있는 도메인으로, 도메인 명이 없으므로 생략한다. 명시적으로 나타내야 할 경우는 .을 붙인다.
루트도메인으로 부터 시작해서 차례차례 조회하면서 내려간다. 원하는 서버가 등록된 DNS서버를 찾았다면, 클라이언트가 해당 DNS서버에 IP주소 조회를 의뢰하는것으로 종료된다.
등록작업의 경우 한가지 단계가 더 있다. 루트 도메인의 DNS서버를 인터넷에 존재하는 DNS서버에 전부 등록하는 것이다. 이를 통해 어느 DNS서버를 통하더라도 루트도메인을 경유하여 도메인의 계층 아래로 찾아가 원하는 DNS 서버를 찾아낼 수 있다.
4. DNS 서버는 캐시 기능으로 빠르게 회답할 수 있다
DNS서버는 한번 조사한 이름을 캐시에 기록할 수 있다. 다만 캐시에 정보를 저장한 뒤 등록 정보가 변경되는 점을 유의해야하며, 조회에 회답할때 정보가 캐시에서 회신된건지 아닌지를 같이 알려준다.
4. 프로토콜 스택에 메시지 송신을 의뢰한다
1. 데이터 송/수신 동작의 개요
IP주소를 알아냈으면, 액세스 대상 웹서버에 디지털 데이터인 HTTP 메시지를 송신하도록 OS 내부에 있는 프로토콜 스택에 의뢰한다.
Socket 라이브러리에 있는 여러 프로그램 부품을 정해진 순서대로 호출하여 송신한다.
데이터를 송/수신하는 컴퓨터 사이에 데이터의 통로같은 것이 있고, 그 사이로 데이터가 흐르면서 통신을 하는것이라고 볼 수 있다. 이 통로의 양 끝단을 “소켓” 이라고 부르는데, 먼저 이 소켓을 만들고 연결하는 과정이 필요한 것이다. 일반적으로 서버측에서 소켓을 마들고 소켓에 클라이언트가 통로(파이프)를 연결하도록 기다린다.
단계
- 소켓을 만든다(소켓 작성 단계)
- 서버측에 소켓에 파이프를 연결한다(접속 단계)
- 데이터를 송-수신한다(송/수신단계)
- 파이프를 분리하고 소켓을 말소한다(연결 끊기 단계)
- 이 장에서는 프로토콜스택에 위의 동작을 의뢰하는것을 설명
- 의뢰 동작은 Socket라이브러리의 프로그램 부품을 호출하여 실행되지만, 단지 의뢰의 중개역일 뿐 실질적인 작업은 프로토콜 스택이 진행한다.
2. 소켓의 작성단계
소켓라이브러리의 socket 프로그램 호출하여 통로(소켓)을 만든다. 소켓이 생기면 디스크립터가 돌아온다.
디스크립터: 소켓을 식별하기 위해 사용. 컴퓨터 내부에서 복수의 데이터 송/수신이 일어날 때 식별하는 번호표같은 것
3. 파이프를 연결하는 접속 단계
만든 소켓을 서버측의 소켓에 접속하도록 프로토콜 스택에 의뢰한다. connect라는 프로그램 부품을 호출하면서 아래의 3가지 값을 지정한다.
- 디스크립터: 소켓을 만들 때 돌아온 디스크립터. 여기서 지정한 디스크립터는 connect가 프로토콜 스택에 통지한다. 프로토콜 스택은 이 디스크립터를 보고 어느 소켓을 서버측의 소켓에 접속할지 판단하여 접속을 실행한다.
- IP 주소: DNS 서버에 조회한 액세스 대상 서버의 IP
- 포트 주소: IP 주소로 지정할 수 있는 것은 네트워크의 어느 컴퓨터인가 까지 하는것인데, 접속 동작은 상대측의 소켓에 대해 이루어지므로 IP주소로는 소켓까지 지정할 수 없다. 따라서 중간 과정이 필요한데 이때 사용되는 것이 포트주소 → 다시말해, 접속 상대측에서 소켓을 식별하기 위해 사용 / 애플리케이션의 종류에 따라 미리 결정된 값을 사용한다(웹은 80번/ 메일은 25번)
4. 메시지를 주고받는 송/수신 단계
소켓이 상대측과 연결되면, 소켓에서 데이터를 쏟아부으면 상대측의 소켓에 데이터가 도착한다.
write 라는 프로그램 부품을 호출한다.
- 애플리케이션은 HTTP의 리퀘스트 메시지(송신 데이터)를 메모리에 준비한다.
- write를 호출하면서 디스크립터와 송신데이터를 지정한다.
- 프로토콜 스택이 송신데이터를 서버에게 송신한다.
- 메시지가 돌아오면 read라는 프로그램 부품을 통해 프로토콜 스택에 수신 동작을 의뢰한다. 이 때 수신한 응답 메시지를 저장하기 위한 메모리 영역(수신 버퍼)을 지정한다.
- 수신버퍼에 메시지를 저장한 시점에서 메시지를 애플리케이션에 건넨다.
5. 연결 끊기 단계에서 송/수신이 종료된다.
브라우저가 데이터 수신을 완료하면 송/수신 동작은 끝난다. 그 후 소켓 라이브러리의 close 라는 프로그램 부픔을 호출하여 연결 끊기 단계로 들어가도록 의뢰한다. 소켓 사이를 연결한 통로가 분리되고 소켓이 말소된다.
(웹의 경우)
- 응답 메시지 송신을 완료했을 때 웹서버 측에서 연결끊기 동작을 실행하므로 먼저 웹 서버측에서 close를 호출하여 연결을 끊는다
- 이것을 클라이언트가 받아 클라이언트의 소켓이 연결 끊기 단계로 들어간다.
- 브라우저가 read로 수신 동작을 의뢰한다면, 수신한 데이터를 건네주는 대신 연결이 끊겼다는 사실을 통지한다. 이로써 송/수신이 종료 되었다는 것을 알았으므로 브라우저에서도 close를 호출하여 연결끊기 단계에 들어간다.
'CS > Network' 카테고리의 다른 글
[Network] 2. TCP/IP의 데이터를 전기 신호로 만들어 보낸다.(전송계층) (0) | 2022.10.17 |
---|