kimyu0218
  • [네트워크/KOCW] Chap2. Application Layer
    2024년 05월 31일 16시 56분 04초에 업로드 된 글입니다.
    작성자: @kimyu0218

    네트워크 어플리케이션은 서로 다른 end system에서 실행되는 프로세스들이 네트워크를 통해 서로 통신하는 것을 의미한다. 웹 어플리케이션과 P2P 파일 공유 시스템이 대표적인 예다.
     
    웹 어플리케이션은 클라이언트-서버 구조를 기반으로 한다. 서버는 on 상태를 유지하여 다수의 클라이언트가 보낸 요청을 처리한다. 클라이언트는 고정되고 잘 알려진 서버의 IP주소로 packet을 전송한다.
     
    P2P (= peer-to-peer) 구조는 서버를 거치지 않고 peer끼리 직접 통신하는 방식이다. 중앙 서버에 의존하지 않기 때문에 서버의 영향을 받지 않으며, 사용자가 많아질 수록 네트워크의 성능이 높아진다는 장점이 있다. (P2P 파일 공유 시스템은 자신의 리소스를 네트워크에 제공하는 동시에 다른 노드의 리소스도 이용할 수 있다!) 하지만 peer 간의 커넥션 품질이 일정하지 않아 전송 속도가 불안정하며, 보안 문제가 발생할 수 있다.

    socket

    서로 다른 end system 상의 프로세스는 어떻게 통신할까? 같은 end system 내의 프로세스들은 IPC를 통해 통신한다. 반면, 다른 호스트에서 동작하는 프로세스들은 반드시 네트워크를 거쳐야만 한다. 소켓은 바로 이런 네트워크 상의 프로세스들이 메시지를 주고 받을 수 있도록 해주는 소프트웨어 인터페이스다.
     
    소켓은 어플리케이션 계층과 전송 계층 사이에 위치한 인터페이스다. 따라서 어플리케이션은 전송 계층에서 제공하는 서비스를 활용할 수 있다. 전송 계층에는 다양한 프로토콜이 존재하므로, 어플리케이션은 이 중에서 하나를 선택하여 사용할 수 있다. (ex. TCP, UDP)
     
    송신자가 전송한 packet이 목적지에 도달하기 위해서는 목적지의 IP 주소를 정확히 알고 있어야 한다. 또한, 목적지의 포트 번호도 필요하다. 즉, 호스트가 여러 개의 네트워크 어플리케이션을 동시에 실행할 수 있기 때문에, 어떤 문(socket)을 통과해야 하는지 명시해야 한다.


    HTTP; HyperText Transfer Protocol

    웹의 3요소 = HTTP + HTML + URL

    HTTP는 어플리케이션 계층의 프로토콜이다. HTTP는 클라이언트와 서버, 두 개의 프로그램으로 구현되는데, 서로 다른 end system에서 실행되는 이 프로그램들은 HTTP 메시지를 교환하며 통신한다. HTTP는 메시지의 구조와 메시지를 주고 받는 방식을 정의하고 있다.
     
    대부분의 웹 페이지는 HTML 파일로 이루어져 있으며, 이 파일들은 이미지와 같은 객체를 참조할 때 객체의 URL을 사용한다. URL은 서버의 호스트명과 객체의 경로명, 두 부분으로 구성되어 있다.

    http://server-hostname/object-path-name

    앞서 언급했듯이, HTTP는 클라이언트가 서버에 웹 페이지를 요청하고 서버가 클라이언트에 웹 페이지를 전달하는 방식을 정의한다. 사용자가 특정 객체를 요청하면, 브라우저는 서버에  HTTP 요청 메시지를 보낸다. 서버는 요청을 받아 HTTP 응답 메시지에 요청받은 객체를 담아 전달한다.
     
    HTTP 서버는 클라이언트의 상태 정보를 저장하지 않는다는 특징이 있다. 즉, 이전에 한 행위를 완전히 잊어버린다. 서버가 클라이언트의 정보를 유지하지 않으므로 stateless protocol이라고 부른다.

    HTTP는 TCP 전송 프로토콜 위에서 동작한다. 따라서 클라이언트는 메시지를 주고 받기 전에 서버와 TCP 커넥션을 맺어야 한다. 커넥션이 수립되면 프로세스는 소켓 인터페이스를 통해 TCP에 접근할 수 있다.
     

    non-persistent vs. persistent

    일반적으로 클라이언트와 서버는 일정 시간동안 여러 메시지를 주고 받는다. 이때, 요청-응답마다 별도의 커넥션  (non-persistent) 을 사용해야 할까 , 같은 커넥션 (persistent) 을 사용해야 할까? 기본적으로 persistent 방식을 사용하지만 (HTTP/1.1), 방법마다 장단점이 존재하기 때문에 상황에 따라 적절한 방식을 선택하여 사용해야 한다.

    💡 HTTP는 매번 커넥션을 종료하는데, HTTP/1.1부터 `Keep-Alive`를 지원하여 커넥션을 일정 시간 유지할 수 있다.

     
    non-persistent 방식은 각 요청-응답마다 별도의 TCP 커넥션을 사용한다. 예를 들어 웹 페이지에 이미지를 참조하는 5개의 URL이 존재한다면, 웹 페이지를 포함하여 총 6개의 커넥션을 사용하게 된다. 즉, 각 커넥션은 하나의 객체만을 전송할 수 있다. 이 방식은 구현이 단순하다는 장점이 있지만, 각 요청마다 커넥션을 새로 생성하고 종료해야 하므로 오버헤드가 발생한다.
     
    반면, persistent 방식은 하나의 TCP 커넥션을 통해 여러 요청과 응답을 처리할 수 있다. 이는 커넥션의 생성과 종료에 따른 오버헤드를 줄인다. HTTP 서버는 일정 시간동안 커넥션이 사용되지 않으면 이를 종료한다. 이는 커넥션을 유지하는 동안 자원을 낭비한다는 단점이 있지만, 여러 요청과 응답을 빠르게 처리할 수 있다는 장점이 있다.

    non-persistent persistent
    각 요청마다 별도의 커넥션 사용 하나의 커넥션으로 여러 요청 및 응답 처리 가능
    오버헤드 높음 오버헤드 낮음
    커넥션 생성 및 종료로 인한 지연 발생 커넥션 재사용으로 빠른 응답 가능
    HTTP/1.0 HTTP/1.1

     

    HTTP message

    HTTP 메시지에는 요청 메시지, 응답 메시지 두 종류가 있다.

    HTTP 요청 메시지는 클라이언트가 서버에 정보를 요청할 때 사용되는 메시지다. 4개의 영역으로 이루어지며, 각 줄의 끝에는 캐리지 리턴`CR`이 온다.

    • request line : HTTP 메소드, URL, HTTP 버전 정보를 포함한다.
    • header lines : 요청에 대한 추가적인 정보를 제공한다.
    • empty line : 헤더와 본문을 구분하는 데 사용된다.
    • message body : POST나 PUT 등의 메소드를 사용할 경우, 이 부분에 데이터를 포함한다.

    HTTP 응답 메시지는 서버가 클라이언트의 요청에 응답할 때 사용하는 메시지다.

    • status line : HTTP 버전, 응답 상태 코드와 이에 대한 짧은 설명을 포함한다.  
    • header lines : 응답에 대한 추가적인 정보를 제공한다.
    • empty line : 헤더와 본문을 구분한다.
    • message body : 서버가 클라이언트에게 전달하고자 하는 데이터를 포함한다.

    DNS; Domain Name System

    웹 브라우저에 URL을 입력하면 어떤 일이 일어날까? HTTP 통신을 시작하기 전에 TCP 커넥션이 수립되어야 한다. 그러나 그보다 앞서 수행되어야 하는 일이 있다.

     

    목적지를 식별하기 위해서는 IP 주소가 필요한데, 숫자로 구성된 이 주소는 사람이 기억하기 어렵다. 그래서 우리는 IP 주소에 hostname이라는 별칭을 붙이게 된다. 웹 사이트에 접속하기 위해서는 hostname을 라우터가 이해할 수 있는 IP 주소로 변환해야 한다. 이 작업을 담당하는 것이 바로 DNS다.

     

    DNS 동작 방식

    DNS의 풀네임은 domain name system으로, 계층화된 DNS 서버들이 분산된 데이터베이스 형태로 존재한다.

    DNS는 왜 계층적으로 구성되어 있으며, 왜 분산되어 있는 것일까? 만약 DNS가 단일 서버 및 데이터베이스로 구성되어 있다면, 인터넷에는 수많은 웹사이트가 있기 때문에 엄청난 트래픽으로 인해 서비스가 마비될 것이다. DNS 정보가 전 세계에 분산되어 있기 때문에, 어느 한 지점에서 문제가 발생하더라도 DNS 서비스는 중단 없이 계속 동작할 수 있다. (안정성과 가용성 보장!)

     

    DNS는 3개의 주요 계층으로 이루어진다.

    1. root DNS server : DNS 계층의 최상위에 위치하며, 전 세계에 13개 존재한다.
    2. TLD (= top-level domain) server : `.com` , `.org` 같은 최상위 도메인에 대한 정보를 관리한다.
    3. authoritative DNS server : 특정 도메인에 대한 IP 주소를 제공한다.

     

    그렇다면 IP 주소 검색 시 바로 루트 DNS 서버로 질의를 보내는 걸까? 지금부터 DNS 조회 과정을 살펴보자.

    1. local DNS cache
    2. hosts file : 도메인명을 IP 주소로 매핑하는 파일  (ex. `127.0.0.1 localhost`)
    3. local DNS server : 일반적으로 ISP에 의해 운영
    4. DNS 3계층

     

    DNS 레코드

    DNS 레코드는 도메인 이름을 IP 주소로 매핑하는 데 사용되는 데이터다. 주요 레코드 유형에는 A, NS, CNAME 등이 있다.

    • A (address) : 도메인 이름을 IPv4 주소로 매핑한다. `(dns.edu, 2.2.2.2, A)`
    • NS (name server) : 도메인을 관리하는 DNS 서버 정보를 제공한다.
      • `(edu, dns.edu, NS)` : `edu`의 DNS 관리는 `dns.edu`에 의해 이루어진다.
    • CNAME (canonical name) : 하나의 도메인을 다른 도메인 이름으로 매핑한다. (별칭)
    댓글