Skip to content

Latest commit

 

History

History
168 lines (150 loc) · 6.82 KB

이소민.md

File metadata and controls

168 lines (150 loc) · 6.82 KB

HTTP

HTTP 0.9

  • HTML 문서를 요청해서 이를 가져오는 단순한 형태의 초기 프로토콜
  • 단일 라인 요청에 경로 제시 및 GET 메서드로써 문서를 가져오고 연결을 끊는 것이 전부
  • 요청에 데이터(body)를 포함하지 않음
  • 서버에 연결되면 프로토콜, 서버 및 포트가 필요하지 않으므로 전체 URL은 포함되지 않았음
  • 상태 혹은 오류 코드도 없음

HTTP 1.0

  • 메세지 포맷 규격화
  • HTTP 헤더 (요청, 응답 모두에서 사용 / 헤더와 바디를 빈 줄로 분리)
  • HTTP 메서드
  • HTTP 응답 코드
  • Content-Type을 통해 HTML 파일들 외 다양한 파일 전송 가능
  • redirect, 비지속 연결(non-persistent)

요청

GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

응답

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
  <IMG SRC="/myimage.gif">
</HTML>

두번째 연결에 의한 이미지를 내려받기 위한 요청

GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

응답

200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(image content)

HTTP 1.1

  • 1.0에서 기능 향상
  • HTTP 요청 헤더 내 Host 필드를 필수 항목으로 함
    • 요청하는 호스트에 대한 호스트명 및 포트번호 필수
    • HTTP 1.1 명시해두고 Host 필드 생략하면 웹서버는 400 Bad Request 응답
    • 이 Host 필드에 의해 가변성을 부여함으로써 동일 IP주소를 갖는 단일 서버에 여러 사이트를 구축 가능
  • HTTP 요청 헤더 내 Accept 필드에 의한 컨텐츠 협상
    • 클라이언트 자신이 원하는 미디어 타입 및 우선순위
  • HTTP 메소드 추가 및 조정 (OPTIONS,CONNECT,TRACE 추가 / PUT, DELETE 필수)
  • 잘 정의된 캐시 컨트롤 (ETag, Cache-Control)
  • 블록 단위 인코딩 전송
  • 병렬 커넥션 : TCP 커넥션을 통한 동시 HTTP 처리, 요청 파이프라인을 통한 병렬 커넥션 처리도 가능
  • 지속 커넥션을 통해 커넥션 재사용, 기존 TCP 연결을 끊지 않음으로써 재연결에 따른 TCP 느린 시작에 의한 지연 방지
  • SSL/TLS에 의한 암호화 통신 지원

HTTP 2.0

  • SPDY 기반 (응답성 증가를 정의하고 중복 데이터 전송 문제를 해결)
  • 텍스트 프로토콜이 아닌 이진 프로토콜로 데이터 교환
  • 멀티 플렉싱 : 단일 TCP 연결에 다수의 스트림을 통해 다중 전송 처리
  • HPACK : HTTP 메세지 내 HTTP 헤더 압축 가능, 전송된 데이터의 중복과 오버헤드 제거
  • 서버 푸시 : 클라이언트 캐시에 데이터를 저장하여 다음 요청 전에도 필요한 컨텐츠 전송 가능

HTTP 3.0

  • 2.0의 업그레이드 버전
  • QUIC(Quick UDP Internet Connection) 기반
    • UDP 상에 구현된 실험적인 다중 전송 프로토콜
    • TCP 및 웹 어플리케이션 전송을 개선하기 위해 Google에서 실험적으로 개발
    • TCP는 많은 운영 체제 커널에 내장되어 있기 때문에 변경사항을 실험하고 수정을 구현하는 것에 시간이 많이 듦
    • QUIC을 만들어 개발자는 더 빠르게 실험할 수 있고, 새로운 것을 시도할 수 있음.
    • QUIC은 HTTP/2의 의미론적 지원을 위해 설계됨. 멀티플랙싱, 흐름 제어, 보안 및 혼잡 제어를 제공.
    • 주요 기능
      • 연결 설정 시간 단축
      • 혼잡 제어 개선
      • Head of Line Blocking 없는 멀티플렉싱
      • 전달 오류 수정
      • 연결 마이그레이션
  • UDP, TLS 1.3을 이용해 성능 향상



요청 헤더 항목

  • Host
  • From
  • Cookie
  • Referer
  • User-Agent
  • Accept <-> 엔터티 헤더 항목 중 Content-Type 과 대응
  • Accept-Charset <-> 엔터티 헤더 항목 중 Content-Type charset-xxx 과 대응
  • Accept-Encoding <-> 엔터티 헤더 항목 중 Content-Encoding 과 대응
  • Accept-Language <-> 엔터티 헤더 항목 중 Content-Language 과 대응

응답 헤더 항목

  • Server : 웹 서버 소프트웨어 정보
  • Set-Cookie : 웹서버 측에서 클라이언트에게 세션 쿠키 정보 설정
  • Accept-Range
  • Age
  • ETag
  • Proxy-authenticate
  • Allow : 해당 엔터티에 대해 서버측에서 지원가능한 HTTP 메소드의 리스트 나타냄
  • X-Powered-By : 서버내 시스템 이름을 알리기 위해 반환

일반 헤더 항목

요청 및 응답 메세지 모두에서 사용가능한 일반 목적의 헤더로 HTTP 메세지 내 바디 내용과는 관련 없음

  • Date : 메세지 생성 일시
  • Connection
    • Connection: Keep-Alive => 현 TCP 커넥션 유지 원함
      • HTTP/1.0에만 사용되던 형식
      • HTTP/1.1에서는 예전 의미를 대체로 인식하지만 해당 기능(지속 커넥션) 자체는 HTTP/1.1에서 기본 제공되므로 굳이 언급 필요 없음
      • 사실상, Connection: keep-Alive, keep-Alive: xxx 헤더 항목들은 무시됨
    • Connection: token list
      • 중계 연결(프록시)에 대한 옵션 설정
      • 중계 중인 인접 HTTP 커넥션 간에 만 적용될 옵션 리스트들로써,
      • 다음 커넥션에 전달되어서는 안됨
      • 해당 커넥션 토큰들 각각을 쉼표로 구분시킨 리스트 (token list)
    • Connection: close => 현 커넥션 직후에 TCP 접속을 끊는다는 것을 알림
      • Keep-Alive 형식의 연결을 한 쪽에서 이를 명시적으로 끊을려고 할 때 사용
      • 또한, 오류 탐지 (Content-Length 불일치 등) 강제 종료, 타임아웃으로 연결을 끊게됨
  • Cache-Control
  • Pragma
  • Trailer

엔터티/개체 헤더 항목

  • 요청 및 응답 메세지 모두에서 사용가능
  • 주로 바디 내용이 존재할 때 세부 정보 나타내는데 사용
  • Content-Type 관련 항목
    • Content-Type
    • Content-Encoding
    • Content-Length
    • Content-Disposition
  • 캐시 관련 항목
    • Expires
    • Last-Modified
  • Location : 리소스가 리다이렉트된 때에 이동된 주소, 또는 새로이 생성된 리소스 주소
    • 리다이렉션 이동되는 경우 3xx 상태 코드 반환
    • 새로 생성된 경우 201 Created 반환
    • 이에따라 선택적으로 Location: 헤더 항목을 보내게 됨
  • Transfer-Encoding : chuncked
    • 동적으로 생성되어 바디 길이를 모르는 경우 조금씩 전송 가능
    • 각 chunk마다 그 시작에 16진수 길이를 삽입하여 chunk 길이 알려줌


참고자료