HTTP Client FIN-ACK

Ray Racine ray.racine at gmail.com
Mon Sep 8 01:15:08 MSD 2008


NOT sure this is a nginx problem, but I thought I'd pass it along.

I have a small custom Scheme HTTP library that uses its FFI to call Linux
socket APIs.  In other words, its a home brew implementation.  I have used
it to do various HTTP GETs/POSTs for RSS, JSON, etc with success.

However, when I attempted to do a simple RSS fetch from a site which
responds as  Server: nginx/0.6.25,  I observed an immediate, and unexpected,
socket close (reset by peer) from nginx.    I suspect it might be nginx and
how it handles TCP connections and not the 3rd server application (
www.blippr.com).  Though it could be the application.

Here is the sequence of events.

1) Client connects fine.  TCP connect is standard 3-way handshake.  SYN,
SYN-ACK, ACK
2) My cliient sends a well-formed HTTP GET request for RSS content.
3) My client library then closes my half of the duplex connection via
"shutdown SHUT_WR".  This means at the TCP level a FIN/ACK is sent to nginx.
(Semantically this means, the client will not be sending any more data.)
4) nginx immediatly responds with a ACK, and then closes the socket without
a response, by sending its own FIN/ACK, to which the client sends an ACK.
In other words a standard 4-way TCP teardown. (Semantically nginx sending
its own FIN/ACK means no more data will be sent.)

>From what little I understand, it appears nginx is incorrectly interrupting
the  SHUT_WR (sends a FIN/ACK) as an end TCP connection.  Not as "no more
data will be sent on the write half (from the client) of the duplex TCP
connection.

However, I think the TCP correct behaviour for nginx should be to respond
the HTTP request.  Even though the client intiated SHUT_WR  this only
indicates no further data will be sent by the client, to which nginx should
respond with an ACK, but _not_ close the connection until after sending the
HTTP response and then sending its own FIN/ACK.

The above 1-4 sequence works fine with all other  HTTP servers I've called
to date.

I do successfully recieve a response _if_ I do _not_ do a call "shutdown
SHUT_WR" after sending the HTTP GET request, which is the workaround.

Given my limited knowledge this what I think I'm seeking.  It IS very
possible that nginx is not at fault here, but I thougt I'd pass it along.

Ray.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx/attachments/20080907/9a10729e/attachment.html>


More information about the nginx mailing list