HTTP 완벽 가이드


4장 커넥션 관리

TCP 커넥션

HTTP 통신은 패킷 교환 네트워크 프로토콜들의 계층화된 집합인 TCP/IP를 통해 이루어진다.

◾ 주소검색창에 URL을 입력한다면?

www.example.com을 입력하면 아래와 같은 과정이 이루어진다.

  1. 브라우저가 호스트명을 추출해 그에 해당하는 IP를 찾는다.
  2. IP:port 로 TCP 커넥션을 생성
  3. 서버로 GET 요청을 보낸다.
  4. 서버에서 온 응답 메세지를 읽고,
  5. 커넥션을 끊는다.

◾ 데이터 전송 통로 TCP

TCP는 충돌 없이 순서에 맞게 HTTP 데이터를 전달한다.

◾ TCP 스트림은 세그먼트로 나뉘어 IP 패킷을 통해 전송된다.

TCP는 IP 패킷(or IP 데이터그램)이라고 불리는 작은 조각을 통해 데이터를 전송한다.

◾ 포트 번호를 통해서 여러 개의 커넥션을 유지한다.

컴퓨터는 여러개의 TCP 커넥션을 가질 수 있고, TCP 커넥션은 네 가지 값으로 식별한다.

<발신지 IP, 발신 port, 수신지 IP, 수신 port>

서로 다른 두 개의 커넥션은 구성 요소가 일부 같을 수는 있으나 모두 같은 수는 없다.

◾ TCP 커넥션은 소켓을 기반으로 이루어진다.

TCP 성능

HTTP는 TCP 바로 위에 있는 계층이기 때문에 HTTP 트랜잭션의 성능은 바로 아래 계층인 TCP 성능에 영향을 받는다.

HTTP 네트워크 지연

트랜잭션을 처리하는 시간은 다른 작업에 비하면 상당히 짧다. 클라이언트나 서버가 너무 많은 데이터를 내려받거나 복잡하고 동적인 자원들을 실행하지 않는 한 대부분의 HTTP 지연은 TCP 네트워크 지연 때문에 발생한다.

TCP 네트워크 지연은

  • 하드웨어의 성능
  • 네트워크와 서버의 전송 속도
  • 요청과 응답 메시지의 크기
  • 클라이언트와 서버 간의 거리

에 따라 크게 달라진다. 또한 TCP 프로토콜의 기술적인 복잡성도 지연에 영향을 끼친다.

TCP 커넥션 핸드셰이크 지연

  • TCP 커넥션의 핸드세이크 과정
  1. 클라이언트는 새로운 TCP 커넥션을 생성하기 위해 커넥션 생성 요청이라는 뜻의 'SYN'라는 특별한 플래그가 붙은 TCP 패킷을 서버에 보낸다.
  2. 서버가 그 커넥션을 받으면 몇 가지 커넥션 매개변수를 산출하고, 커넥션 요청이 받아들여졌음을 의미하는 'SYN'과 'ACK' 플래그를 포함한 TCP 패킷을 클라이언트에 보낸다.
  3. 클라이언트는 커넥션이 잘 맺어졌음을 알리기 위해서 서버에게 다시 확인응답 신호를 보낸다.

큰 데이터를 주고받지 않는 평범한 경우에느 SYN/SYN+ACK 핸드셰이크를 구성하는데 시간을 소비함으로써 지연을 발생시킨다.

TCP 느린 시작(slow start)

TCP의 느린 시작(Slow Start)은 TCP의 혼잡 제어(congestion control) 메커니즘 중 하나로, 데이터 전송의 시작 단계에서 트래픽을 조절하는 방법이다.

데이터 전송이 시작될 때, TCP는 처음에는 송신할 수 있는 최대 세그먼트 크기의 절반만을 사용하여 시작합니다. 이후 각 라운드(라운드 트립 타임, Round Trip Time, RTT)마다 성공적으로 전송된 세그먼트의 수를 확인하고, 이를 기반으로 세그먼트 크기를 늘려가며 전송 속도를 증가시킨다.

이 혼잡 제어 기능 때문에, 새로운 커넥션은 이미 어느 정도 데이터를 주고받은 '튜닝'된 커넥션보다 느리다. '튜닝'된 커넥션은 더 빠르기 때문에 이미 존재하는 커넥션을 재사용하는 기능이 있다.

네이글(Nagle) 알고리즘과 TCP_NODELAY

크기가 작은 HTTP 메시지는 패킷을 채우지 못하기 때문에, 앞으로 생길지 말지 모르는 추가적인 데이터를 기다리며 지연이 발생할 수 있다.

TIME_WAIT의 누적과 포트 고갈

TIME_WAIT 포트 고갈은 성능 측정 시에 심각한 성능 저하를 발생시킨다.

HTTP 커넥션 성능 향상

  • 병렬 커넥션: 여러 개의 TCP 커넥션을 통한 동시 HTTP 요청
  • 지속 커넥션: TCP 커넥션의 재활용 방법
  • 파이프라인 커넥션: 공유 TCP 커넥션을 통한 병렬 HTTP 요청
  • 다중 커넥션: 요청과 응답들에 대한 중재

병렬 커넥션

  • 여러 개의 커넥션을 맺음으로써 여러 개의 HTTP 트랜잭션을 병렬로 처리해 커넥션 지연이 겹쳐짐으로서 총 지연시간을 줄일 수 있다.
  • 병렬 커넥션은 일반적으로 더 빠르지만 네트워크 대역폭이 좁을 때 객체를 병렬로 내려받는 경우 성능상의 이점은 없어진다.

지속 커넥션

병렬 커넥션은 몇가지 단점이 존재한다.

  • 트랜잭션마다 새로운 커넥션을 맺고 끊기 때문에 시간과 대역폭이 소요됨
  • 각각의 새로운 커넥션은 TCP 느린 시작 때문에 성능이 떨어짐
  • 실제 연결할 수 있는 병력 커넥션의 수에 제한이 있음

지속 커넥션은 위 단점들을 커버해 주기 때문에 병렬 커넥션과 함께 사용될 때에 가장 효과적이다.

파이프라인 커넥션

0개의 댓글