| ▲ | jmalicki 4 hours ago | |
The difference between RST and FIN shows up in read() as an ECONNRESET vs end-of-file reading 0. In some protocols, end-of-file has semantic meaning that all data has been transferred, and TCP is set up such that you should be able to rely on that - if you can't rely on that difference, it is a bug in a TCP stack along the way. FIN also has a sequence number, so you can wait to ACK it until you get the corresponding data if it is dropped or out of order. TCP RST says the other side won't be resending if not ACKed, it is reset. Further, the downloading client usually cannot even read any packets in the receive window either once an RST has been received - that might be hundreds of KB of missed data. RST and FIN are very semantically meaningfully different. Reading the post, if gunicorn is e.g. sending a 404 after seeing a POST to a path it doesn't know about before reading the body, the client will never get the 404 because gunicorn hasn't read the message body. This case is partly why "Expect: 100-continue" exists, so it will be properly handled, even if it does introduce an extra round-trip lag in the POST. It might be dangerous to have your protocol rely on a piece of TCP that is often incorrectly implemented. | ||