- From: Zhong Yu <zhong.j.yu@gmail.com>
- Date: Wed, 28 Nov 2012 12:20:06 -0600
- To: Willy Tarreau <w@1wt.eu>
- Cc: HTTP Working Group <ietf-http-wg@w3.org>
Willy, I thought the term "lingering closed" in the section is self-defined a server can perform a lingering close on a connection by [steps...] the word linger here has nothing to do with its usage elsewhere, like SO_LINGER option. I might be wrong if the word "linger" carries a meaning not defined here but well known to the readers. Please clarify. At least the word is not in the TCP spec. Regardless, I certainly do not suggest to abortively close a connection without seeing outbound data ACK-ed. My point is, the half-close step is not necessary. More inline comments below... On Wed, Nov 28, 2012 at 11:44 AM, Willy Tarreau <w@1wt.eu> wrote: > On Wed, Nov 28, 2012 at 11:08:42AM -0600, Zhong Yu wrote: >> http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-21#section-6.2.5 >> 6.2.5. Tear-down >> >> A server that receives a close connection option *MUST initiate a >> lingering close* of the connection after it sends the final response >> to the request that contained close. >> >> A server that sends a close connection option *MUST initiate a >> lingering close* of the connection after it sends the response >> containing close. >> >> The 2 MUSTs (of lingering close) are too strong here; a server may >> reason that a simple close is enough since there shouldn't be any more >> data from client, due to >> 1. the request is HTTP/1.0 without "Connection:keep-alive". >> 2. the request contains "Connection:close" >> We can weaken the texts to "MUST close the connection", and discuss >> later when a "lingering close" is needed. >> >> The description of "lingering close" also seems a little off. We >> shouldn't ask servers to "half-close" first, because >> >> 1. Half-close is useless since an HTTP/1.1 client usually won't >> detect it. The client reads to the end of the response and stops, it >> won't read again to find out the EOF. (For HTTP/1.0, EOF is required, >> but it's not part of the discussion of lingering close) > > No, there are several issues with this, among which : > - bogus clients which still send a late CRLF after a POST will trigger > an immediate reset from the server's TCP stack before the end of the > transfer if the connection is closed without lingering. This results > in the common problem of truncated responses ; It's solved by the draining step, not by half-close > - "lingering" here clearly means the work performed by the TCP stack > which is performed by default. If we remove this and talk about > just a close, some people will believe that they can explicitly > disable lingering, which is totally wrong as this also kills all > pending data and truncates the response as well. I do not suggest to disable "lingering" in that sense. > The main problem is that HTTP is not well suited for use with TCP (!). > But we have it now and we must do whatever we can to maximize chances of > successful transfers. The two problems of TCP are : > - application is not aware that the remote end has received everything. > An application-level ACK from the client would have solved this ; > > - client must never be encouraged to close first otherwise it quickly > faces the 2 MSL problem with sockets in TIME-WAIT and cannot open new > ports for several minutes whatever the setsockopt() it did. Still, > sometimes we don't have much choice. > >> 2. Some APIs do not support half-close. Examples in Java: SSL >> socket, Netty channel. > > Then these ones most likely perform the half-close transparently for you, > and certainly don't disable lingering! It's impossible in these APIs to half-close first, then read; therefore the current description of "lingering close" cannot be implemented in these APIs. > > I think the wording is appropriate here. If it's ambiguous, maybe it could > be improved, but I didn't find anything useless there at least. > > Regards, > Willy >
Received on Wednesday, 28 November 2012 18:20:40 UTC