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).
- 클라이언트는 HTTP 요청 메시지를 전송한다(
- 트랜잭션이 끝나면 양쪽 모두 커넥션을 종료한다(
close).
TCP 소켓 프로그래밍의 핵심 요약
- 소켓 API는 TCP/IP 네트워크 프로그래밍의 표준 인터페이스다.
- HTTP는 소켓 API 위에서 동작하며, TCP 커넥션을 직접 제어하지 않는다.
- 이 추상화 덕분에 HTTP 애플리케이션은 네트워크 세부 구현과 독립적으로 작성될 수 있다.
이 기사는 저작권자의
CC BY 4.0
라이센스를 따릅니다.