kakasoo

[HTTP] 9. 커넥션 관리 (1) 본문

프로그래밍/HTTP

[HTTP] 9. 커넥션 관리 (1)

카카수(kakasoo) 2020. 10. 20. 19:26
반응형

HTTP 명세에는 HTTP 메시지에 대해서 자세히 설명하고 있지만 HTTP 커넥션에 대해서는 설명하고 있지 않다. 하지만 HTTP 애플리케이션을 만드려면 HTTP 커넥션 역시 잘 알고 있어야 한다.

이 장에서는 아래와 같은 내용을 배운다,

  • HTTP는 어떻게 TCP 커넥션을 사용하는가.
  • TCP 커넥션의 지연, 병목, 막힘
  • 병렬 커넥션, keep0alive 커넥션, 커넥션 파이프라인을 활용한 HTTP의 최적화
  • 커넥션 관리를 위해 따라야 할 규칙들

별도 정리 및 의문점

이번에는 이 단락을 활용하여, 밑의 내용을 공부해본 사람들에게 질문을 던지도록 하겠다.

  1. 패킷이란 무엇인가?
  2. HTTP의 네트워크 프로토콜 스택과 HTTPS의 네트워크 프로토콜 스택을 구분하여 설명하고, 그 차이를 말하라.

4.1 TCP 커넥션

HTTP 통신은 TCP/IP를 통해 이루어진다. 클라이언트 애플리케이션은 서버 애플리케이션으로 TCP/IP 커넥션을 맺을 수 있다. 일단 커넥션이 맺어지면 메시지들의 무결성이 보장된다.

브라우저의 주소창에 특정 주소를 입력한다고 해보자. 아래의 단계를 따르게 된다.

http://www.joes.hardware.com:80/power-tools.html

  1. 브라우저가 호스트명을 추출한다.
  2. 브라우저가 호스트명에 맞는 IP 주소를 찾는다.
  3. 브라우저가 포트 번호를 얻는다.
  4. 브라우저가 IP 주소와 포트 번호를 가지고 TCP 커넥션을 생성한다.
  5. 브라우저가 서버로 HTTP GET 요청을 보낸다.
  6. 브라우저가 서버에서 온 HTTP 응답 메시지를 읽는다.
  7. 브라우저가 커넥션을 끊는다.

조금 장황한데, 호스트 명에서 IP를 읽고, IP와 포트 번호를 가지고 커넥션을 만들어 요청과 응답을 주고 받은 후, 페이지를 띄운다. 그 다음에 TCP 커넥션을 잊지 않고 닫아준다는 의미다.

4.1.1 신뢰할 수 있는 데이터 전송 통로인 TCP

HTTP 커넥션은 몇몇 사용 규칙을 제외하고는 TCP 커넥션에 불과하다. TCP 커넥션은 안정적으로 인터넷을 연결해준다.

TCP는 HTTP에게 신뢰할 만한 통신 방식을 제공한다. TCP 커넥션은 바이트들을 목적지로, 순서에 맞게 정확하게 전달해준다.

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

HTTP는 IP, TCP, HTTP로 구성된 프로토콜 스택에서 최상위 계층이다. (HTTP에 보안 기능을 더한 HTTPS는 TLS 혹은 SSL이라 불리는 암호화 계층을 HTTP와 TCP 사이에 두고 있다.)

HTTP가 메시지를 전송하고자 할 경우, TCP는 데이터들을 세그먼트라는 단위로 나눈다. 세그먼트는 IP 패킷에 담겨 인터넷을 통해 전달된다. 이게 TCP/IP에 의한 처리 과정이다.

그럼 패킷은 뭘까? 패킷은 아래의 것을 포함한다.

  • IP 패킷 헤더 : 발신지와 목적지의 IP 주소, 크기, 기타 플래그를 의미
  • TCP 세그먼트 헤더 : TCP 포트 번호, TCP 제어 플래그, 데이터의 순서와 무결성을 검사하기 위해 사용되는 숫자 값을 포함.
  • TCP 데이터조각

엄밀히 말해, IP 패킷 헤더 안에 TCP 세그먼트 헤더가 들어 있고, 다시 이 안에 TCP 데이터 조각이 들어 있는 구조이다.

4.1.3 TCP 커넥션 유지하기

컴퓨터는 항상 TCP 커넥션을 여러 개 가지고 있다. IP는 해당 컴퓨터를 찾는 데에 사용되며, 포트 번호는 컴퓨터 안에서 다시 애플리케이션을 찾는 데에 쓰인다. TCP 커넥션은 네 가지 값으로 식별한다.

<발신자 IP 주소, 발신자 포트, 수신자 IP 주소, 수신자 포트>

이 네 가지 값으로 유일한 커넥션을 생성한다. 서로 다른 두 개의 TCP 커넥션은 네 가지 주소 구성 요소의 값이 모두 같을 수 없다. (부분적으로 같을 수는 있다.)

4.1.4 TCP 소켓 프로그래밍

운영체제는 TCP 커넥션의 생성과 관련된 여러 기능을 제공한다. 아래는 인터페이스 함수들을 나열한 것이다.

socket, bind, connect, listen, accpet, read ,write, close, shutdown, getsockopt, setsockopt.

이 함수들은 소켓을 만들고, ip와 포트번호를 배정하고, 연결하고, 기다리고, 받아들이고, 읽고, 쓰고, 닫고, 끊고, 옵션을 보고 설정하는 함수들이다.

4.2 TCP의 성능에 대한 고려

HTTP의 성능은 TCP 바로 위 계층이라 TCP 성능에 영향을 받는다. TCP 커넥션을 이해하면 HTTP 커넥션 최적화 요소를 더 잘 알게 되고, 성능을 높일 수 있다.

4.2.1 HTTP 트랙잭션 지연

HTTP 트랙잭션 과정은 DNS 찾기, 연결, 요청, 처리, 응답, 종료의 단계를 거치는데, 이 중 처리의 시간은 요청 및 응답의 전송에 비하면 상당히 짧은 시간에 이루어진다.

따라서 서버가 너무 큰 데이터를 내려받거나 복잡한 동적 자원을 실행하지 않는 한, 대부분의 HTTP 지연은 TCP 네트워크 지연 때문에 발생함을 알 수 있다.

HTTP 트랜잭션을 지연시키는 원인은 여러 가지가 있다.

  1. 클라이언트는 URI에서 웹 서버의 IP와 포트 번호를 찾아야 하는데, 이 과정이 오래 걸릴 수 있다 → 책이 서술될 당시에는 수 십초가 소요될 수 있었으나 지금은 해결되었다.
  2. TCP 커넥션 요청과 응답 사이에서 커넥션 설정 시간이, HTTP 트랜잭션의 수에 따라 크게 증가한다 → 이 역시 현재는 해결되었다.
  3. 커넥션이 맺어지면 클라이언트는 HTTP 요청을 새로 생성된 TCP 파이프를 통해서 전송한다. 이 요청 메시지가 인터넷을 통해 전달되고 처리되는 데에 시간이 걸린다.
  4. 웹 서버가 응답하는 데에도 시간이 걸린다.

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

즉, 네트워크 개발자가 담당해서 처리해야 할 일이 일이 현재로서는 HTTP 커넥션의 요청과 응답 뿐이라고 할 수 있겠지만, 일단은 가능한 모든 요소에 대해서 다루도록 하겠다.

4.2.2 성능 관련 중요 요소

가장 일반적인 요소는 아래와 같다.

  1. TCP 커넥션의 핸드셰이크 설정
  2. 인터넷 혼잡을 제어하기 위한 TCP의 느린 시작(slow-start)
  3. 데이터를 한데 모아 한 번에 전송하기 위한 네이글(nagle) 알고리즘
  4. TCP의 편승(piggyback) 확인응답(acknowledgment)을 위한 지연 알고리즘
  5. TIME_WAIT 지연과 포트 고갈

고성능의 HTTP 소프트웨어를 개발하고자 한다면 이 내용을 모두 이해해야 하며, 그 정도 까지가 아니라면 건너뛰어도 좋다.

반응형