IT/Network

[Network] Application Layer (애플리케이션 계층) - 2.2 웹 애플리케이션 정리

wookiist 2018. 1. 6. 15:28

2.2 The Web and HTTP


웹이 사용자들에게 주는 가장 큰 호감은 On-demand 방식으로 동작하는 점이다.

2.2.1 Overview of HTTP

HyperText Transfer Protocol (HTTP) 는 웹 애플리케이션 계층 프로토콜이며, 웹의 중심이다. ([RFC 1945], [RFC 2616] 참조)
HTTP는 'Client Program'과 'Server Program' 두 가지로 구현된다.
서로 다른 End System에서 수행되는 두 프로그램은 HTTP Messages 를 교환하여 통신한다.
HTTP는 메시지의 구조, 클라이언트와 서버가 메시지를 교환하는 방법을 정의한다.

 Web page (aka document) 는 object(객체)들로 구성된다.

○ Object는 하나의 URL로 지정할 수 있는 HTML, JPEG, Java applet, video clip과 같은 파일이다.
○ 기본 HTML 파일은 내부의 다른 Object(객체)들을 그 객체의 URL로 참조한다.
○ URL은 "Object를 포함하는 서버의 Hostname"과 "그 Object의 경로". 두 가지 요소로 구성된다.

§ 예를 들어, "http://www.someSchool.edu/someDepartment/picture.gif" 라는 URL이 있다면, "www.someSchool.edu"는 Hostname이고 "/someDepartment/picture.git"는 객체의 경로이다.

 Web browser (Chrome, Safari, Edge ...) 는 'HTTP의 클라이언트 측'을 구현한다.
 Web server (Apache, nginx ...) 는 'HTTP의 서버 측'을 구현한다.
 HTTP 는 웹 클라이언트(브라우저)가 웹 서버에게 웹 페이지를 어떻게 요청하는지와 웹 서버가 웹 클라이언트로 어떻게 웹 페이지를 전송하는지를 정의한다.

○ Web browser는 웹 페이지 내부의 객체에 대한 HTTP Request Message를 Web server에 보낸다.
○ Web server는 Request를 수신하고, 객체를 포함하는 HTTP Reponse Message를 Web browser에 보낸다.

• HTTP는 TCP 를 트랜스포트 프로토콜로 사용한다.

  1. HTTP Client는 Server에 TCP 연결을 시작한다.
  2. 연결이 이루어지면, Client와 Server processes는 "소켓 인터페이스"를 통해 TCP에 접속한다.
  3. Client는 HTTP Request Message를 "소켓 인터페이스"로 보내고, "소켓 인터페이스"로부터 HTTP Response Message를 받는다.
  4. Server는 "소켓 인터페이스"로부터 HTTP Request Message를 받고, HTTP Response Message를 "소켓 인터페이스"로 보낸다.
○ 일단 클라이언트가 메시지를 "소켓 인터페이스"로 보내면, 메시지는 '클라이언트의 손을 떠난' 것이고, 'TCP의 손'에 쥐어진 것이다.

 즉, HTTP는 데이터의 손실, 또는 TCP가 어떻게 손실된 데이터를 복구하고, 네트워크 내부에서 올바른 순서로 배열하는지 걱정할 필요가 없다. 이는 TCP와 Protocol Stack의 하위 계층들이 하는 일이다.
• HTTP Server가 HTTP Client에 요청받은 파일을 전송할 때, 그 어떤 Client의 상태 정보(State Information)도 저장하지 않는 것에 주목할 필요가 있다. 이는 HTTP가 Stateless Protocol(비상태 프로토콜) 임을 알려준다.

2.2.2 Non-Persistent and Persistent Connections

HTTP with Non-Persistent Connections

비지속 연결 HTTP에서는 각 TCP 연결이 "하나의 Request Message"  "하나의 Response Message" 만 전달하게된다.
예를 들어, 11개의 Objects가 전송되어야 한다면, 총 11개의 TCP 연결이 만들어진다.

Web browser는 Default 모드에서 5 ~ 10개의 Parallel TCP 연결을 생성하고, 각 TCP 연결은 하나의 Request / Response 쌍만을 담당한다. Parallel TCP 모드를 사용하면, 응답 시간을 줄일 수 있다.

RTT(round-trip time)  Packet-propagation delays, Packet-queuing delays(switch, router), packet-processing delays 를 포함한다.

사용자가 어떤 하이퍼링크를 하나 클릭할 경우 일어나는 일을 생각해보자.

브라우저(클라이언트)가 웹 서버와의 TCP 연결을 시도한다. 이 시도는 아래의 "three-way handshake" 를 포함한다.

1) 클라이언트가 작은 TCP 메시지를 서버로 보낸다. (0.5 RTT)
2) 서버는 작은 메시지로 클라이언트에 응답한다. (0.5 RTT)
3) 마지막으로 클라이언트가 다시 서버에게 응답한다. (이 응답에는 handshake의 응답과 함께 HTTP Request Message를 함께 실어 보낸다.) (0.5 RTT)
이 "three-way handshake" 중 처음 두 부분이 지나면, 첫 RTT가 계산된다.
4) HTTP Request Message가 서버에 도착하면, 서버는 HTML 파일을 TCP 연결로 보낸다. (0.5 RTT)
5) 해당 파일들을 모두 보내는 데 걸리는 시간 (HTML 파일 전송 시간)

따라서, 하이퍼링크 하나를 클릭할 경우 걸리는 총 RTT는 약 2 RTT + (HTML 파일 전송 시간) 이 될 것이다.

HTTP with Persistent Connections

비지속 연결에는 몇 가지 단점이 있다.

1) Requested Object에 대한 새로운 연결이 설정되고 유지되어야 한다.
    ○ 이는 TCP 버퍼가 할당되어야 하고, TCP 변수들이 클라이언트와 서버 양쪽에 유지되어야 함을 의미한다.
    ○ 이렇게 되면, 수많은 다른 클라이언트의 요청을 동시에 받는 웹 서버에게 심각한 부담을 줄 수 있다.
2) 각 객체가 2RTT를 필요로 한다. - TCP 연결 설정을 위한 1RTT + 객체를 요청하고 받는 데 1RTT

지속 연결에서 서버는 Response를 보낸 후에도 TCP 연결을 그대로 유지한다. 즉, 앞선 예제처럼 11개의 Objects가 전송되어야 한다면, 이를 하나의 Persistent TCP 연결을 통하여 보낼 수 있다.

일반적인 경우, 일정 시간동안 사용되지 않으면 HTTP 서버는 해당 연결을 닫는다.

2.2.3 HTTP Message Format

HTTP Request Message

아래의 메시지는 대표적인 HTTP Request Message의 예이다.

GET /somedir/page.html HTTP/1.1
Host: www.someschoool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

메시지를 분석하면 다음과 같은 정보를 얻을 수 있다.
1) 메시지가 일반 ASCII 텍스트로 쓰여 있어 사람들이 읽을 수 있다.
2) 메시지가 다섯 줄로 되어 있고, 각 줄은 CR과 LF(carriage return & line feed)로 구별된다. (마지막 줄에는 한 번 더 CR / LF가 추가된다.)

HTTP Request Message의 첫 번째 줄은 Request line 이라고 부른다.
HTTP Request Message의 나머지 줄은 Header line 이라고 부른다.

• Request line은 3개의 필드를 갖는다.
    ○ Method field
        § GET / POST / HEAD / PUT / DELETE
        § 특히 GET Method를 많이 이용하며, 브라우저가 URL Field로 식별되는 객체를 요청할 때 사용된다.
    ○ URL Field
        § 여기서는 /somedir/page.html
    ○ HTTP Version Field
        § 여기서는 HTTP/1.1
        § 해당 브라우저가 HTTP/1.1 버전을 사용하고 있음을 알 수 있다.

• Header line
    ○ Host
        § Host: www.someschool.edu 는 객체가 존재하는 호스틀 명시하고 있다.
        § 이 라인이 필요한 이유는, 웹 프록시 캐시가 요구하기 때문이며 이는 뒤에서 다루도록 한다.
    ○ Connection
        § Connection: close 인 경우, 브라우저는 서버에게 Persistent Connection을 사용하지 않기를 원함을 밝힌다.
    ○ User-agent
        § User-agent: Mozilla/5.0 은 서버에게 요청을 준 브라우저의 종류를 의미한다. 여기서는 파이어폭스 5.0 버전을 명시하고 있다.
    ○ Accept-language
        § Accept-language: fr 을 명시함으로써, 웹 브라우저가 원하는 언어는 프랑스어이며, 해당 서버에 프랑스어로 이루어진 객체가 존재하는 경우 이를 전송하게 된다. 없는 경우 기본 페이지를 전송한다.

• Header line 아래에는 CR / LF 줄 (Blank line)이 있고, 그 밑에 Entity body가 존재한다.
    ○ Entity body는 GET 방식이 아닌 POST 방식에서 이용한다.
        § POST는 특정 폼에 사용자가 입력한 내용을 웹 서버로 전달할 때, Entity body에 담아서 전달한다.
        § 다만, HTML 폼은 흔히, GET 방식을 이용하는데, 이런 경우 Request line의 URL Field에 그 내용을 연결하여 전달한다.
        § 예를 들자면, monkeys와 bananas를 입력하였다면 URL Field에는 www.somesite.com/animalsearch?monkeys&bananas 라는 형태로 확장된 URL이 담길 것이다.
    ○ HEAD 방식은 GET 방식과 유사하다. 다만, HEAD 방식의 Request Message를 받은 서버는 HTTP Response Message로 응답은 하지만, 요청한 객체에 대해서는 전송하지 않는다. 따라서 개발자들이 디버깅을 하는 경우에 사용한다.
    ○ PUT 방식은 웹 서버에 객체를 업로드할 필요가 있는 경우 사용한다.
    ○ DELETE 방식은 사용자 또는 애플리케이션이 웹 서버에 있는 객체를 지우는 것을 허용한다.

HTTP Response Message

아래의 메시지는 HTTP Response Message의 대표적인 예이다.

HTTP/1.1 200 OK
Connection: close
Date: Sat, 06 Jan 2018 14:57:43 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html

(data data data data data ....)

HTTP Response Message는 크게 3개의 섹션으로 이루어져있다.
첫 번째 줄을 status line 이라 한다.
두 번째 줄부터 일곱 번째 줄까지를 header lines 라 한다.
마지막 (data ...) 줄을 entity body 라 한다.

• Status line
    ○ 3개의 field로 구성된다.
    ○ Protocol Version field
        § 이 필드는 서버가 HTTP/1.1 버전을 사용하고 있음을 알린다.
    ○ Status Code field
        § 이 필드는 모든 것이 정상적임을 의미하는 code number 200
            □ 200 OK : 요청이 성공적이며, 정보가 Response로 보내졌다.
            □ 301 Moved Permanently: 요청된 객체가 영원히 이동되었으며, 새로운 URL은 Reponse Message의 Location: 헤더에 위치한다.
            □ 400 Bad Request: 서버가 요청을 이해할 수 없다는 일반적인 오류 코드이다.
            □ 404 Not Found: 요청한 문서가 서버 내에 존재하지 않는다는 코드이다.
            □ 505 HTTP Version Not Supported: Request HTTP Protocol Version을 서버가 지원하지 않는다.
    ○ Phrase field
        § 이 필드는 그 200의 문장인 OK 를 의미한다.

• Header lines
    ○ Connection
        § Connection: close 로 클라이언트에게 메시지를 보낸 후 TCP 연결을 닫을 것임을 의미한다.
    ○ Date
        § HTTP Response가 서버에 의해 생성되고 보낸 날짜와 시간을 나타낸다. 객체가 생성되거나 수정된 시간이 아님에 유의한다.
    ○ Server
        § 메시지가 Apache 웹 서버에 의해 생성되었음을 나타낸다.
    ○ Last-Modifed
        § 객체가 생성되거나 마지막으로 수정된 시간과 날짜를 나타낸다.
    ○ Content-Length
        § 보내지는 객체의 Byte 수를 나타낸다.
    ○ Content-Type
        § 여기서는 Entity Body의 객체가 HTML 텍스트임을 나타낸다.


반응형