Skip to main content

Command Palette

Search for a command to run...

Keep-Alive (HTTP Keep-Alive와 TCP Keep-Alive)

Published
2 min read

Keep-Alive는 연결(Connection)을 계속 유지하기 위한 메커니즘입니다.

네트워크에서 어떤 연결을 만들고, 요청/응답을 주고받은 후 바로 끊지 않고 일정 시간 동안 유지하면, 그 시간 안에 들어오는 추가 요청은 이미 열린 연결을 재사용할 수 있습니다.

이를 통해 매번 연결을 새로 맺는데 필요한 오버헤드(3-Way Handshake)를 줄일 수 있고, 불필요한 지연(latency)를 감소시킬 수 있습니다.

하지만 연결을 너무 오래 유지하면 사용하지 않는 연결이 쌓여 리소스가 낭비되고, 너무 짧게 유지하면 매 요청마다 연결을 새로 생성해야해서 비효율적입니다.

따라서 적절한 유지시간이 중요합니다.


HTTP Keep-Alive 와 TCP Keep-Alive를 구분해야 하는 이유

Keep-Alive라고 해서 모두 같은 방식으로 동작하는 것은 아닙니다.

네트워크는 여러 계층으로 구성되어 있고, HTTP Keep-Alive는 애플리케이션 계층에서, TCP Keep-Alive는 전송 계층에서 동작합니다.

둘 다 연결을 유지하는 기능이지만, 동작 계층이 다르고 , 목적이 다르고, 관리 주체가 다릅니다.

요약

HTTP Keep-Alive

  • 애플리케이션 계층(HTTP)

  • 하나의 TCP 연결로 여러 HTTP 요청/응답 처리

  • 동일 TCP 연결 재사용 (3-Way Handshake 재실행 방지)

  • 웹 서버/ 애플리케이션이 관리

  • 설정된 Keep-Alive 시간 동안 요청이 없으면 서버가 종료

TCP Keep-Alive

  • 전송 계층(TCP)

  • 유휴(Idle)TCP 연결이 살아있는지 확인이 목적

  • 주기적으로 작은 패킷을 전송해서 연결 상태 확인

  • OS가 관리

  • 설정된 횟수/ 시간 동안 응답이 없으면 OS가 종료


  1. HTTP Keep-Alive

    HTTP Keep-Alive는 동일한 TCP 연결을 재사용해 여러 HTTP 요청/응답을 처리하는 기능입니다.

    매 요청마다 TCP 연결을 새로 만들지 않으므로 지연시간이 줄고 서버 부하가 감소합니다.

    HTTP 응답 헤더 예시

     HTTP/1.1 200 OK
     Connection: Keep-Alive 
     Keep-Alive: timeout=10, max=500
    

    timeout : 마지막 요청 이후 연결을 유지할 시간(초) →10초

    max : 연결 종료 전 처리할 수 있는 최대 요청 수 →500개

    Connection : Close가 응답에 포함되면, Keep-Alive를 사용하지 않고 요청 처리 후 연결을 바로 종료


  2. TCP Keep-Alive

    TCP Keep-Alive는 유휴 상태의 TCP 연결이 유효한지 확인하는 기능입니다.

    운영체제가 주기적으로 작은 Keep-Alive 패킷을 보내 응답 여부를 확인하며 응답이 없으면 연결을 끊습니다.

    Linux 설정 예시

    
     net.ipv4.tcp_keepalive_time = 40    # 최초 Keep-Alive 전송까지 대기 시간(초)
     net.ipv4.tcp_keepalive_intvl = 5    # 재전송 간격(초)
     net.ipv4.tcp_keepalive_probes = 3   # 응답이 없을 때 재전송 횟수
    

    위 설정이라면 40초 동안 응답이 없는 경우 5초 간격으로 3번의 Keep-Alive를 주고 받습니다.

    만약 정상적으로 Keep-Alive를 주고 받지 못했다면(55초) Connection을 종료합니다.

참고 자료:https://sabarada.tistory.com/262

More from this blog

낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)

락(Lock)의 필요성 현대 애플리케이션은 대부분 동시성(Concurrency) 문제에 직면합니다. 여러 사용자나 프로세스가 동시에 같은 데이터를 수정하거나, 은행 계좌 이체와 같은 중요한 트랙잭션을 동시에 실행하는 경우가 있습니다. 이때 동시 접근을 적절히 제어하지 않으면, 데이터 불일치, 중복 처리, 시스템 오류까지 발생할 수 있습니다. 이를 방지하기 위해 락(Lock) 개념이 도입되었습니다. 락은 여러 프로세스나 스레드가 동시에 동일한 자...

Aug 22, 20253 min read

Java 프로그램이 실행되는 흐름

자바 프로그램은 단순히 .java 파일을 실행하는 것이 아니라, 컴파일 → 로드 → 실행 이라는 여러 단계를 거쳐 최종적으로 CPU 가 이해할 수 있는 기계어로 변환됩니다. 이 과정에서 JDK, JVM, JRE가 각각 어떤 역할을 하는지 이해하는 것이 중요합니다. 1. 소스 코드 작성과 컴파일 개발자는 자바 소스 파일(.java)을 작성 JDK 에 포함된 javac (Java Compiler)가 소스 코드를 컴파일 하여 JVM이 이해할 수...

Aug 21, 20252 min read

Java Collection Framework

컬렉션 프레임워크(Collection Framework)란? 자바에서 컬렉션 프레임워크란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스와 인터페이스 집합입니다. 즉, 데이터를 저장하는 자료구조과 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현한 것입니다. 모든 컬렉션 프레임워크는 자바의 인터페이스를 기반으로 구현됩니다. JFC(Java Collection Framework)의 도입 배경 JCF 이전에는 ...

Aug 14, 20254 min read

운영체제의 발전: 단일 프로세스에서 멀티코어까지

운영체제의 발전은 ‘CPU를 얼마나 효율적으로 활용하느냐’의 역사라고 볼 수 있습니다. 초기에는 한 번에 하나의 프로그램만 실행했지만, 점차 CPU 사용률과 사용자 경험을 높이기 위해 멀티프로그래밍, 멀티태스킹, 멀티프로세스, 멀티스레딩, 그리고 멀티코어 구조가 발전했습니다. 들어가기에 앞서 프로세스와 스레드에 대해 간단히 설명하겠습니다. 프로세스(Process) 실행 중인 프로그램으로 OS로부터 독립된 주소 공간과 자원을 할당 받음 각 ...

Aug 13, 20252 min read

gaeng

22 posts