`
yangzb
  • 浏览: 3506878 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Persistent Connections

    博客分类:
  • Java
阅读更多

HTTP Persistent Connections

Persistent Connections

What is HTTP Persistent Connections?

HTTP persistent connections, also called HTTP keep-alive, or HTTP connection reuse, is the idea of using the same TCP connection to send and receive multiple HTTP requests/responses, as opposed to opening a new one for every single request/response pair. Using persistent connections is very important for improving HTTP performance.

There are several advantages of using persistent connections, including:

  • Network friendly. Less network traffic due to fewer setting up and tearing down of TCP connections.
  • Reduced latency on subsequent request. Due to avoidance of initial TCP handshake
  • Long lasting connections allowing TCP sufficient time to determine the congestion state of the network, thus to react appropriately.

The advantages are even more obvious with HTTPS or HTTP over SSL/TLS. There, persistent connections may reduce the number of costly SSL/TLS handshake to establish security associations, in addition to the initial TCP connection set up.

In HTTP/1.1, persistent connections are the default behavior of any connection. That is, unless otherwise indicated, the client SHOULD assume that the server will maintain a persistent connection, even after error responses from the server. However, the protocol provides means for a client and a server to signal the closing of a TCP connection.

What makes a connection reusable?

Since TCP by its nature is a stream based protocol, in order to reuse an existing connection, the HTTP protocol has to have a way to indicate the end of the previous response and the beginning of the next one. Thus, it is required that all messages on the connection MUST have a self-defined message length (i.e., one not defined by closure of the connection). Self demarcation is achieved by either setting the Content-Length header, or in the case of chunked transfer encoded entity body, each chunk starts with a size, and the response body ends with a special last chunk.

What happens if there are proxy servers in between?

Since persistent connections applies to only one transport link, it is important that proxy servers correctly signal persistent/or-non-persistent connections separately with its clients and the origin servers (or to other proxy servers). From a HTTP client or server's perspective, as far as persistence connection is concerned, the presence or absence of proxy servers is transparent.

What does the current JDK do for Keep-Alive?

The JDK supports both HTTP/1.1 and HTTP/1.0 persistent connections.

When the application finishes reading the response body or when the application calls close() on the InputStream returned by URLConnection.getInputStream(), the JDK's HTTP protocol handler will try to clean up the connection and if successful, put the connection into a connection cache for reuse by future HTTP requests.

The support for HTTP keep-Alive is done transparently. However, it can be controlled by system properties http.keepAlive , and http.maxConnections , as well as by HTTP/1.1 specified request and response headers.

The system properties that control the behavior of Keep-Alive are:

http.keepAlive=<boolean>
default: true

Indicates if keep alive (persistent) connections should be supported.

http.maxConnections=<int>
default: 5

Indicates the maximum number of connections per destination to be kept alive at any given time

HTTP header that influences connection persistence is:

Connection: close

If the "Connection" header is specified with the value "close" in either the request or the response header fields, it indicates that the connection should not be considered 'persistent' after the current request/response is complete.

The current implementation doesn't buffer the response body. Which means that the application has to finish reading the response body or call close() to abandon the rest of the response body, in order for that connection to be reused. Furthermore, current implementation will not try block-reading when cleaning up the connection, meaning if the whole response body is not available, the connection will not be reused.

What's new in Tiger?

When the application encounters a HTTP 400 or 500 response, it may ignore the IOException and then may issue another HTTP request. In this case, the underlying TCP connection won't be Kept-Alive because the response body is still there to be consumed, so the socket connection is not cleared, therefore not available for reuse. What the application needs to do is call HttpURLConnection.getErrorStream() after catching the IOException , read the response body, then close the stream. However, some existing applications are not doing this. As a result, they do not benefit from persistent connections. To address this problem, we have introduced a workaround.

The workaround involves buffering the response body if the response is >=400, up to a certain amount and within a time limit, thus freeing up the underlying socket connection for reuse. The rationale behind this is that when the server responds with a >=400 error (client error or server error. One example is "404: File Not Found" error), the server usually sends a small response body to explain whom to contact and what to do to recover.

Several new Sun implementation specific properties are introduced to help clean up the connections after error response from the server.

The major one is:

sun.net.http.errorstream.enableBuffering=<boolean>
default: false

With the above system property set to true (default is false), when the response code is >=400, the HTTP handler will try to buffer the response body. Thus freeing up the underlying socket connection for reuse. Thus, even if the application doesn't call getErrorStream() , read the response body, and then call close(), the underlying socket connection may still be kept-alive and reused.

The following two system properties provide further control to the error stream buffering behavior:

sun.net.http.errorstream.timeout=<int> in millisecond
default: 300 millisecond

sun.net.http.errorstream.bufferSize=<int> in bytes
default: 4096 bytes

What can you do to help with Keep-Alive?

Do not abandon a connection by ignoring the response body. Doing so may results in idle TCP connections. That needs to be garbage collected when they are no longer referenced.

If getInputStream() successfully returns, read the entire response body.

When calling getInputStream() from HttpURLConnection , if an IOException occurs, catch the exception and call getErrorStream() to get the response body (if there is any).

Reading the response body cleans up the connection even if you are not interested in the response content itself. But if the response body is long and you are not interested in the rest of it after seeing the beginning, you can close the InputStream. But you need to be aware that more data could be on its way. Thus the connection may not be cleared for reuse.

Here's a code example that complies to the above recommendation:

try {
	URL a = new URL(args[0]);
	URLConnection urlc = a.openConnection();
	is = conn.getInputStream();
	int ret = 0;
	while ((ret = is.read(buf)) > 0) {
	  processBuf(buf);
	}
	// close the inputstream
	is.close();
} catch (IOException e) {
	try {
		respCode = ((HttpURLConnection)conn).getResponseCode();
		es = ((HttpURLConnection)conn).getErrorStream();
		int ret = 0;
		// read the response body
		while ((ret = es.read(buf)) > 0) {
			processBuf(buf);
		}
		// close the errorstream
		es.close();
	} catch(IOException ex) {
		// deal with the exception
	}
}

If you know ahead of time that you won't be interested in the response body, you should issue a HEAD request instead of a GET request. For example when you are only interested in the meta info of the web resource or when testing for its validity, accessibility and recent modification. Here's a code snippet:

URL a = new URL(args[0]);
URLConnection urlc = a.openConnection();
HttpURLConnection httpc = (HttpURLConnection)urlc;
// only interested in the length of the resource
httpc.setRequestMethod("HEAD");
int len = httpc.getContentLength();

Future directions in the JDK?

  • More aggressive clean-up. An example is measured blocking read when application calls close before finish reading the response body
  • pipelining requests to further increase the network bandwidth utilization and reduce latency
<script src="/js/omi/jsc/s_code_remote.js"></script><script src="http://www-cdn.sun.com/share/metrics/metrics_group1.js"></script>
分享到:
评论

相关推荐

    SignalR Programming in Microsoft ASP.NET

    persistent connections and hubs; multiplatform real-time applications; advanced topics Learn how SignalR uses Websockets when supported by the browser and the server and falls back to other ...

    httpdisk (Support for 64-bit systems)

    该版本修正了: 1. 2009-10-21 Small bug fix for CD-images on Windows Vista and Windows 7. Support for 64-bit systems. 2.... Allow to mount images without ... Added support for persistent connections.

    SignalR – Real-time Application Development, 2nd (pdf英文原版第二版)

    Starting from getting persistent connections with the server, you will learn the basics of connecting a client to the server and how the messaging works. This will be followed by setting up a hub on ...

    Pro ASP.NET SignalR(Apress,2014)

    Next, meet the concepts of hubs and persistent connections and how to use them to build the components of an ASP.NET SignalR application. Find out how to extend, test, debug, configure, scale, and ...

    Pro ASP.NET SignalR Real-Time Communication in .NET with SignalR 2.1(pdf原版)

    Next, meet the concepts of hubs and persistent connections and how to use them to build the components of an ASP.NET SignalR application. Find out how to extend, test, debug, configure, scale, and ...

    elasticsearch-py-6.3.1.pdf

    elasticsearch-py uses persistent connections inside of individual connection pools (one per each configured or sniffednode). Outoftheboxyoucanchoosebetweentwo ...

    SignalR使用例子

    4. **Persistent Connections**:对于不使用 Hub 模式的简单推送,SignalR 也提供了 Persistent Connections 接口,但在这个聊天室示例中,我们主要关注 Hub 模式。 5. **Transport机制**:SignalR 自动检测并使用...

    oreilly-http.pocket.reference.rar_Connections_HTTP协议

    ... 1.3 Client Methods 1.4 Server Response Codes 1.5 Headers 1.6 URL Encoding 1.7 Client and Server Identification 1.8 Referring Documents ... 1.13 Persistent Connections 1.14 Client Caching

    SingnalR基本用法

    4. **Persistent Connections**:除了 Hub 模式,SignalR 还提供了 Persistent Connections 模式,用于更底层的实时通信。这种模式下,服务器可以直接与客户端进行通信,但没有 Hub 那样的对象模型和方法调用的便利...

    PocketSOAP1.5.5

    This is an Open Source [MPL] SOAP client ...HTTP 1.1 support including persistent connections, SSL, proxies, authentication, proxy authentication, redirects, cookies and compression.

    asp.net Signalr即时通讯Demo

    5. **持久连接(Persistent Connections)**:除了Hub之外,SignalR还提供了更底层的Persistent Connections API,适用于那些不需要服务器端状态或更细粒度控制的场景。 6. **集成与部署**:SignalR可以轻松地与ASP...

    SignalR_WebChat.rar

    4. **Persistent Connections**: 在更底层,SignalR 提供了 Persistent Connections API,用于直接处理实时通信的细节,但通常推荐使用更高级别的 Hub API。 **三、ASP.NET 环境中的 SignalR 集成** 要在 ASP.NET ...

    signal实现聊天小工具源码c#

    4. **Persistent Connections**:SignalR 使用 Persistent Connections 实现了长轮询、WebSockets、Server-Sent Events (SSE) 和 Forever Frame 等多种实时通信协议,根据客户端和服务器的支持自动选择最佳的传输...

    Http1.1 RFC2096

    HTTP 1.1 在HTTP/1.0的基础上引入了可持续链接(persistent connections)的概念,旨在减少频繁的TCP连接建立和关闭,以降低网络延迟和提高性能。 在HTTP/1.0中,每次请求/响应交互都会创建一个新的TCP连接,这对于...

    elasticsearch-py-readthedocs-io-en-7.7.1.pdf

    The library supports persistent connections, which means that once a connection is established with an Elasticsearch cluster, it remains open for subsequent requests. This feature improves performance...

    ASP.NET SignalR编程实战(附书中完整Demo示例源码)2019

    5. **持久连接**:SignalR如何处理网络断开和重新连接,以及如何使用Persistent Connections进行低级控制。 6. **实时通信示例**:通过实际的聊天室、实时计分板或协作编辑器等示例,展示SignalR的实时功能。 7. *...

    ASP signalR简单服务器推送功能

    4. **Persistent Connections**:除了Hub模式,SignalR还提供了更底层的Persistent Connection API,适用于不需要服务器端的方法调用的简单推送场景。 在实现ASP.NET SignalR的服务器推送功能时,你需要以下步骤: ...

    ASP.NET SignalR编程实战(附书中完整Demo示例源码).rar

    4. **Persistent Connections**: 在不使用Hub的情况下,SignalR也支持更底层的Persistent Connection API,它提供了一种直接发送和接收消息的方式,适用于不需要复杂逻辑的情况。 **SignalR的工作原理** SignalR...

    MidtermExam_吴先_13000128171

    Persistent and non-persistent connections refer to how multiple data segments are handled after the connection is established. While they can impact overall transmission efficiency, they do not alter...

    HTTP协议(HyperText Transfer Protocol,超文本传输协议)

    为了改进这些问题,HTTP/1.1在1997年发布,引入了持久连接(Persistent Connections)特性,允许在一个TCP连接上处理多个HTTP请求,大大提高了效率。此外,HTTP/1.1还引入了分块编码、内容协商、缓存控制等一系列...

Global site tag (gtag.js) - Google Analytics