[HTTP] HTTP 커넥션 관리
HTTP가 메시지를 전송하고자 하면 TCP 커넥션을 맺고, 이를 통해 메시지 데이터의 내용을 순서대로 보낸다.
컴퓨터는 포트를 통해서 TCP 커넥션을 여러 개를 가질 수 있으며, 유지한다.
각기 다른 커넥션은 발신지 주소, 발신지 포트, 목적지 주소, 목적지 포트 중 하나라도 다르며, 모두 같은 여러 개의 커넥션은 있을 수 없다.
TCP 성능 고려
HTTP는 TCP 위에서 작동하는 계층이기 때문에 HTTP 트랜잭션은 TCP 성능에 영향을 받는다.
HTTP 지연은 하드웨어의 성능, 네트워크와 서버의 전송 속도, 메시지의 크기, 호스트간 거리 등에 따라 달라진다.
대부분의 HTTP 지연은 트랜잭션을 처리하는 시간이 아닌, TCP 네트워크 지연(커넥션 설정, 요청 전송 시간 등)에 의해 발생한다.
핸드셰이크 설정
TCP 커넥션을 열 때, IP 패킷을 연속으로 교환한다. 작은 크기의 데이터에 커넥션이 사용된다면, HTTP 성능을 저하시킬 수 있다. 많은 HTTP 서버 응답 메시지는 하나의 IP 패킷에 담길 수 있기도 하다.
결국, 크기가 작은 HTTP 트랜잭션은 대부분의 시간을 TCP 구성에 사용한다.
TCP slow-start
TCP 데이터 전송 속도는 TCP 커넥션이 생성된지 얼마나 지났는지에 따라 달라질 수 있다.
TCP 커넥션은 시간이 지나면서 자체적으로 튜닝된다. (처음에는 최대 속도를 제한하고, 성공적인 전송에 따라 속도 제한을 높인다.)
네이글 알고리즘
TCP는 어떤 크기의 데이터더라도 TCP로 전송할 수 있도록 데이터 스트림 인터페이스를 제공한다. TCP는 40바이트의 플래그와 헤더를 포함해 전송하기 때문에, 예를 들어 데이터의 크기가 1바이트라면 네트워크 성능이 크게 떨어질 수 있다.
이를 보완하기 위해, 네이글 알고리즘은 네트워크의 효율을 위해서 많은 양의 TCP 데이터를 세그먼트가 최대 크기가 될 때까지 모았다가 한번에 보낸다. (다만, 다른 모든 패킷이 확인응답을 받았을 경우에는 전송을 허락한다.
피기배킹과 확인응답 지연 알고리즘
요청과 응답 형식으로만 이루어지는 HTTP 동작 방식은 피기배킹의 기회를 감소시킨다.
피기배킹에 관련한 내용은 아래 포스팅에서 잠시 다루었다.
[네트워크] 데이터링크 계층 - 슬라이딩 윈도우 프로토콜(Sliding Window Protocol)
슬라이딩 윈도우 프로토콜은 두 호스트 간의 프레임 전송을 위한 통신 프로토콜이며, 오류 제어와 흐름 제어 기능을 함께 지원한다. 현재 대부분의 통신 프로토콜에서 사용하는 방식으로, 다음
sm-jeon-develop.tistory.com
TIME_WAIT 누적과 포트 고갈
TCP 커넥션을 끊은 곳에서는 해당 호스트는 특정 시간만큼 지연시킨 후에 정보를 삭제한다. 이는 상대가 전송한 패킷이 지연되어 도착했을 때, 새로운 커넥션에 삽입되는 문제를 방지한다.
클라이언트가 서버에 접속할 때마다, 유일한 커넥션을 생성하기 위해 새로운 발신지 포트를 쓴다. 하지만, TIME_WAIT에 의해 일정 시간 커넥션이 재사용될 수 없고, 서버가 처리할 수 없을 만큼 트랜잭션이 늘어나면 포트 고갈이 될 수도 있으며, 커넥션이 과도하게 생기면 극심하게 느려질 수 있다.
HTTP 커넥션 관리
커넥션을 제대로 관리하지 않으면 성능이 매우 안좋아질 수 있다. 예를 들어 이미지를 가지고 있는 웹페이지가 있을 때, HTML 파일을 받기 위해, 이미지를 받기 위해 2개의 HTTP 트랜잭션을 만들어야 한다. 각 트랜잭션이 새로운 커넥션을 필요로 한다면, 순차적으로 트랜잭션을 처리해야 하고, 결과적으로 큰 지연이 생긴다.
실제로의 지연 뿐만 아니라, 심리적인 지연도 있을 수 있다.
아무튼, 이런 상황에서 성능을 개선시킬 수 있는 방법들이 있다.
병렬 커넥션
HTTP 클라이언트가 여러 개의 커넥션을 맺음으로써 HTTP 트랜잭션을 병렬로 처리하도록 한다.
각 커넥션의 지연 시간을 겹치게 하면 총 지연 시간을 줄일 수 있다. 하나의 커넥션이 인터넷 대역폭을 모두 사용하는 것이 아닐 것이기 때문에, 남는 대역폭을 활용하면 된다.
네트워크 대역폭이 좁을 때는 성능 상의 장점이 사라질 수도 있으며, 다수의 커넥션은 메모리를 많이 소모하고 자체적인 성능 문제를 발생시킨다.
브라우저는 대부분 적은 수의 병렬 커넥션을 사용한다.
지속 커넥션
클라이언트는 보통 같은 사이트에 여러 개의 커넥션을 맺는다. 예를 들어 웹페이지의 이미지는 대부분 같은 웹 사이트에 있으며, 하이퍼링크도 마찬가지이다. 이를 사이트 지역성이라고 한다.
지속 커넥션은 사이트 지역성을 이용해 처리가 완료된 커넥션을 유지해두어 재사용하는 방법이다. 트랜잭션 간에도 커넥션을 유지한다.
지속 커넥션을 재사용함으로써, 커넥션을 맺기 위한 준비작업의 시간을 줄이며, 튜닝된 커넥션을 유지할 수 있다.
하지만, 지속 커넥션을 잘못 관리할 경우 계속 연결된 상태로 수많은 커넥션이 쌓이게 될 것이다. 이는 리소스 부하를 초래한다.
파이프라인 커넥션
지속 커넥션을 통해 요청을 파이프라이닝 한다. 지속 커넥션인지 확인이 된다면, 여러 개의 요청을 응답이 도착하기 전에 순서대로 보낸다. 이에 따라 응답도 순서대로 도착해야 한다.
커넥션을 끊는 것에 대한 명확한 기준이 없다.