• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

http의 개념(keep-alive, connectless, 응답 헤더, 요청 헤더)

23 Dec 2018

Reading time ~4 minutes

https를 알기 앞서 http를 먼저 설명 고!

HTTP(HyperText Transfer Protocol)란?

HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다.

HTTP와 TCP/IP

TCP/IP는 마치 한계층에 있을 것 같지만 다른 계층에 있다.

IP

일단 IP는 네트워크에서는 2계층 인터넷 계층(Internet Layer), OSI 7계층의 네트워크 계층에 해당한다. 그 계층에서 주로 하는 일은 통신 노드 간의 IP패킷을 전송하는 기능과 라우팅을 하는 것이다. (대표 프로토콜 중 하나가 IP)

TCP

TCP는 3계층 전송 계층(Transport Layer), OSI 7계층의 전송 계층에 해당된다. 그 계층에서는 통신 노드 간의 연결을 제어하고, 오류없이 데이터를 전달 및 수신한다. (대표 프로토콜은 TCP, UDP)

HTTP는 애플리케이션 계층에서 일어나는 프로토콜이며 네트워크의 세부적인 사항은 대중성, 신뢰성 두 가지를 담당하는 TCP/IP가 있는 layer에서 일어난다.
그로인해 아래와 같은 장점을 갖게 된다.

  • 오류 없는 데이터 전송
  • 순서에 맞는 전달(보낸 순서대로 전달)
  • 조각나지 않는 데이터 스트림

Connectless & Stateless

HTTP는 Connectless 방식으로 작동한다. 서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버린다. 기본적으로는 자원 하나에 대해서 하나의 연결을 만든다. 이런 작동방식은 각각 아래의 장점과 단점을 가진다.

  • 장점 : 불특정 다수를 대상으로 하는 서비스에 적합한 방식이다. 수십만명이 웹 서비스를 사용하더라도 접속유지는 최소한으로 할 수 있기 때문에, 더 많은 유저의 요청을 처리할 수 있다.
  • 단점 : 연결을 끊어버리기 때문에, 클라이언트의 이전 상태를 알 수가 없다. 이러한 HTTP의 특징을 stateless라고 하는데, Connectless로 부터 파생되는 특징이라고 할 수 있다. 클라이언트의 이전 상태 정보를 알 수 없게 되면, 웹 서비스를 하는데 당장에 문제가 생긴다. 예컨데, 클라이언트가 과거에 로그인을 성공하더라도 로그 정보를 유지할 수가 없다. HTTP는 cookie를 이용해서 이 문제를 해결하고 있다.

URI

https://joosjuliet.github.io/web_technical_interview/
의 2번 URI vs URL vs URN 을 참고해주세요 :)

요청 헤더에는 가져올 리소스 또는 리소스를 요청하는 클라이언트에 대한 자세한 정보가 포함되어 있습니다. 응답 헤더에는 응답 위치 또는 응답을 제공하는 서버와 같은 응답에 대한 추가 정보가 있습니다.

요청 데이터 포멧

웹 브라우저는 웹 서버에 데이터를 요청하는 “클라이언트 프로그램” 이다. 요청은 서버가 인식할 수 있는 약속된 형식(HTTP 형식)을 따라야 한다. 요청 데이터는 “HEADER”와 “BODY”로 구성된다.

헤더에는 요청과 요청 데이터에 대한 메타정보들이 들어있다.

GET /cgi-bin/http_trace.pl HTTP/1.1\r\n
ACCEPT_ENCODING: gzip,deflate,sdch\r\n
CONNECTION: keep-alive\r\n
ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
ACCEPT_CHARSET: windows-949,utf-8;q=0.7,*;q=0.3\r\n
USER_AGENT: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24\r\n
ACCEPT_LANGUAGE: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4\rn
HOST: www.joinc.co.kr\r\n
\r\n

HTTP 헤더는 라인피드와 캐리지 리턴(/r/n)을 함께 사용한다. HTTP 헤더를 파싱할 때 주의해야 한다.
필수 요소로 요청의 제일 처음에 와야 한다 3개의 필드로 이뤄져 있다.

  • 요청 메서드 : GET, PUT, POST, PUSH, OPTIONS 등의 요청 방식이 온다.
  • 요청 URI : 요청하는 자원의 위치를 명시한다.
  • HTTP 프로토콜 버전 : 웹 브라우저가 사용하는 프로토콜 버전이다.

응답 헤더 포멧

응답 헤더포멧이다.

HTTP/1.1 200 OK
Date: Fri, 08 Jul 2011 00:59:41 GMT
Server: Apache/2.2.4 (Unix) PHP/5.2.0
X-Powered-By: PHP/5.2.0
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Fri, 08 Jul 2011 00:59:41 GMT
Cache-Control: no-store, no-cache, must-revalidate
Content-Length: 102
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
    1. 프로토콜과 응답코드 : 반드시 첫줄에 와야 한다. 3개의 필드로 구성돼 있다.
      • HTTP/1.1 : 응답 프로토콜과 버전
      • 200 : 응답 코드
      • OK : 응답 메시지. Not Found, Internal Server Error 등의 메시지다.
    1. 날짜
    1. 서버 프로그램및 스크립트 정보.
    1. 응답헤더에는 다양한 정보를 추가할 수가 있다. 어떤 정보를 추가할지는 개발자 마음이다.
    1. 컨텐츠의 마지막 수정일
    1. 캐쉬 제어 방식.
    1. 컨텐츠 길이.
    1. Keep Alive기능 설정이다.
    1. Content-Type
      • 응답에 실어 보내는 컨텐츠가 어떤 형태인지를 알려준다. 웹 애플리케이션들은 Content-Type에 따라서 Body의 데이터를 어떻게 읽을지를 결정한다. 따라서 전송 데이터에 맞는 content-type를 명시해야 한다.

Keep Alive

keep alive는 클라이언트측에 연결을 유지하라는 신호를 보내기 위해서 사용한다. 그러면 클라이언트는 최대 timeout에 지정된 시간동안 연결을 유지한다. 이 시간동안 클라이언트는 이미 맺어진 연결로 요청을 계속 보낼 수 있다. keep-alive

HTTP 1.1 부터는 keep-alive 기능을 지원한다. HTTP는 하나의 연결에 하나의 요청을 하는 것을 기준으로 설계가 됐다. 요즘 웹 서비스의 경우 간단한 페이지라고 해도 수십개의 데이터 - 이미지, 문서, css, javascript - 등이 있기 마련인데, HTTP의 원래 규격대로라면 웹페이지를 하나 표시하기 위해서 연결을 맺고 끝는 과정을 수십번을 반복해야 한다. 당연히 비효율적일 수 밖에 없다. 연결을 맺고 끝는 것은 TCP 통신 과정에서 가장 많은 비용이 소비되는 작업이기 때문이다. 예를들어 HTML로 표현된 문서를 다운로드 받는다고 가정해 보자. 이 문서에는 20여개 정도의 이미지, css, javascript 파일이 있다. Keep alive를 지원하지 않을 경우 다음과 같은 과정을 거친다.

  • 웹 서버에 연결한다.
  • HTML 문서를 다운로드 한다.
  • 웹 서버 연결을 끊는다.
  • HTML 문서의 image, css, javascript 링크들을 읽어서 다운로드해야할 경로를 저장한다.
  • 웹 서버에 연결한다.
  • 첫번째 이미지를 다운로드
  • 연결을 끊는다.
  • 웹 서버에 연결한다.
  • 두번째 이미지를 다운로드
  • 연결을 끊는다.

모든 링크를 다운로드 할 때까지 반복한다. Keep-alive 설정을 하면, 지정된 시간동안 연결을 끊지 않고 요청을 계속해서 보낼 수 있다.

  • 웹 서버에 연결한다.
  • HTML 문서를 다운로드 한다.
  • Image, css, javascript 들을 다운로드 한다.
  • 모든 문서를 다운로드 받았다면 연결을 끊는다.

Keep alive 설정

Keep-alive는 HTTP/1.1 부터 사용할 수 있다. 모든 웹서버와 브라우저는 HTTP/1.1을 지원한다고 가정해도 무방하다. 아래와 같은 과정을 거쳐서 keep alive를 설정을 한다. 웹 브라우저는 요청 헤더에 keep-alive 방식의 연결을 할 것을 명시한다. chrom웹 브라우저로 www.joinc.co.kr로의 연결 요청을 캡춰했다.

웹 서버의 설정이 kepp-alive 방식을 지원하도록 설정돼 있다면, 응답 헤더에 keep-alive 정보를 실어 보낸다. www.joinc.co.kr 서버의 응답 헤더의 일부분이다. connection:Keep-Alive : 연결을 keep-alive 상태로 유지한다. Keep-Alive:timeout=5, max=100 : 하나의 연결당 5초동안 유지한다. Keep-alive 연결은 최대 100개까지 허용한다. keep-alive는 하나의 연결로 여러 요청을 처리하기 때문에 효율적이긴 하지만, 연결이 그만큼 길어지기 때문에 동시간대 연결이 늘어난다. 운영체제에 있어서 연결은 “유한한 자원”이다. 연결을 다 써버리면, 서버는 더 이상 연결을 받을 수 없게 된다. Max 값을 이용해서 keep-alive 연결을 제한하는 이유다.


참고자료

http에 대한 설명
https://ko.wikipedia.org/wiki/HTTP
https://junjangsee.github.io/2019/07/29/network/network-01/

keep-alive와 요청 데이터 포멧, 응답 헤더 포멧…. 이정도면 출처이다. https://www.joinc.co.kr/w/Site/Network_Programing/AdvancedComm/HTTP

tcp/ip설명
출처: https://hahahoho5915.tistory.com/15 [넌 잘하고 있어]



computer_sciencenetwork Share Tweet +1