1. HTTP 개요
1) 웹에서의 HTTP

HTTP는 웹 애플리케이션 계층의 프로토콜로 메시지의 구조 및 클라이언트와 서버가 메시지를 어떻게 교환하는지에 대해 정의하고 있습니다. HTTP는 웹의 중심이라고 할 수 있는데 몇가지의 웹 전문 용어를 먼저 알아보겠습니다.
웹 페이지는 객체들로 구성됩니다. 이 객체는 단일 URL로 지정할 수 있는 하나의 파일(HTML, JPEG, 자바스크립트, CSS 등등)입니다.
대부분의 웹 페이지는 기본 HTML 파일과 여러 참조 객체로 구성됩니다. 기본 HTML 파일은 페이지 내부의 다른 객체를 그 객체의 URL로 참조합니다.
다음 URL을 살펴보겠습니다.
https://www.someSchool.edu/someDepartment/picture.gif
여기서 www.someSchool.edu는 호스트 이름이고, /someDepartment/picture.gif는 경로 이름입니다.
웹 브라우저(Web browser)는 HTTP 클라이언트 측을 구현하며 요구한 웹 페이지를 보여주고 여러 가지 인터넷 항해와 구성 특성을 제공합니다. 예시로 자주 사용하는 크롬이 있습니다.
HTTP의 서버 측을 구현하는 웹 서버(Web Server)는 URL로 각각을 지정할 수 있는 웹 객체를 갖고 있습니다.
인기 있는 웹 서버로는 아파치(Apache), 마이크로소프트 인포메이션 서버등이 있습니다.
HTTP는 웹 클라이언트가 웹 서버에게 웹 페이지를 어떻게 요청하는지와 서버가 클라이언트로 어떻게 웹 페이지를 전송하는지 정의합니다.
브라우저는 페이지 내부의 객체에 대한 HTTP 요청 메시지를 서버에게 보내고, 서버는 요청을 수신 후 객체를 포함하는 HTTP응답 메시지로 응답합니다.
2) TCP를 통한 HTTP
HTTP는 TCP를 전송 프로토콜로 사용합니다. HTTP 클라이언트는 서버에 TCP연결을 시작합니다. 연결이 이루어지면, 클라이언트와 서버는 소켓 인터페이스를 통해 TCP로 접속합니다. 클라이언트와 서버는 소켓 인터페이스를 통해 메시지를 주고 받습니다.
여기서 알아두어야 할 점은 서버는 클라이언트에 관한 어떠한 상태 정보도 저장하지 않는다는 것 입니다. HTTP 서버는 클라이언트에 대한 정보를 유지하지 않으므로, HTTP를 비상태 프로토콜(stateless protocol)이라고 합니다. 이를 보완하기 위해 나온것이 쿠키인데 이는 나중에 알아보겠습니다.
비상태 프로토콜은 단순성, 확장성, 자원 관리 효율, 장애 대응 부분에서 장점을 가지고 있습니다.
비상태 프로토콜(무상태 프로토콜, stateless protocol): 수신자가 이전 요청의 정보를 저장하지 않는 프로토콜
2. 비지속 연결과 지속 연결
1) 비지속 연결
비지속 연결을 알아보기 위해 예를 들어보겠습니다.
기본 HTML 파일과 9개의 JPEG이미지 객체로 구성된 페이지를 클라이언트로 전송한다고 가정해봅시다.
기본 HTML 파일의 URL은 다음과 같습니다.
https://www.someSchool.edu/someDepartment/home.index
- 클라이언트는 기본 포트 번호 80을 통해 www.someSchoo.edu 서버로 TCP 연결 시도. 서버와 클라이언트 각각에 소켓 설정
- 설정된 TCP 연결 소켓을 통해 서버로 HTTP 요청 메시지를 보냄.
요청메시지는 /someDepartment/home.index 라는 경로 이름을 포함 - 서버는 설정된 소켓을 통해 메시지를 받음. 저장장치로 부터 /someDepartment/home.index 객체 추출.
메시지에 객체를 캡슐화 하고 소켓을 통해 클라이언트로 보냄 - HTTP 서버가 TCP에게 연결을 끊으라고 지시
- 클라이언트가 응답 메시지를 받으면, TCP 연결이 중단
이를 그림으로 보면 다음과 같습니다.

여기서 RTT(Round-Trip-Time)는 작은 패킷이 클라이언트로부터 서버까지 가고, 다시 클라이언트로 되돌아오는데 걸리는 시간을 의미합니다. 이는 지연(Latency)의 핵심 지표가 되며 RTT 낭비를 줄이는 것이 중요합니다.
RTT(Round-Trip-Time): 작은 패킷이 클라이언트로부터 서버까지 가고, 다시 클라이언트로 되돌아오는데 걸리는 시간
비지속 연결에서는 요청 하나마다 새로운 TCP연결을 맺습니다. 한개의 파일을 주고 받는데 2RTT가 소요되고, HTML 파일과 9개의 이미지 파일을 주고 받기 위해 위와 같은 과정이 10번 일어납니다. 총 10번의 통신을 해야하니 20 RTT라고 표현할 수 있습니다.
비지속 연결은 각 요청마다 TCP 연결을 새로 만들고 끊기 때문에 부하가 걸릴 수 있고, 각 객체가 2 RTT를 필요로 한다는 단점이 있습니다.
2) 지속 연결(Keep-alive)
HTTP/1.1의 지속 연결에서 서버는 응답을 보낸 후에 TCP 연결을 그대로 유지합니다. 이전과 같은 상황에서 전체 웹페이지(10개의 객체)를 하나의 지속 TCP 연결을 통해 보낼 수 있습니다. 예시에서는 처음 한번만 TCP 연결을 맺고, 그 뒤엔 같은 연결을 재사용하기에 2 RTT + 9 RTT = 11 RTT로 반 가까이 줄어듭니다.
또한 이들 객체는 진행 중인 요구에 대한 응답을 기다리지 않고 연속해서 만들어(파이프라이닝) 속도를 높일 수 있습니다. 실질적으로 줄어드는 속도는 반 이상이라는 뜻이 됩니다.
HTTP 서버는 일정 기간 사용되지 않으면 연결을 닫습니다. 아니면 최대 요청 횟수를 주고서 도달하면 연결을 끊거나 명시적으로 종료하는 방식을 사용할 수 있습니다.
자주 사용했던 fetch, axios, restTemplate, webclient 들이 이러한 keep-alive 방식을 기본으로 사용합니다.
정말 오랜만에 블로그를 작성하는것 같습니다.
일이 너무 바빴습니다... 자연스레 블로그를 뒤로 미루게 되더라구요..
원하는 만큼 분량이 안나올것같아서 나중에 할라다가 분량을 줄이더라도 쓰는게 맞겠다 싶어서 작성했습니다.
앞으로도 분량을 줄이고 좀 더 꾸준히 쓰는 방식으로 진행하는게 좋을것같습니다.
'CS > 네트워크' 카테고리의 다른 글
| [네트워크] 사용자와 서버 간의 상호작용 쿠키 (2) | 2025.09.18 |
|---|---|
| [네트워크] HTTP 메시지 포맷 (0) | 2025.09.02 |
| [네트워크] 네트워크 애플리케이션의 원리 (6) | 2025.08.13 |
| [네트워크] TCP/IP 5계층과 캡슐화 (4) | 2025.08.05 |
| [네트워크] 패킷 교환 네트워크에서의 지연, 손실과 처리율 (3) | 2025.07.28 |