(function(h,o,t,j,a,r){ h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; h._hjSettings={hjid:3011767,hjsv:6}; a=o.getElementsByTagName('head')[0]; r=o.createElement('script');r.defer=1; r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; a.appendChild(r); })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');

HTTP Keep-Alive Guide: Reduce Latency and Speed Up

Published on July 2, 2025
Last Updated on July 4, 2025

Written by

Morgan Frank - Specialist in Page Speed

When a browser requests a webpage, it needs to establish a connection with the web server. With older versions of HTTP (like HTTP/1.0), the browser would open a new connection for every single request (every image, CSS file, JavaScript file, etc.). This is like calling a restaurant, ordering one item, hanging up, calling back, ordering another item, hanging up, and repeating this process for every item on your order! It’s very inefficient.

HTTP Keep-Alive (also known as persistent connections) solves this problem by allowing the browser to reuse the same connection for multiple requests. It’s like calling the restaurant once and ordering everything you need in a single call. This significantly reduces the overhead of establishing new connections and improves page load times.

Before we get into the details, let’s summarize the key points:

Key Takeaways

  • Keep-Alive Reduces Connection Overhead: It allows the browser to reuse the same TCP connection for multiple HTTP requests, avoiding the need to establish a new connection for each request.
  • Improves Page Speed: Reducing connection overhead leads to faster page load times, especially for pages with many resources.
  • Enabled by Default in HTTP/1.1 and Later: Keep-Alive is enabled by default in HTTP/1.1, HTTP/2, and HTTP/3. You usually don’t need to explicitly enable it.
  • KeepAliveTimeout is Important: This setting controls how long an idle connection remains open. Setting it too high can waste server resources; setting it too low can negate the benefits of Keep-Alive.
  • Not a Replacement for HTTP/2 or HTTP/3: While Keep-Alive is beneficial, HTTP/2 and HTTP/3 offer even greater performance improvements through multiplexing.

How HTTP Keep-Alive Works

  • Initial Request: The browser sends an initial request to the server (e.g., for the HTML of a webpage).
  • Connection: Keep-Alive Header: The browser includes a Connection: Keep-Alive header in the request, indicating that it supports persistent connections. (This is usually done automatically by the browser in HTTP/1.1 and later).
  • Server Response: If the server also supports Keep-Alive (and it’s enabled), it responds with a Connection: Keep-Alive header in its response.
  • Multiple Requests over the Same Connection: The browser can now send multiple requests (e.g., for images, CSS files, JavaScript files) over the same TCP connection, without having to establish a new connection for each request.
  • Connection Closure: The connection remains open for a certain period of inactivity (the KeepAliveTimeout). If no further requests are made within that time, the connection is closed. The connection can also be closed if either the browser or the server explicitly requests it (using a Connection: close header).
2 1

Benefits of Keep-Alive

  • Reduced Latency: Establishing a TCP connection involves a “three-way handshake” (SYN, SYNACK, ACK,) which takes time. Keep-Alive avoids this overhead for subsequent requests.
  • Faster Page Load Times: Reduced latency directly translates to faster page load times, especially for pages with many resources.
  • Reduced Server Load: The server doesn’t have to spend as much time and resources establishing new connections.
  • Improved Network Efficiency: Fewer connections mean less network congestion.

Keep-Alive and HTTP Versions

  • HTTP/1.0: Keep-Alive was not part of the original HTTP/1.0 specification, but it was often implemented as an extension. You had to explicitly request it using the Connection: Keep-Alive header.
  • HTTP/1.1: Keep-Alive is enabled by default in HTTP/1.1. You don’t need to explicitly request it (although you can explicitly disable it with Connection: close).
  • HTTP/2 and HTTP/3: Keep-Alive is inherent in the design of HTTP/2 and HTTP/3. These protocols use multiplexing, which allows multiple requests and responses to be sent simultaneously over a single connection.

The KeepAliveTimeout Setting

The KeepAliveTimeout setting is crucial for controlling how long an idle Keep-Alive connection remains open.

  • Too High: If the KeepAliveTimeout is set too high, idle connections can consume server resources (memory and file descriptors), potentially limiting the server’s ability to handle new connections.
  • Too Low: If the KeepAliveTimeout is set too low, connections might be closed prematurely, negating the benefits of Keep-Alive.

The optimal KeepAliveTimeout value depends on your website’s traffic patterns and server resources. A common recommendation is to set it to a relatively short value (e.g., 25 seconds).

Configuring Keep-Alive (Examples)

Apache

In Apache, Keep-Alive is typically configured in your main configuration file (e.g., httpd.conf or apache2.conf) or in a virtual host configuration.

 KeepAlive On
 MaxKeepAliveRequests 100  # Maximum number of requests per connection
 KeepAliveTimeout 5  # Timeout in seconds
  • KeepAlive On: Enables Keep-Alive.
  • MaxKeepAliveRequests: Limits the maximum number of requests that can be handled over a single Keep-Alive connection. This helps to prevent a single client from monopolizing a connection.
  • KeepAliveTimeout: Specifies the timeout in seconds.

Nginx

In Nginx, Keep-Alive is configured in the http, server, or location blocks of your configuration file.

http {
     keepalive_timeout 5;  # Timeout in seconds
     keepalive_requests 100; # Maximum number of requests per connection
     }
  • keepalive_timeout: Specifies the timeout in seconds.
  • keepalive_requests: Limits the maximum number of requests.

Keep-Alive vs. HTTP/2 and HTTP/3

While Keep-Alive is a valuable optimization for HTTP/1.1, it’s important to understand that HTTP/2 and HTTP/3 offer even greater performance improvements through multiplexing.

  • HTTP/1.1 with Keep-Alive: Allows multiple requests over a single connection, but the requests are still processed sequentially (one after the other).
  • HTTP/2 and HTTP/3 (Multiplexing): Allow multiple requests and responses to be sent simultaneously over a single connection. This eliminates head-of-line blocking and is much more efficient.

Therefore, while you should ensure Keep-Alive is enabled (it usually is by default), upgrading to HTTP/2 or HTTP/3 is a higher-impact optimization.

Conclusion

HTTP Keep-Alive is a simple but effective technique for improving website performance by reducing the overhead of establishing new connections for each request. It’s enabled by default in HTTP/1.1 and later, but you should still be aware of the KeepAliveTimeout setting and tune it appropriately. While Keep-Alive is beneficial, remember that HTTP/2 and HTTP/3 offer even more significant performance improvements through multiplexing, making them the preferred choice for modern websites.

Shakeeb Sadikeen

The expert that experts learn from

About Author

Determined to change that, he built RapidLoad — a smart, AI-driven tool that empowers site owners to dramatically improve speed scores, enhance user experience, and meet Google’s Core Web Vitals without needing to touch a single line of code.
Connect with Shakeeb Sadikeen

Table of content