우클릭방지

글 목록

2017년 6월 26일 월요일

[HTTP 프로토콜 강좌]#2 클라이언트와 서버

1. HTTP 통신의 시작

HTTP는 일단, 클라이언트 서버간 통신이다.
서버는 서비스할 준비를 잔뜩 해 놓고, 클라이언트의 요청을 계속 기다린다. 
클라이언트는 필요시마다 접속해서 원하는 정보를 받아가는 형태이다. 




이러한 클라이언트-서버간 통신방식의 특징은 무엇일까?
HTTP 요청은 클라이언트로부터, HTTP 응답은 서버로부터만 행해진다는 점이다. 

2. 커넥션 (TCP Connection)

FTP, 메일, 스트리밍등 많은 어플리케이션들이 TCP 프로토콜에 기반한다. HTTP 도 마찬가지이다. 클라이언트가 원하는 정보를 요청하기 위해서는 먼저 TCP 세션을 서버와 맺어야 가능하다는 뜻이다. 

그럼 TCP 세션의 시작은 누구로부터 시작이 될까? 클라이언트 또는 서버??
그렇다. HTTP 요청을 클라이언트가 항상 먼저 시작하듯이, TCP 세션 역시 마찬가지이다.


우리가 잘 알고 있는 TCP 세션 수립의 단계 "3-way handshake" 가 HTTP 요청 전에 클라이언트의 SYN 요청으로부터 이루어 진다. 

그럼 TCP 세션의 종료는 누구로부터 시작될까? 항상은 아니지만 일반적으로는 그림에서와 같이 서버에서부터 시작된다고 기억을 하자. 다시 말하지만 늘/항상 서버로부터 시작되는 것은 아니다. 

간단히 예로.. 브라우저를 열고 네이버에 접속을 했다고 치자... 우리는 네이버의 메인화면이 브라우저에 다 표시되기 전에 브라우저를 닫을수도 있고.... 다음이나 기타 다른 사이트로 접속을 할 수도 있다. 이럴때 클라이언트가 해당세션을 닫게 되는데 이경우는 클라이언트로부터 세션의 종료가 이루어지게 된다. 

3. 연결 지속 (Persistence)

HTTP 1.0 기반에서는 각각의 웹컨텐츠별로 TCP 커넥션이 모두 필요했다. 
과거 웹페이지가 텍스트 기반 아래 간단한 형태였을 때는 크게 문제가 되지 않았으나, 점점 웹어플리케이션이 복잡하고 화려해지면서 부터 성능에 문제가 되기 시작했다. 

아래 웹페이지처럼 10개 이상의 오브젝트로 구성된 경우 하나의 페이지를 브라우져로 보려면 10개 이상의 TCP 커넥션이 필요하게 된다. 




이 문제를 해결하기 위해 등장한 것이 바로 "연결지속(Persistence)" 이다. 
HTTP 1.1에서 기본적으로 지원하는 이 기능을 통해 복잡한 웹어플리케이션의 TCP 커넥션 부담을 크게 개선할 수 있게 되었다. 


HTTP 1.1 에서 지원하는 연결지속(Persistence) 기능의 동작은 다음과 같다. 


하나의 TCP 커넥션에서 연결지속(Persistence)을 통해 필요시 지속적으로 HTTP 요청을 처리할 수 있게 한것이다. 
이 기능을 사용하기 위해서는 클라이언트와 서버에서도 해당기능을 사용할 수 있도록 설정되어 있어야 한다. 즉, 클라이언트와 서버에서 동시에 연결지속(Persistence) 기능을 사용하도록 설정이 되어야 효과가 있다는 의미이다. 


4. 파이프라이닝 (Pipelining)

HTTP 성능을 향상하기 위해 사용되는 옵션으로 연결지속(Persistence) 외에 "파이프라이닝(Pipelining)" 이라는 기능이 있다. 

웹서버에서 제공하는 컨텐츠는 순차적으로 처리된다. 예를 들어, a.jpg, b.jpg 와 같이 2개의 이미지를 제공하는 웹페이지의 경우 클라이언트는 a.jpg를 요청한 후 응답을 모두 받아야만 b.jpg를 요청할 수 있다. 
연결지속 기능을 통해 TCP 커넥션의 부하를 줄여 속도 개선을 했을지라도, 클라이언트가 요청한 컨텐츠를 서버가 빨리 빨리 처리하지 못한다면 응답지연으로 이어질수 있는 것이다. 

이점을 개선하기 위한 기능이 바로 파이프라이닝이다. 동작방식은 다음과 같다. 



a.jpg 와 b.jpg를 응답의 완료여부와 상관없이 서버에 요청할 수 있다. 다시 말해 a.jpg를 요청하고 응답을 다 받지 못하더라도 b.jpg를 요청할 수 있는것이다. 

일반적으로 HTTP 1.0, HTTP 1.1(Persistence), HTTP 1.1(Persistence + Pipelining) 을 비교하면 다음과 같다고 한다. 


오늘 내용을 정리해 본다. 

  1. HTTP는 클라이언-서버 구조의 통신방식이며, TCP 세션과 HTTP 요청은 항상 클라이언트로부터 시작된다. 
  2. HTTP도 여느 어플리케이션 처럼 TCP 기반의 프로토콜이다. 
  3. HTTP의 처리성능을 향상시키는 방법엔 다음과 같은 2가지가 있다. 
    • 연결지속(Persistence) : HTTP 1.1에 기본적으로 적용되었으며, 다수의 HTTP 요청을 단일 TCP 세션에서 처리할수 있도록 하여, 서버의 TCP 세션 부하를 개선시킨 기능
    • 파이프라이닝(Pipelining) : 연결지속과 마찬가지로 HTTP 1.1에서 지원하는 기능이며 HTTP 요청에 대한 응답에 상관없이 요청을 처리할 수 있는 기능
다음 시간에는 HTTP Method에 대해 이야기 해보도록 한다. 


댓글 없음:

댓글 쓰기