On Sep 21, 2008, at 18:53, Maurizio Lotauro wrote:
> HTTP is stateless, but this has nothing to do with keeping the
> connection open.
> I don't think that a browser reopen the connection for every part that
> compose a
> web page.
> And I don't think also that you close and reopen the connection for
> every file
> you want upload or download to/from an ftp server :-)
I'm sorry but you are confused. HTTP is not like FTP. In HTTP 1.1,
persistent connections were defined but it was a matter of convenience
and they are not required (RFC #2616, Section 8 uses the term "SHOULD"
instead of "MUST" when discussing the negotiation of persistent
connections).
As of HTTP 1.1, persistent connections are the default. But still,
browsers do open multiple connections otherwise all retrieval would be
synchronized, and it's not. They may not create a new connection for
each resource, but the reuse of the connections is pretty much
arbitrary. For the record, prior to 1.1, most servers did not support
persistent connections, and browsers did in fact had to close and
reopen the connection for every file they wanted to upload or download.
Some servers supported the Keep-Alive mechanism, but--again--it was
more of a convenience, and could never be expected to be supported by
either side.
This is why, in my opinion, coercing HTTP as the de facto standard
protocol for all communications in the Internet (as a lot of people are
trying to make it) is stupid. There are better transfer protocols out
there. But this is a rant for another day.
>> From what I understand now about NTLM (still need
>> to learn about it!), it requires the cycle to happen within the same
>> session, which counters the RFC, and thus is an exceptional case.
>
> The basic is the only one that is handled in one step. All others
> needs a
> negotiation. IIRC the NTLM is anomaly is that it is the server that
> starts it
> with the first 401 answer.
Again, wrong. All HTTP authentication uses the same negotiation
mechanism (even since the days of HTTP 1.0), because they authenticate
the *request*:
1. The client requests a resource from the server for the very first
time and it doesn't know it requires authentication.
2. The server responds with an appropriate error code specifying the
authentication mechanism(s) supported (including Basic and Digest).
(At this point, servers or clients using older versions of the HTTP
protocol would have closed the connection.)
3. The client re-sends the request with the appropriate credentials and
the server performs the authorization.
4. On every subsequent request, the client includes the same
credentials and the server re-authenticates the request. (Digest has
some differences, but generally fits this scheme).
Notice that since the protocol is absolutely stateless, the server has
no idea at any point how many requests have been sent, and it doesn't
care. So, the client can remember the specific server's requirements
and send them in subsequent visits. And in fact, this is what browsers
do: from then on, the authentication can be done in a single request,
without the "error" step.
Now, NTLM (yes, finally I read some on it) authenticates the
*connection*, not the request as the HTTP authentications mechanisms
do. This requires that the entire challenge-response cycle be
performed in a single persistent connection. As noted in that link you
sent me, it's actually a bastardization of the protocol: it's not
really part of the HTTP 1.1 protocol, but it uses the standard
mechanisms in a weird way.
Another way that NTLM breaks away from the protocol is that, once the
connection is authenticated, subsequent requests within the same
connection need not perform the challenge-response.
Because of its unique nature (damn you, Microsoft!) I'm sure browsers
treat it as a special case. (I seem to remember having problems with
Firefox 1.x connecting to my office's intranet site, while IE worked
fine. I always knew it had to be some MS extension to the protocol but
didn't know what. Now I do.) Of course, IE will work fine with IIS.
However, it'll be more interesting to find out how IE copes when
dealing with Tomcat, which seems to return an error response right
after the headers.
> In my case the server answers not after the headers but rigth after
> the client
> has sent the first 8193 byte of the SendStream (that is the size of
> the THttpCli
> send buffer).
My guess is that, technically, it's after the headers that the server
reacts, but the first stream buffer (8193 bytes) is already on its way,
since the client didn't stop to check, so they cross in transit. It
could also be that the HttpCli component does not acknowledge the
response until after if finishes sending the buffer (which makes sense,
since it's a single-threaded operation), and this causes the delay in
the receipt of the response.
In any case, I'll see if I can do some experiments with IE and Tomcat
and let you know what I find.
dZ.
--
DZ-Jay [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be