[HTTP Network] 3장 - HTTP 정보는 HTTP 메시지에 있다.

2023. 2. 22. 19:28Computer Science/네트워크


1. HTTP 메시지

HTTP 메시지란 HTTP에서 교환하는 정보이다.

 

HTTP 메시지 구조

메시지 헤더
개행 문자[CR+LF]
메시지 바디

 

메시지 헤더: 서버와 클라이언트가 꼭 처리해야 하는 리퀘스트와 리스폰스 내용과 속성 등

CR+LF: CR와 LF

메시지 바디: 꼭 전송되는 데이터 그 자체


2. 리퀘스트 메시지와 리스폰스 메시지의 구조

 

리퀘스트 라인: 리퀘스트에 사용하는 메소드와 리퀘스트 URI와 사용하는 HTTP 버전이 포함

상태 라인: 리스폰스 결과를 나타내는 상태 코드와 설명, 사용하는 HTTP 버전이 포함

헤더 필드: 리퀘스트와 리스폰스의 여러 조건과 속성 등을 나타내는 각종 헤더 필드가 포함

그 외: HTTP의 RFC에는 없는 헤더 필드(쿠키 등)가 포함되는 경우가 있다.


3. 인코딩으로 전송 효율을 높이다.

HTTP로 데이터를 전송할 경우 그대로 전송할 수 있지만 전송할 때에 인코딩(변환)을 실시함으로써 전송 효율을 높일 수 있다. 

 

인코딩을 하면 다량의 엑세스를 효율 좋게 처리할 수 있다. 단, CPU 등의 리소스는 보다 많이 소비한다.

 

메시지 바디와 엔티티 바디의 차이

  • 메시지: HTTP 통신의 기본 단위로 옥텟 시퀀스로 구성되고 통신을 통해서 전송된다.
  • 엔티티: 리퀘스트랑 리스폰스의 페이로드로 전송되는 정보로 엔티티 헤더 필드와 엔티티 바디로 구성됩니다.

 

HTTP 메시지 바디의 역할은 리퀘스트랑 리스폰스에 관한 엔티티 바디를 운반하는 일이다.  기본적으로 메시지 바디와 엔티티 바디는 같지만 전송 코딩이 적용된 경우 엔티티 바디의 내용이 변화하기 때문에 메시지 바디와 달라진다.


압축해서 보내는 콘텐츠 코딩

콘텐츠 코딩은 엔티티에 적용하는 인코딩을 가리키는데 엔티티 정보를 유지한채로 압축한다. 콘텐츠 코딩된 엔티티는 수신한 클라이언트 측에서 디코딩한다.

 

주요 콘텐츠 압축

  • gzip(GNU zip)
  • compress(UNIX의 표준 압축)
  • deflate(zlib)
  • identity(인코딩 없음)

분해해서 보내는 청크 전송 코딩

HTTP 통신에서는 리퀘스트했었던 리소스 전부에서 엔티티 바디의 전송이 완료되지 않으면 브라우저에 표시되지 않는다.

 

사이즈가 큰 데이터를 전송하는 경우에 데이터를 분할해서 조금씩 표시할 수 있다.


4. 여러 데이터를 보내는 멀티파트

HTTP도 멀티파트에 대응하고 있어 하나의 메시지 바디 내부에 엔티티를 여러 개 포함시켜 보낼 수 있다. 주로 이미지나 텍스트 파일 등을 업로드할 때 사용되고 있다.


5. 일부분만 받는 레인지 리퀘스트

다운로드 중에 커넥션이 끊어지게 되면 처음부터 다시 다운로드를 해야 했다. 이러한 문제를 해결하기 위해서 일반적인 리줌이라는 기능이 필요하게 되었다.

 

이 기능을 실현하기 위해서는 엔티티의 범위를 지정해서 다운로드를 할 필요가 있다. 이와 같이 범위를 지정하여 리퀘스트 하는 것을 레인지 리퀘스트라고 부른다.  레인지 리퀘스트를 사용하면 전체 10,000 바이트 정도 크기의 리소스에서 5,001 ~ 10,000 바이트의 범위 만을 리퀘스트 할 수 있다.

 

서버가 레인지 리퀘스트를 지원하지 않는 경우 상태 코드 200 OK라는 리스폰스 메시지로 완전한 엔티티로 되돌아온다.


6. 최적의 콘텐츠를 돌려주는 콘텐츠 네고시에이션

웹 페이지에서 영어와 한국어와 같이 서로 다른 언어를 주로 사용하는 브라우저가 같은 URI에 엑세스 할 때에 각각 영어판 웹 페이지와 한국어판 웹 페이지를 표시한다. 이와 같은 구조를 콘텐츠 네고시에이션이라고 부른다.

 

서버 구동형 네고시에이션

서버 측에서 콘텐츠 네고시에이션을 하는 방식. 서버 측에서 리퀘스트 헤더 필드의 정보를 참고해서 자동적으로 처리


에이전트 구동형 네고시에이션

클라이언트 측에서 콘텐츠 네고시에이션을 하는 방식. 브라우저에서 표시된 선택지 중에서 유저가 수동으로 선택한다.


트랜스 페어런트 네고시에이션 

서버 구동형과 에이전트 구동형을 혼합한 것으로 서버와 클라이언트가 각각 콘텐츠 네고시에이션을 하는방식