TCP Servers: Drop Connection, instead of resetting or responding?

Problem

Is it possible in Node.JS to "drop" a connection in such a way that

  • The client never receives a response (200, 404 or otherwise)
  • The client is never notified that the connection is terminated (never receives connection reset or end of stream)
  • The server's resources are released (the server should not attempt to maintain the connection in any way)

I am specifically asking about Node.JS HTTP Servers (which are really just complex TCP servers) on Solaris., but if there are cases on other OSes (Windows, Linux) or programming languages (C/C++, Java) that permit this, I am interested.

Why do I want this?

To annoy or slow down (possibly single-threaded) robots such as phpMyAdmin Probe.

I know this is not really something that matters, but these types of questions can better help me learn the boundaries of my programs.

I am aware that the client host is likely to re-transmit the packets of the connection since I am never sending reset.

Problem courtesy of: George Bailey

Solution

These are not possible in a generic TCP stack (vs. your own custom TCP stack). The reasons are:

  1. Closing a socket sends a RST
  2. Even if you avoid sending a RST, the client continues to think the connection is open while the server has closed the connection. If the client sends any packet on this connection, the server is going to send a RST.

You may want to explore firewalling these robots and block / rate limit their IP addresses with something like iptables (linux) or the equivalent on solaris.

Solution courtesy of: jman

Discussion

closing a connection should NOT send an RST. There is a 3 way tear down process.

Discussion courtesy of: anonimous

This recipe can be found in it's original form on Stack Over Flow.