업데이트:

태그: , , ,

카테고리:

HTTP

  • HyperText Transfer Protocol는 웹의 응용계층 프로토콜이며, 웹의 핵심이다.
  • RFC1945, RFC2616에 정의되어있다.
  • 웹에서 브라우저와 웹서버에 구현되어있다.
  • 브라우저와 서버는 HTTP message를 교환해 통신한다.
  • HTTP는 message의 구조와 client와 server가 어떻게 이 message를 어떻게 교환하는지에 대해 정의한다.


Web용어

웹페이지와 객체

  • Web page : document라고도 불리는데, 이는 객체(object)로 구성된다.
  • object : HTML 파일, JPEG 이미지, Java applet, 비디오 클립 등 단일 URL에 주소로 표현 가능한것들을 의미.
    • 대부분의 웹페이지는 base HTML file꽈 참조하는 객체들로 이루어져있다.
    • 만약, 웹페이지가 1개의 HTML text(base HTML file)와 5개의 JPEG 이미지를 가지고있다면, 해당 웹페이지는 6개의 객체를 가지고 있는 것이다.
    • base HTML 파일은 다른 객체를 주소를 통해 참조한다.
    • 따라서, URL은 1. server의 hostname2. 객체의 경로를 가지게된다.
    • 가령, http://info.cern.ch/picture.jpeg이라는 주소가 있다면, http://info.cern.ch/은 hostname, /picture.jpeg은 객체의 경로이다.
  • Web browser : client측의 HTTP를 구현한다.
  • Web server : URL로 주소화가 가능한 객체를 담는 서버측의 HTTP를 구현한다.



HTTP

  • 스크린샷 2022-08-31 오전 12 52 30
    • 사용자가 HTTP request Message를 보내면, 서버가 HTTP response message를 보낸다.
    • 예를들어, 사용자가 하이퍼링크를 누르면, 해당 페이지의 객체에 대한 HTTP request message를 서버에 보내게되고, 그 message를 받은 서버는 해당 객체를 담은 HTTP response message를 보내게된다.
  • 소켓 인터페이스를 통해 보내진 데이터들은 client의 손에서 벗어나게된다.
    • 계층적 아키텍처 하에서 HTTP입장에서는 TCP를 사용하기에 receiver에게 전달된다는 것이 보장된다는 것을 알기에, TCP가 패킷손실을 어떻게 복구하고, 순서를 어떻게 재조정하는지에 대해서는 알 필요가 없다.


stateless protocol

  • HTTP는 stateless protocol이라고도 불린다.
  • 서버가 클라이언트의 상태를 가지고있지 않는다는 것을 의미한다.
  • 만약 서버가 클라이언트의 상태를 가지고있다고한다면,
    • 서버나, 클라이언트가 crash됐을때, 이전 상태에 대한 정보는 일관성이 없어진다.
    • 또한, 수백만 브라우저를 감당하는 서버가 각 브라우저의 상태를 가지고 있는 건 부하가 심할 것이다.


Non-persistent and persistent HTTP

  • HTTP request, response 쌍마다 TCP 연결을 다시 해줘야할까?
  • Non-persistent connection은 HTTP 쌍마다 연결을 해주고,
  • persistent connection은 서버가 HTTP response를 보낸 후에 연결을 열어둔다.

Non-persistent HTTP

스크린샷 2022-08-31 오전 1 41 51

스크린샷 2022-08-31 오전 2 16 54

  • 만약 10개의 객체를 요청한다고 생각해보자
    1. 클라이언트가 80포트로 서버에 TCP 연결을 시도한다.
    2. 서버는 80번포트에서 TCP연결을 대기하고있다가, 클라이언트의 TCP연결을 허용하고 알린다.
    3. 클라이언트는 이제 HTTP request message를 TCP connection socket에 보낸다.
    4. 서버는 HTTP request message를 TCP소켓으로부터 받고, 요청받은 객체를 HTTP response message에 캡슐화해 보낸다.
    5. 서버가 TCP에게 연결을 종료해도 된다고 알린다. 다만, TCP는 여기서 바로 연결을 끊는게 아닌, 클라이언트가 response message를 받았는지 확인하고 종료한다.
    6. 클라이언트는 받은 HTTP response message에서 파일을 추출하고, HTML파일을 분석하고, 10개의 객체를 참조하고 있다는것을 알아낸다.


위 과정이 10개의 객체에 대해 반복되어 이뤄진다.
최초에 연결한 TCP connection이 유지되지 않기에, 유저가 10개의 객체를 참조하는 웹페이지를 요청하면 총 11번의 TCP connection이 만들어진다.


non-persistent RTT

  • RTT(Round-Trip-Time)
    • 패킷 하나가 클라이언트로부터 보내져서 서버에서 다시 클라이언트에 도달하기까지 걸리는 시간
    • 패킷 전송 지연 + 라우터와 스위치에서의 패킷 큐 딜레이 + 패킷 처리 지연을 포함


  • three-way Handshake
    • TCP는 전송계층에서 다룰거긴한데, HTTP 요청, 응답에 걸리는 시간을 이해하기위해선 three-way handshake에 대해서 이해할 필요가 있다.
      1. 클라이언트에서 TCP연결을 위해 서버에 [SYN]패킷을 전송한다.
      2. 서버는 이에대한 응답으로 [ACK]패킷을 전송한다.
      3. 클라이언트는 다시 [ACK]패킷을 전송한다.
    • Request를 요청하기 전에 TCP 연결을 초기화하는 시간에 1 RTT가 들게된다.
      1. 이제 클라이언트는 HTTP request를 요청하게되는데, 서버는 이 패킷을 받으면 연결된 TCP를 통해 요청한 데이터를 HTTP response로 전달한다.
    • HTTP request, response가 왔다갔다하는 시간에 1 RTT를 더 소요하게되며, 전송해야하는 파일의 크기에따라 transmission time이 더해지게된다.
    • 총 시간은 : 2 RTT + file transmission time

스크린샷 2022-09-01 오후 3 07 55


non-persistent의 단점

  • TCP 연결마다 2 RTT를 필요로하기에 OS에 오버헤드가 발생한다.
  • 참조 객체를 패치할때마다 브라우저는 TCP연결을 해야하고, 전송하는동안 연결을 유지해야한다.

이런 단점이 있기에, HTTP 1.1은 persistent connection을 사용한다.


Persistent-HTTP(HTTP 1.1)

  • 서버가 HTTP response를 보낸 후에도 연결을 끊지않음.
  • 연속적인 HTTP request, response 메세지가 열려있는 TCP 연결을 통해 보내진다.
  • 클라이언트는 참조 객체에 대해서 연속적인 request를 전달
  • HTTP서버는 TCP연결이 특정시간동안 사용되지 않을때 연결을 종료한다.



HTTP 패킷

  • 사람이 읽을 수 있는 형태로 패킷을 전송한다.(ASCII형태)

HTTP request message 형식

  • 스크린샷 2022-09-01 오후 7 28 14

    스크린샷 2022-08-30 오후 12 24 07

  • HTTP request message의 특징으로는 다양한 method를 요청할 수 있다는 것이다.

  1. GET : request-URI를 통해 데이터를 전송한다.
    • request-URI는 URL-query string으로 끝날 수 있는 절대경로의 URL을 의미한다.
    • 헤더필드에 IF-None-Match등이 있다면 conditional GET으로 변경된다.
    • 일반적으로 서버로부터 데이터를 받아올때 사용한다.
  2. HEAD : GET method와 동일하나, 서버의 응답에 메세지 본문이 들어있지않고, 헤더정보만 들어있다.

  3. POST : 서버에 데이터를 전송한다.
    • form data, 파일 업로드에 주로 사용된다.
    • form data의 키-밸류 값으로 패킷의 body에 포함해 전송하게된다.
    • 멱등성을 가지고 있지 않다.
    • 동일한 데이터로 POST를 여러번 요청하면 여러개의 데이터가 생성된다.
    • 일반적으로 새로운 데이터를 생성할때 사용한다.
  4. PUT : POST와 마찬가지로 서버에 데이터를 전송한다.
    • POST와 차이점은 멱등성(indemponent)이다.
    • 멱등성을 가지고있기에, 동일한 내용으로 여러번 PUT요청을 보내면 내용을 업데이트하지 않는다.
    • 데이터를 업데이트할때 주로 사용된다.
  5. DELETE : 지정한 리소스의 삭제를 요청한다.


HTTP response message 형식

  • 스크린샷 2022-08-30 오후 4 03 11

스크린샷 2022-09-01 오후 7 30 56

  • HTTP response status code
    • 클라이언트가 요청한 HTTP request의 상태에 대한 정보를 전송한다.

info.cern.ch 접속해보기

  • 웹 페이지에서 하이퍼링크를 타고 다른 페이지로 이동했을때

스크린샷 2022-08-31 오전 2 02 26

  • TCP 연결을 다시 하는게 아닌, 하이퍼링크에 대한 HTTP request를 바로 날리는 것을 볼 수 있다.

  • TCP를 통해 관련 데이터를 segment로 전송하며, 요청한 데이터의 마지막에는 TCP를 사용한 HTTP response를 통해 TCP segment에는 보내야하는 데이터의 나머지 부분과 HTTP 요청이 완료됐다는 정보도 함께 보낸다.

스크린샷 2022-08-31 오전 2 25 20

  • HTTP response 패킷을 보면, 이전에 받았던 TCP segment들을 reassemble을 하고있는 것을 볼 수 있다.



댓글남기기