ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HTTP 완벽 가이드] 4장. 커넥션 관리
    Engineering/Network 2021. 9. 18. 02:45
    반응형

    TCP 커넥션

    • TCP 커넥션은 클라이언트와 서버간에 주고받는 메시지들의 손실 혹은 손상되거나 순서가 바뀌지 않고 안전하게 전달할 수 있도록 한다.
    • TCP 커넥션의 한쪽에 있는 바이트들은 반대쪽으로 순서에 맞게 정확히 전달된다.

     

    HTTP, HTTPS 네트워크 프로토콜 스택

    • TCP 스트림은 세그먼트로 나뉘어 IP 패킷을 통해 전송된다.
      • TCP 는 IP 패킷(혹은 IP 데이터그램)이라고 불리는 작은 조각을 통해 데이터를 전송한다.
    • HTTP 는 TCP 커넥션을 통해서 메시지 데이터의 내용을 순서대로 보낸다.
    • TCP 는 세그먼트라는 단위로 데이터 스트림을 잘게 나누고, 세그먼트를 IP 패킷이라는 단위로 인터넷을 통해 전달한다.
    • TCP 세그먼트의 구조와 전달 과정은 아래의 링크에 정리되어 있다.
      • https://icarus8050.tistory.com/103?category=358436
    • TCP 커넥션은 아래의 네 가지 값으로 식별한다.
      • <발신지 IP 주소, 발신지 포드, 수신지 IP 주소, 수신지 포트>
    • 위 네 가지 값으로 유일한 커넥션을 생성한다.

     

    TCP 소켓 프로그래밍

    • 소켓 API를 사용하면, TCP 종단(endpoint) 데이터 구조를 생성하고, 원격 서버의 TCP 종단에 그 종단 데이터 구조를 연결하여 데이터 스트림을 읽고 쓸 수 있다.
    • TCP API 는, 기본적인 네트워크 프로토콜의 핸드셰이킹, 그리고 TCP 데이터 스트림과 IP 패킷 간의 분할 및 재조립에 대한 모든 세부사항을 외부로 숨긴다.

     

    HTTP 트랜잭션 지연

    HTTP 트랜잭션 지연 원인

    • 클라이언트는 URI 에서 웹 서버의 IP 주소와 포트를 알아내야 하는데, 해당 호스트에 방문한 적이 없다면 DNS resolution 을 통해 호스트 명을 IP 주소로 변환하는데 시간이 필요하다.
    • 클라이언트가 서버에게 TCP 커넥션 요청을 보내고 서버가 커넥션 허용 응답을 회신하기를 기다린다.
    • 커넥션이 맺어지면 클라이언트는 HTTP 요청을 새로 생성된 TCP 파이프를 통해 전송한다. 요청 메시지가 서버로 전달되고 서버에서 처리되는 데 시간이 소요된다.
    • 웹 서버가 HTTP 응답을 보내는 데 시간이 소요된다.

     TCP 네트워크 지연은 하드웨어 성능, 네트워크와 서버의 전송 속도, 요청과 응답 메시지의 크기, 클라이언트와 서버 간의 거리에 따라 크게 달라진다.

     

    TCP 커넥션 handshake 지연

    •  HTTP 트랜잭션이 아주 큰 데이터를 주고받지 않는 평범한 경우에는, SYN/SYN + ACK 핸드셰이크가 눈에 띄는 지연을 발생시키다.

     

    확인응답 지연

    • 각 세그먼트의 수신자는 세그먼트를 온전히 받으면 작은 확인응답 패킷을 송신자에게 반환하고, 만약 송신지가 특정 시간 안에 확인응답 메시지를 받지 못하면 패킷이 파기되었거나 오류가 있는 것으로 보고 데이터를 다시 전송한다.
    • 확인응답 패킷은 크기가 작기 때문에, TCP 는 같은 방향으로 송출되는 데이터 패킷에 확인응답을 편승(piggyback) 시켜서 더 효율적으로 사용한다.
    • 일정 시간 안에 송출 데이터 패킷을 찾지 못하면 확인응답은 별도 패킷을 만들어 전송한다.
    • 요청과 응답으로만 이루어지는 HTTP 동작 방식은 확인 응답이 송출 데이터 패킷에 편승할 기회를 감소시키기 때문에 확인응답 지연 알고리즘으로 안힌 지연이 자주 발생한다.

     

    TCP 느린 시작 (slow start)

    • TCP 커넥션은 처음에는 최대 속도를 제한하고 데이터가 성공적으로 전송됨에 따라서 속도 제한을 높여나간다. 이는 인터넷의 급작스러운 부하와 혼잡을 방지하는 데 쓰인다.
    • TCP 가 한 번에 전송할 수 있는 패킷의 수를 제한한다. 패킷이 성공적으로 전달되는 각 시점에 송신자는 추가로 2배의 패킷을 더 전송할 수 있는 권한을 얻는다. 이를 '혼잡 윈도를 연다'라고 한다.
    • 이러한 혼잡 제어 기능 때문에, 새로운 커넥션은 이미 어느 정도 데이터를 주고받은 '튜닝'된 커넥션보다 느리다. '튜닝'된 커넥션은 더 빠르기 때문에, HTTP 에는 이미 존재하는 커넥션을 재사용하는 기능이 있다.

     

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

    • 각 TCP 세그먼트는 40byte 상당의 플래그와 헤더를 포함하여 전송하기 때문에 작은 크기의 데이터를 포함한 많은 수의 패킷을 전송하면 네트워크 성능은 크게 떨어진다.
    • 네이글 알고리즘은 네트워크 효율을 위해서, 패킷을 전송하기 전에 많은 양의 TCP 데이터를 한 개의 덩어리로 합친다.
    • 네이글 알고리즘은 세그먼트가 최대 크기(패킷의 최대 크기는 LAN 상에서 1,500byte 정도, 인터넷 상에서는 수백 byte 정도다)가 되지 않으면 전송을 하지 않는다. 다만 다른 모든 패킷이 확인응답을 받았을 경우에는 최대 크기보다 작은 패킷의 전송을 허락한다.
    • 다른 패킷들이 아직 전송중이면 데이터는 버퍼에 저장된다. 전송되고 나서 확인응답을 기다리던 패킷이 확인응답을 받았거나 전송하기 충분할 만큼의 패킷이 쌓였을 때 버퍼에 저장되어 있던 데이터가 전송된다.
    • 이러한 동작의 네이글 알고리즘은 크기가 작은 HTTP 메시지에 대해서 패킷을 채우지 못하기 때문에, 앞으로 생길지 생기지 않을지 모르는 추가적인 데이터를 기다리며 지연될 것이다.
    • 네이글 알고리즘은 확인응답이 도착할 때까지 데이터 전송을 기다리는 반면, 확인응답 지연 알고리즘은 확인응답을 100~200밀리초 지연시킨다.
    • HTTP 애플리케이션은 성능 향상을 위해서 HTTP 스택에 TCP_NODELAY 파라미터 값을 설정하여 네이글 알고리즘을 비활성화 하기도 한다. 이 설정을 했다면, 작은 크기의 패킷이 너무 많이 생기지 않도록 큰 크기의 데이터를 만들어야 한다.

     

    TIME_WAIT 의 누적과 포트 고갈

    • TCP 커넥션의 종단에서 TCP 커넥션을 끊으면, 종단에서는 커넥션의 IP 주소와 포트 번호를 메모리의 작은 제어영역(control block)에 기록한다. 이 정보는 같은 주소와 포트 번호를 사용하는 새로운 TCP 커넥션이 일정 시간 동안에는 생성되지 않게 하기 위한 것으로, 보통 세그먼트 최대 생명주기의 두 배 정도의 시간동안 유지된다.
    • 이 방식은 같은 IP주소와 포트 번호를 가지는 커넥션이 짧은 시간 이내에 또 생성되는 것을 막아준다.
    • 일반적인 상황에서는 문제가 되지 않지만, 클라이언트가 접속할 수 있는 IP 주소의 개수를 제한하고 성능측정을 하는 상황에서는 문제가 될 수 있다.

     

    순차적인 트랜잭션 처리에 의한 지연

    • 각 트랜잭션이 새로운 커넥션이 필요로 한다면, 커넥션을 맺는데 발생하는 지연과 함께 느린 시작 지연이 발생한다.

     

    HTTP 커넥션 성능을 향상시키는 기술

    병렬(parallel) 커넥션

    • 클라이언트가 여러 개의 커넥션을 맺음으로써 여러 개의 HTTP 트랜잭션을 병렬로 처리할 수 있게 하여 성능을 개선시킨다.
    • 각 커넥션의 지연 시간이 겹치게 되므로 총 지연 시간을 줄일 수 있고, 클라이언트의 인터넷 대역폭을 한 개의 커넥션이 다 써버리는 것이 아니라면 나머지 객체를 내려받는 데에 남은 대역폭을 사용할 수 있다.
    • 병렬 커넥션이 일반적으로 빠르긴 하지만, 클라이언트의 네트워크 대역폭이 좁을 때는 오히려 느려질 수 있다.
    • 다수의 커넥션은 메모리를 많이 소모하고 자체적인 성능 문제를 발생시킬 수 있다.

     

    지속 커넥션

    • 웹 클라이언트는 보통 같은 사이트에 대해 여러 개의 커넥션을 맺는데, 이러한 특징을 사이트 지역성(site locality)라 부른다.
    • HTTP/1.1 을 지원하는 기기는 처리가 완료된 후에도 TCP 커넥션을 유지하여 앞으로 있을 HTTP 요청에 재사용할 수 있다.
    • 처리가 완료된 후에도 연결을 지속하는 상태를 지속 커넥션이라고 한다. 지속 커넥션을 재사용함으로써, 커넥션을 맺기 위한 준비작업에 드는 시간을 절약할 수 있다.

     

    병렬 커넥션과 지속 커넥션

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

     

    • 지속 커넥션은 커넥션을 맺기 위한 사전 작업과 지연을 줄여주고, 튜닝된 커넥션을 유지하며, 커넥션 수를 줄여준다.
    • 지속 커넥션을 잘못 관리할 경우, 계속 연결된 상태로 수많은 커넥션이 쌓이게 된다.

    지속 커넥션은 병렬 커넥션과 함께 사용될 때 가장 효과적이다.

     

     


    참고자료

    http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966261208&orderClick=LEA&Kc= 

     

    HTTP 완벽 가이드 - 교보문고

    웹은 어떻게 동작하는가 | 웹 세상을 떠받치고 있는 HTTP에 대한 모든 것모든 성공적인 웹 트랜잭션 뒤에는, 웹 클라이언트와 서버가 문서와 정보를 교환하는 언어인 HTTP가 있다. HTTP는, 회사 인트

    www.kyobobook.co.kr

     

    반응형

    댓글

Designed by Tistory.