포스트

4장. [HTTP - 웹의 기초] 커넥션 관리

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


❐ 1. TCP 커낵션


1-1. 신뢰할 수 있는 데이터 전송 통로인 TCP

TCP와 HTTP의 관계

  • 전 세계의 모든 HTTP 통신은 TCP/IP 프로토콜 위에서 이루어진다.
  • HTTP는 자체적으로 신뢰성 있는 전송을 제공하지 않으며, TCP의 신뢰성에 의존한다.
  • 따라서 HTTP 커넥션은 본질적으로 TCP 커넥션이다.


TCP 커넥션의 특징

  • TCP는 클라이언트와 서버 간에 신뢰할 수 있는 연결 지향 통신을 제공한다.
  • 데이터는 손실되거나 손상되지 않고, 보낸 순서 그대로 상대방에게 전달된다.
  • 한쪽에서 보낸 바이트 스트림은 반대쪽에서 정확히 동일한 순서로 수신된다.


웹 요청 시 TCP 커넥션 동작 흐름

  • 브라우저는 URL에서 호스트 이름을 추출한다.
  • DNS 조회를 통해 호스트 이름에 해당하는 IP 주소를 찾는다.
  • URL에 명시된 포트 번호(기본값 80)를 확인한다.
  • 클라이언트는 서버의 IP 주소와 포트로 TCP 커넥션을 생성한다.
  • 생성된 TCP 커넥션을 통해 HTTP 요청 메시지를 전송한다.
  • 서버로부터 HTTP 응답 메시지를 수신한다.
  • 응답이 완료되면 TCP 커넥션을 종료한다.


신뢰성 있는 데이터 전송의 의미

  • TCP는 인터넷 환경에서도 데이터를 안정적으로 전달하기 위해 설계되었다.
  • 패킷 손실, 중복, 순서 뒤바뀜이 발생하더라도 이를 감지하고 복구한다.
  • 이 특성 덕분에 HTTP는 복잡한 오류 처리 없이 애플리케이션 로직에 집중할 수 있다.


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

프로토콜 스택에서의 HTTP와 HTTPS

  • HTTP는 IP, TCP, HTTP로 구성된 프로토콜 스택의 최상위 계층(애플리케이션 계층)이다.
  • HTTPS는 HTTP에 보안 기능을 추가한 형태로, HTTP와 TCP 사이에 TLS(SSL) 암호화 계층이 위치한다.
  • TLS/SSL은 전송되는 데이터를 암호화하여 도청이나 변조를 방지한다.


TCP 데이터 전송 방식

  • HTTP 메시지는 이미 연결된 TCP 커넥션을 통해 바이트 스트림 형태로 순차 전송된다.
  • TCP는 이 바이트 스트림을 세그먼트(segment)라는 단위로 잘게 나눈다.
  • 각 TCP 세그먼트는 다시 IP 패킷(IP 데이터그램)에 담겨 인터넷을 통해 전달된다.
  • 이 모든 과정은 TCP/IP 스택이 처리하며, HTTP 애플리케이션에는 보이지 않는다.


IP 패킷의 구성 요소

  • IP 패킷 헤더 (보통 20바이트)
  • TCP 세그먼트 헤더 (보통 20바이트)
  • TCP 데이터 조각 (0바이트 혹은 그 이상의 데이터)


IP 헤더와 TCP 헤더의 역할

  • IP 헤더
    • 발신지 IP 주소와 목적지 IP 주소
    • 패킷 크기, TTL(Time To Live), 기타 제어 플래그 포함
  • TCP 세그먼트 헤더
    • 발신지 포트와 목적지 포트 번호
    • TCP 제어 플래그(SYN, ACK, FIN 등)
    • 데이터의 순서와 무결성을 검증하기 위한 순서 번호와 체크섬 포함


세그먼트 기반 전송의 의미

  • TCP는 큰 데이터 스트림을 네트워크 전송에 적합한 크기로 분할한다.
  • 각 세그먼트는 서로 다른 경로로 전달될 수 있지만, 수신 측에서는 TCP가 이를 순서대로 재조립한다.
  • 이를 통해 HTTP는 안정적이고 연속적인 데이터 전송 통로를 확보한다.


1-3. TCP 커넥션 유지하기

TCP 커넥션의 식별 방식

  • 컴퓨터는 동시에 여러 개의 TCP 커넥션을 유지할 수 있다.
  • TCP는 포트 번호를 사용해 여러 커넥션을 구분하고 관리한다.
  • IP 주소는 컴퓨터(호스트)를 식별하고, 포트 번호는 해당 컴퓨터 내의 애플리케이션을 식별한다.


TCP 커넥션을 구분하는 4가지 요소

  • 발신지 IP 주소
  • 발신지 포트
  • 수신지 IP 주소
  • 수신지 포트


4-튜플(4-tuple)의 의미

  • TCP 커넥션은 위 네 가지 값의 조합으로 유일하게 식별된다.
  • 서로 다른 두 개의 TCP 커넥션은 네 가지 값이 모두 동일할 수 없다.
  • 일부 값(IP 주소 또는 포트)이 같을 수는 있지만, 네 값이 모두 같은 경우는 없다.


여러 TCP 커넥션이 공존할 수 있는 이유

  • 같은 목적지 포트(예: 80)를 사용하는 여러 커넥션이 동시에 존재할 수 있다.
  • 같은 발신지 IP 주소를 사용하는 커넥션도 여러 개일 수 있다.
  • 같은 목적지 IP 주소를 사용하는 커넥션 역시 여러 개 존재할 수 있다.
  • 각 커넥션은 4-튜플 조합이 다르기 때문에 충돌 없이 유지된다.


TCP 커넥션 관리의 핵심 요약

  • TCP는 IP 주소 + 포트 번호 조합을 통해 커넥션을 관리한다.
  • 이를 통해 하나의 서버는 수많은 클라이언트 요청을 동시에 처리할 수 있다.
  • HTTP 서버는 이러한 TCP 커넥션 식별 메커니즘 위에서 동작한다.


1-4. TCP 소켓 프로그래밍

소켓 API의 역할

  • 운영체제는 TCP 커넥션 생성과 관리에 필요한 기능들을 소켓 API 형태로 제공한다.
  • 소켓 API는 HTTP 프로그래머에게 TCP/IP의 내부 동작을 숨기고, 단순한 인터페이스만 노출한다.
  • 이 API는 처음에는 유닉스 운영체제용으로 개발되었지만, 현재는 대부분의 운영체제와 프로그래밍 언어에서 지원된다.


소켓 API와 TCP/IP 추상화

  • 소켓 API를 사용하면 TCP 종단점(endpoint) 데이터 구조를 생성하고 관리할 수 있다.
  • TCP 세그먼트 분할, IP 패킷 캡슐화, 재전송, 순서 보장 등의 세부 사항은 모두 운영체제가 처리한다.
  • HTTP 애플리케이션은 이러한 네트워크 세부 구현을 알 필요가 없다.


클라이언트–서버 간 TCP 소켓 흐름

  • 서버는 소켓을 생성하고(socket), 포트를 바인딩한 뒤(bind), 커넥션을 기다린다(listen).
  • 클라이언트는 URL에서 IP 주소와 포트를 얻고, 소켓을 생성한 뒤 서버로 연결을 시도한다(connect).
  • 서버는 클라이언트의 요청을 받아 새로운 커넥션을 생성한다(accept).
  • 커넥션이 성립되면:
    • 클라이언트는 HTTP 요청 메시지를 전송한다(write).
    • 서버는 요청을 읽고 처리한 뒤(read), HTTP 응답을 전송한다(write).
    • 클라이언트는 응답을 읽어 처리한다(read).
  • 트랜잭션이 끝나면 양쪽 모두 커넥션을 종료한다(close).


TCP 소켓 프로그래밍의 핵심 요약

  • 소켓 API는 TCP/IP 네트워크 프로그래밍의 표준 인터페이스다.
  • HTTP는 소켓 API 위에서 동작하며, TCP 커넥션을 직접 제어하지 않는다.
  • 이 추상화 덕분에 HTTP 애플리케이션은 네트워크 세부 구현과 독립적으로 작성될 수 있다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.