- From: Jeffrey Mogul <mogul@pa.dec.com>
- Date: Wed, 10 Oct 2001 16:09:18 -0700
- To: Matt Black <MBlack@Smart421.com>
- Cc: "'http-wg@cuckoo.hpl.hp.com'" <http-wg@cuckoo.hpl.hp.com>
Matt Black <MBlack@Smart421.com> writes: I am seeing SilverStream servers closing HTTP/1.1 connections immediately after a small random number of GET requests without notice - no 'connection: close' response header is returned with the last successful request. Is this behaviour consistent with a) the spirit of the RFC b) the letter of the RFC Answer: (b) See RFC2616, section 8.1.4 (Practical Considerations): A client, server, or proxy MAY close the transport connection at any time. For example, a client might have started to send a new request at the same time that the server has decided to close the "idle" connection. From the server's point of view, the connection is being closed while it was idle, but from the client's point of view, a request is in progress. This means that clients, servers, and proxies MUST be able to recover from asynchronous close events. The use of "Connection: close" is a SHOULD-level requirement in the case where "the server chooses to close the connection immediately after sending the response" (section 8.1.2.1), but since you say that the server in your case is waiting 0.5 seconds, it's hard to say if this is really "immediately" or if it is just a shorter delay than you like. I understand that servers will close idle connections after some time, but in this case a FIN packet arrives typically within 0.5 seconds of the last successful request, which may be before or after the client has sent the next request. The client is not pipelining requests - it waits for a response to each request before submitting the next - but does not expect the behaviour described above. The servers in question are not stressed. The client is *required* to expect that behavior -- see the MUST-level requirement quoted above. If this behaviour is normal, can you confirm the natural corollary to this - that any HTTP/1.1 client must cope with a 'null' response to any 2nd or subsequent HTTP/1.1 request by creating a new socket and re-submitting the request - even where no 'connection: close' response header was included with the previous response? Section 8.1.4 goes on to say: Client software SHOULD reopen the transport connection and retransmit the aborted sequence of requests without user interaction so long as the request sequence is idempotent (see section 9.1.2). Non-idempotent methods or sequences MUST NOT be automatically retried, although user agents MAY offer a human operator the choice of retrying the request(s). Confirmation by user-agent software with semantic understanding of the application MAY substitute for user confirmation. The automatic retry SHOULD NOT be repeated if the second sequence of requests fails. -Jeff P.S.: My personal belief is that a well-implemented server with sufficient resources will try to keep a persistent connection open for as long as possible. The specification, however, does not require this, and in many server architectures it seems to be difficult to maintain large numbers of idle connections without excessive resource consumption.
Received on Thursday, 11 October 2001 00:22:18 UTC