tcp application exit will send FIN always? - tcp

When a TCP application exits it will send a FIN packet.
Consider a tcp client which get connected to a always listening server(server never exits).
if the tcp client is exiting abruptly after few exchange of packets, will it always send a FIN packet to the server?
Thx!

Under normal operation , a FIN will be sent ,yes.
Here's a few cases where a FIN is not going to be sent.
Someone yanks out the network cable of the client.
The client gets nuked
The FIN packets are dropped on the way.
The OS on the kernel crashes hard.

Related

What will cause tcp delay send packets?

I have a mismatch problem between server process time and client receive time. I have made nagle alogrithm off. and ping rtt seems no problem. so there is any other thing will cause tcp delay send packets, tcp buffer? if it's tcp buffer, how does it make tcp delay send?

When does TCP sends ACK?

I have an application and I am seeing packets being re-transmitted multiple times. connection is reset after multiple re-transmits.
In Wireshark, I can see the packet reaching the server, but I do not see the packet at the application level. I want to know how I can check if the packet is dropped at the TCP layer?
When does TCP send DATA packet ACK? After delivering the packet to an application or after receiving the DATA packet on the socket?
When does TCP send DATA packet ACK? After delivering the packet to an application or after receiving the DATA packet on the socket?
The ACK is sent by the OS after the data are successfully put into the sockets read buffer. No application logic is involved here yet.

Properly terminating HTTP connection from client's side

(Original title: "Weird TCP connection close behavior")
I am troubleshooting TCP connection process using Wireshark. Client opens connection to server (I tried two different servers), and starts receiving long stream of data. At some point in time client wants to stop and sends server [FIN, ACK] packet, but server does not stop sending data, it continues till its own full stream end, and then sends its own completion packet [FIN, PSH, ACK]. I figured it out keeping reading data from the client's socket after client sent FIN packet. Also, after client sent this FIN packet, its state is FIN_WAIT, thus waiting for FIN response from server...
Why servers do not stop sending data and respond to FIN packet with acknowledgment with FIN set?
I would expect, after client sends FIN packet, server will still send several packets which were on the fly before it received FIN, but not the whole pack of long data stream!
Edit: reading this I think that web server is stuck in stage "CLOSE-WAIT: The server waits for the application process on its end to signal that it is ready to close" (third row), and its data sending process "is done" when it flushed all contents to the socket at its end, and this process can not be terminated. Weird.
Edit1: it appears my question is a little different one. I need to totally terminate connection at client's side, so that server stops sending data, and it (server) would not go crazy about forceful termination from client's side, and aborted its data sending thread at its side being ready for next connection.
Edit2: environment is HTTP servers.
The client has only shutdown the connection for output, not closed it. So the server is fully entitled to keep sending.
If the client had closed the connection, it would issue an RST in response to any further data received, which would stop the server from sending any more, modulo buffering.
Why servers do not stop sending data and respond to FIN packet with acknowledgment with FIN set?
Why should they? The client has said it won't send another request, but that doesn't mean it isn't interested in the response to any requests it has already sent.
Most protocols, such as HTTP, specify that the server should complete the response to the current request and only then close the connection. This is not an abnormal abort, it's just a promise not to send anything else.

How to send exactly one Tcp packet unsing netperf/ipperf and confirm using tcpdump about the same?

I am trying to find out a way to send exactly one TCP packet and verify this on Rx side that same has been received (no other packet) using tcpdump. I am new to networking world. Hence any help/explaination would be much appreciated.
These tools are for performance measurements and not for packet crafting. They always establish a full TCP connection for measurements. Since even a TCP connection with no data transfer consists of 6 packets (initial handshake to establish connection and handshake for connection close) you will not be able to send a single TCP packet using these tools.
Just a thought - configure the Rx side NOT to accept a tcp-ip connection from the Tx side, then attempt a connection from Tx side. You should see a (single) SYN packet on the Rx side, to which it won't respond. [Unfortunately, the Tx side will then retry the SYN packet a number of times].

Linux Doesn't Respond to SYN on ESTABLISHED connection

So I have a remote device using a Lantronics XPort module connecting to a VPS. They establish a TCP connection and everything is great. The server ACKs everything.
At some point the remote device stops transmitting data. 30 seconds goes by.
The device then starts sending SYN packets as if trying to establish a new connection. The device is configured to maintain a connection to the server, and it always uses the same source port. (I realize this is bad, but it is hard for me to change)
The server sees a SYN packet from the same (source ip, source port), so the server thinks the connection is ESTABLISHED. The server does not respond to the SYN packet.
Why does the server not respond with ACK as described in Figure 10 in RFC 793? ( https://www.ietf.org/rfc/rfc793.txt )
How can I get the server to kill the connection or respond with an ACK?
It could be the case that during that 30 second silence, the device is waiting for an ACK from the server, and that ACK was dropped somewhere along the line. In this case, I think it should retransmit.
Server is running Ubuntu with kernel 3.12.9-x86_64-linode37
Thank you for any help!
My first suggestion is change the client to use the same connection or to gracefully close the connection before re-opening.
As you DO NOT have control over client and all that can do is on server, you can try this:
Configure keep-alive to be sent after 10 secs of silence and probe only once. If client does not respond, server closes the connection. By doing this, the server should be in listening mode again within 10 seconds of silence without client responding. You can play with the following sysctl's and arrive at optimal values.
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 1
======
Also, regarding missing-ack that you have mentioned in your question, TCP takes care of those things. 30 seconds is too long a time for the first re-transmission from sender. If client/device does not get an ack after 30 seconds, it will/should not try to open a new connection. If you are seeing that, it is an insane-TCP stack at the client. What is that device and which OS/TCP-stack is it using?
it is kernel version has different behavior, ignore any syn packet in kernel 3.12.9-x86_64. but server ack a ack packet, client receive the ack resent rst, and sent new syn in kernel 4.9.0.
incoming-tcp-syns-possibilities
TCP packets ignored on ESTABLISHED connection

Resources