책 “HTTP 완벽 가이드”를 읽고 정리한 글입니다.
TCP 커넥션
모든 HTTP 통신은 TCP/IP를 통해 이루어진다. 이렇게 이루어진 TCP/IP 커넥션 덕에 메시지들이 손실되지 않고 올바른 순서로 목적지에 도달할 수 있다.
예시
다음 URL을 브라우저에 입력하여 목록을 가져온다고 하자.
http://23tae.github.io/index.html
TCP란?
TCP는 신뢰할 수 잇는 데이터 전송 통로이다. 이를 통해 HTTP가 반대편 목적지까지 데이터의 바이트들을 순서대로 정확하게 전달할 수 있다.
TCP의 전송 방식
- HTTP는 전송하려는 메시지의 데이터를 연결된 TCP 커넥션으로 순서대로 보낸다. (아래 그림 참고)
- TCP는 세그먼트 단위로 데이터 스트림을 잘게 나눈다.
- 이후에 해당 세그먼트를 IP 패킷에 넣어 인터넷을 통해 보낸다.
다음 네 가지 값을 통해 유일한 TCP 커넥션이 생성된다.
<발신지 IP 주소, 발신지 포트, 수신지 IP 주소, 수신지 포트>
HTTP 커넥션 관리
커넥션 헤더
HTTP 메시지는 클라이언트에 도달하기까지 중개 서버(프록시 서버, 캐시 서버 등)를 거칠 수 있다. 이 과정에서 특정 옵션을 현재의 커넥션에만 적용하려는 경우, 커넥션 헤더 필드를 사용한다.
기존 커넥션이 갖는 문제점
기존의 방식에서는 하나의 트랜잭션마다 하나의 커넥션을 맺어야 했다. 이러한 순차적인 로딩 방식이 갖는 문제는 다음과 같다.
- 커넥션으로 인한 지연에 더해 느린 시작 지연도 발생할 수 있다.
- 느린 시작 : TCP 커넥션 초반에 데이터를 느리게 보내다가 점차 속도를 높여 나가는 것
- 하나의 이미지를 로드하는 중에는 나머지 공간에 변화가 없다.
- (특정 브라우저에서)모든 객체를 완전히 내려받기 전까지는 텅 빈 화면을 보여준다.
이러한 문제를 해결하는 방식은 다음과 같다.
- 병렬 커넥션 (parallel connections)
- 지속 커넥션 (persistent connections)
- 파이프라인 커넥션 (pipelined connections)
- 다중 커넥션 (multiplexed connections)
병렬 커넥션
- 개념
- 여러 개의 TCP 커넥션을 통해 동시에 HTTP를 요청하는 것
- 특징
- 페이지를 더 빠르게 내려받는다.
- 항상 더 빠르지는 않다.
- 클라이언트의 네트워크 대역폭이 좁은 경우
- 사용자에게 더 빠르게 느껴진다.
- 여러 객체를 화면에 동시에 보여주기 때문
지속 커넥션
- 개념
- 기존에 사용한 TCP 커넥션을 재사용하는 것
- 특징
- HTTP/1.1부터 지원하는 방식
- 커넥션을 맺고 끊으며 생기는 지연을 없앤다.
지속 커넥션 vs 병렬 커넥션
- 병렬 커넥션
- 단점
- 각 트랜잭션마다 추가적인 시간과 대역폭이 소모된다.
- 새 커넥션 각각의 TCP 느린 시작으로 인한 성능 감소
- 병렬 커넥션 개수의 제한
- 단점
- 지속 커넥션
- 장점
- 커넥션을 맺기 위한 사전 작업과 지연을 줄여준다.
- 튜닝된 커넥션을 유지한다.
- 튜닝된 커넥션 : 패킷 전송을 여러 번 성공하여 다음 번에는 여러 패킷을 한번에 보낼 수 있는 권한을 갖게 된 커넥션
- 커넥션의 수를 줄여준다.
- 단점
- 연결된 상태의 커넥션이 계속해서 쌓이는 문제가 발생할 수 있다.
- 이로 인해 로컬과 클라이언트, 서버의 리소스가 불필요하게 소모될 수 있다.
- 연결된 상태의 커넥션이 계속해서 쌓이는 문제가 발생할 수 있다.
- 장점
지속 커넥션의 종류는 다음과 같다.
- keep-alive 커넥션 (HTTP/1.0+)
- 지속 커넥션 (HTTP/1.1)
HTTP/1.0+의 Keep-Alive 커넥션
HTTP/1.0에서 1.0+으로 확장되면서 지원하게 되었다.
동작 방식
- keep-alive 커넥션을 하려는 클라이언트가 요청에
Connection:Keep-Alive
헤더를 포함시켜 보낸다. - 서버는 요청을 받은 후, 같은 헤더를 포함하여 응답한다. (다음 요청도 동일한 커넥션으로 받겠다는 의미)
HTTP/1.1의 지속 커넥션
- keep-alive 커넥션과의 차이점
- keep-alive 커넥션에서 설계가 개선된 방식
- keep-alive와는 달리 기본적으로 활성화 되어 있다.
- 커넥션을 끊으려면
Connection:close
헤더를 명시해야 한다.
- 커넥션을 끊으려면
파이프라인 커넥션
- 개념
- 공유 TCP 커넥션을 통해 HTTP 요청을 병렬적으로 보내는 방식
- 특징
- 여러 개의 요청을 응답을 받기 전까지 큐에 담아둔다.
- 첫 번째 요청이 서버로 전달되면 이후 요청이 차례대로 전달된다.
- 네트워크상에서 왕복으로 인한 시간 소모를 줄여준다.
- 여러 개의 요청을 응답을 받기 전까지 큐에 담아둔다.