lxgr
lxgr

Reputation: 3797

Will a TCP RST cause a host to drop the receive buffer?

Upon receiving a TCP RST packet, will the host drop all the remaining data in the receive buffer that has already been ACKed by the remote host but not read by the application process using the socket?

I'm wondering if it's dangerous to close a socket as soon as I'm not interested in what the other host has to say anymore (e.g. to conserver resources); e.g. if that could cause the other party to lose any data I've already sent, but he has not yet read.

Should RSTs generally be avoided and indicate a complete, bidirectional failure of communication, or are they a relatively safe way to unidirectionally force a connection teardown as in the example above?

Upvotes: 2

Views: 3021

Answers (2)

Nikolai Fetissov
Nikolai Fetissov

Reputation: 84151

Application-level close(2) on a socket does not produce an RST but a FIN packet sent to the other side, which results in normal four-way connection tear-down. RSTs are generated by the network stack in response to packets targeting not-existing TCP connection.

On the other hand, if you close the socket but the other side still has some data to write, its next send(2) will result in EPIPE.

With all of the above in mind, you are much better off designing your own protocol on top of TCP that includes explicit "logout" or "disconnect" message.

Upvotes: 1

lxgr
lxgr

Reputation: 3797

I've found some nice explanations of the topic, they indicate that data loss is quite possible in that case: http://blog.olivierlanglois.net/index.php/2010/02/06/tcp_rst_flag_subtleties

http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable also gives some more information on the topic, and offers a solution that I've used in my code. So far, I've not seen any RSTs sent by my server application.

Upvotes: 2

Related Questions