DEV BLOG

[네트워크] HTTP/1.x

|

HTTP

  • Hypertext Transfer Protocol
  • 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜
  • 애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다.


HTTP/1.0 요청과 응답

  • Header + body 로 구성되어있다.
  • 요청과 응답이 plain text로 작성됨
  • Request : 클라이언트가 서버에게 요청을 보낸다
GET / HTTP/1.1
HOST: rmcodestar.github.io
Accpet: text/html, text/plain, */*
Accpet-Encoding: gzip, compress
Accpet-Language: ko-KR
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
\r\n
  • Response 서버가 클라이언트에게 응답한다
HTTP/1.1 200 OK
Server: GitHub.com
Content-Type: text/html; charset=utf-8
Content-Length: 5517
Connection: keep-alive
\r\n
<!DOCTYPE html>
<html lang="ko">....


HTTP methods

메서드는 요청의 종류를 서버에게 알려주기 위해서 사용한다.

GET /index.html HTTP/1.1

요청의 헤더의 첫번째 줄에 적혀있다

  • GET : 정보를 요청
  • POST : 정보를 밀어넣기 위해서 사용한다.
  • PUT : 정보를 업데이트하기 위해서 사용한다.
  • DELETE : 정보를 삭제하기 위해서 사용한다.
  • HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다.
  • OPTIONS : 웹서버가 지원하는 메서드의 종류를 요청한다.
  • TRACE : 클라이언트의 요청을 그대로 반환한다.


HTTP 상태코드

HTTP/1.1 200 OK

응답의 헤더의 첫번째 줄에 적혀있다

  • 1xx : 조건부 응답
  • 2xx : 성공
  • 3xx : 리다이렉션
  • 4xx : 클라이언트의 요청 오류
  • 5xx : 서버 오류


대표적인 응답코드

코드번호 설명 비고
200 성공 서버가 요청을 성공함
302 임시이동 요청한 페이지가 다른 위치로 임시이동 했다. 요청자는 여전히 현재 페이지를 요청해야 한다.
304 수정되지 않음 마지막 요청 이후 요청한 페이지가 수정되지 않았다
400 잘못된 요청 주로 헤더 포멧이 HTTP 규약에 맞지 않을 경우
401 권한 없음  
404 찾을 수 없음 서버가 요청한 페이지(Resource)를 찾을 수 없다.
500 내부 서버 오류 서버에 오류가 발생하여 요청을 수행할 수 없다.



HTTP 버전

HTTP/0.9

  • HTTP 버전 번호 명시 안함

  • HTTP header가 없음 —> HTML 파일만 전송이 가능했음
  • method는 GET이 유일


HTTP/1.0

  • HTTP 버전 정보 명시, (ex: HTTP/1.0)

  • header가 생김

    • Content-type헤더를 통해 다양한 타입의 문서를 전송할 수 있께 됨.
  • 응답시 상태코드를 붙임 —> 브라우저가 요청에 대한 성공과 실패를 알게 됨

  • TCP connection에서 한번에 하나의 요청 만이 가능 (short-lived connection)

HTTP/1.0 한계

  • Host헤더가 필수가 아니었다
  • caching 옵션이 빈약
  • 여러 요청 사이에 연결을 유지하는 기능이 없음


HTTP/1.1

  • Host헤더가 필수가 됨 —> virtual Hosting이 지원
  • request pipelining 지원
  • 지속적인 연결을 해 주는 persistent connection 지원
    • Connection 헤더
  • multiple request 처리 가능
  • 추가적인 캐시 제어 메커니즘이 도입됨
  • methods : GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE. RFC 7231

HTTP 1.1 한계

  • 파이프라이닝은 HOL blocking(Head of line blocking)의 문제가 있음
  • 느리다..
    • 무거운 헤더.. 덕지덕지 붙어 있는 쿠키들..
    • 기본적으로 요청을 보내고 응답을 받아야만 다음 요청을 보낼 수 있기 때문에 요청하는 리소스가 많아질 수록 느릴 수 밖에 없음.



HTTP/1.x의 커넥션 관리

img

HTTP 1.0

  • Short-lived connections
    • 요청이 보내져야 할 때마다 커넥션들은 매번 새롭게 생성되었고 응답이 도착한 이후에 연결을 닫는 형태로 단기로만 유지되었습니다.

HTTP 1.1 : 2가지 모델이 추가됨

  • Persistent connection
    • 영속적인 커넥션 모델은 연속적인 요청 사이에 커넥션을 유지하여 새 커넥션을 여는데 필요한 시간을 줄일 수 있다.
    • Keep-alive헤더로 연결 지속 시간을 설정할 수 있음
    • 단점 : 유휴 상태일때에도 서버 리소스를 소비하며, 과부하 상태에서는 DoS attacks을 당할 수 있음
  • Pipelining
    • 응답조차도 기다리지 않고 연속적인 요청을 보내서 네트워크 지연을 더욱 줄일 수 있다.
    • HOL blocking 문제가 있음


Reference


앞으로 공부할 주제

  • SPDY
  • HTTP/2