- From: David Orchard <dorchard@bea.com>
- Date: Thu, 26 Jan 2006 15:21:42 -0800
- To: "Patrick R. McManus" <mcmanus@datapower.com>, "Mark Baker" <distobj@acm.org>
- Cc: "Rich Salz" <rsalz@datapower.com>, <xml-dist-app@w3.org>
I like the use of the word yum. It seems like you've teased out an excellent point, which is "who's fire and forget" is it. We seem to agree that from the client perspective it's not f-a-f, but from the server perspective with some squinting we could see that it is firing back a response and forgetting the client connection. However, I think that is just request-optional-soap-response, that it's still http request-response. More to the point, I don't see why we'd need an request-optional-soap-response mep AND a f-a-f mep where f-a-f is interpreted as you suggested on the server. Cheers, Dave > -----Original Message----- > From: Patrick R. McManus [mailto:mcmanus@datapower.com] > Sent: Tuesday, January 24, 2006 9:11 AM > To: Mark Baker > Cc: Rich Salz; David Orchard; xml-dist-app@w3.org > Subject: Re: The deep difference between request/response andfire-and- > forget > > Hello, > > I have some comments regarding a fire-and-forget implementation over > HTTP. > > HTTP/1.1 as defined by RFC 2616 doesn't leave any doubt in my mind that > every valid HTTP transaction requires both a request and response. > Response entites can be zero length of course, but a minimal response > header must be produced. It seems inappropriate to me to create a higher > level MEP recommendation that encourages non-compliant use of a lower > layer protocol. > > >>> > >From 2616 > 1.4 Overall Operation > > The HTTP protocol is a request/response protocol. A client sends a > request to the server in the form of a request method, URI, and > protocol version, followed by a MIME-like message containing request > modifiers, client information, and possible body content over a > connection with a server. The server responds with a status line, > including the message's protocol version and a success or error code, > followed by a MIME-like message containing server information, entity > metainformation, and possible entity-body content. > >>> > > Any HTTP server that does not produce a response is a non-compliant > server. Any HTTP client that does not consume the response will generate > a TCP RST packet back towards the server. This is an error condition at > the TCP level. Again, it seems inappropriate to me to create a higher > level MEP recommendation that encourages implementations that would > create TCP layer errors for the base "working" case. > > It has been suggested to me that servers of this type won't create > responses and clients won't expect them - so you won't get the impedance > mismatch and the RST generated. However, what that scenario describes is > a fine application level protocol - but it isn't HTTP. > > My sniff test for "is it HTTP?" is "does it run through an unmodified > HTTP Proxy?". That would seem to be one of the major advantages of > specing this over HTTP afterall. This scenario will definitely throw > errors in the proxy on the server-facing side (server hangup before > expected response) which will result in the proxy generating a 500 based > response on the client-facing side which will in turn generate a TCP RST > when it gets to the client. At this point system monitoring software > both on the proxy server and network levels is firing off alarms all > over the place. You might even get the client's address automatically > blocked if this is done repeatedly and systematically. yum! > > Additionally, as has already been noted this "close after send" approach > means you can't use persistent connections. Do not underestimate the > relevance of this choice. The standardization of HTTP/1.1 was driven > largely by the need to introduce that single feature (which of course a > variant of got added defacto to HTTP/1.0 in parallel to the HTTP/1.1 > process as that was going on because the standardization process was > long.). Making a recommendation in 2006 that ignores this lesson learned > in 1996 is like designing a transport protocol today without congestion > control - a poor decision. > > I think the appropriate HTTP FNF binding is to spec that the response is > ignored above the HTTP layer. The preferred implementation would be a > 202 response code with a 0 length body or maybe a 204 response code > (which has no body by definition). This preserves the potential to use > HTTP proxies, pipelining, persistent connections, 'elephant-like' TCP > flows that have much better congestion control properties, etc.. etc.. > There are lot of implied benefits to doing this. > > As to the question of whether this qualifies as FNF - I think it is 97% > the same as the client-close-after-send model. If you think that model > is FNF, then this is basically just as good. Afterall, the client host > isn't really forgetting anything after the application says close() - it > still has a large amount of state stored in the TCP stack which it > slowly (at least in comparison to how fast the CPU could deal with them) > parcels out over time in response to acknowledgments coming back from > the server - perhaps even retransmitting ones it deems lost. That's > hardly pure fire and forget - and the system will scale as a stateful > one would scale - not as a true stateless fnf one would. I don't think > adding a touch more logic into the final state (reading the http > response) really changes the fundamentals of this. > > What really makes it FNF in my mind is that the server can generate that > response as soon as it has received the message. It doesn't need to wait > for processing/forwarding/whatever to wrapup the transport session. > > -Patrick >
Received on Thursday, 26 January 2006 23:22:28 UTC