On Wed, May 21, 2025 at 9:38 PM David Benjamin <david...@chromium.org> wrote:
>
> On Wed, May 21, 2025, 20:24 Martin Thomson <m...@lowentropy.net> wrote:
>>
>> Doesn't this same basic problem happen in this simple case?
>>
>> On Thu, May 22, 2025, at 00:59, David Benjamin wrote:
>> >  1. Client sends request
>> >
>> >  2. Server reads request
>> >
>> >  3. Server sends response
>> >
>> >  4. Server closes connection
>> >
>> >  5. Client reads response
>> >
>> >  6. Client closes connection
>>
>> Maybe the client is not pushing data at the server after step 4, but there 
>> is a chance that the client believes that some TCP segment was lost, causing 
>> the client to retransmit what it thinks is lost.  When that retransmission 
>> arrives at the server, the server might generate a RST in response if it has 
>> discarded state.
>
>
> With the caveat that I'm not a TCP expert and did most of my exploring here a 
> whole back, no, that's not right.
>
> As I understand, that will not cause a RST. TCP would be truly non-functional 
> if that were the case! If it's a retransmit of data you've received, I 
> believe that's all fine. I expect it'll just ACK it. It's specifically data 
> that will never be read that TCP treats as an error condition.
>
>> The same applies if the client has any cause to send more data at that 
>> point.  That is, in a slightly more complex protocol interaction.
>
>
> Right, now that one TCP considers an error condition if the server closes the 
> connection.
>
> Of course, if the server is expecting that data, having implemented an 
> application protocol where that data exists, the server won't close the 
> connection and presumably it'll eventually read the data. But TCP considers 
> it an error condition if one side writes data that the other side doesn't 
> eventually read.
>
> As far as I can tell, you're just not supposed to design protocols stop TCP 
> where one side sends data that the other side is not always expected to read.
>
> Indeed simply saying "this was a mistake in TCP" is complicated. Suppose TCP 
> did *not* treat this as a reset condition. Then we'd be in al position where 
> the closed receiver never ACKs anything either, which means the other side 
> can never progress its send window. If the other side is trying to write too 
> much data to fit in the send window, it will get stuck. This is discussed in 
> https://www.rfc-editor.org/rfc/rfc2525#page-50
>
>> The underlying problem is that the server is closing and discarding state 
>> prematurely.  That's a general problem with TCP.  State synchronization in 
>> protocols is a challenging problem and ultimately any clean transition, 
>> whether it be connection establishment or closure, requires three messages 
>> or 1.5 RTT to execute.  You can try to use timers, if you are willing to 
>> accept some rate of things being left hanging, which is what most session 
>> close arrangements end up using, because that's often good enough.  There's 
>> a bunch of text in QUIC, where we "solved" this problem using timers after 
>> spending a bunch of time on trying to find something better than the full 
>> 1.5 exchange.
>>
>> The general advice I'd give is to not discard state immediately after 
>> initiating a close, at least for long enough to ensure that any delayed 
>> activity doesn't trigger an unwanted reset reaction.
>
>
> The application using TCP doesn't get a choice in what TCP does when closing 
> a socket.TCP is simply defined so that extra data after a close is an error 
> condition. Once it sees that error condition, it resets and all bets are off. 
> (If it closes without this error condition, that is fine and you'll be in one 
> of the various wait states for a bit to finish everything up like 
> retransmitting stuff.)
>
> Likewise, TLS is somewhat constrained because it is sandwiched between an 
> application layer that expects a TCP-like thing from TLS and expects TLS to 
> run stop a TCP-like thing.
>
> If there is a general lesson it is that, when working on specifically TLS 
> over TCP, we have to be wary of any time we write "out of turn" or 
> "unexpectedly" from the point of view of the application. The TCP interface 
> does not like it.
>
> And yeah a protocol that isn't layered atop TCP gets to invent all its own 
> rules here and can avoid all this mess. But TLS over TCP still exists, so 
> this is the world we're all in. These sorts of issues happen in reality and 
> lead to weird flaky effects. Having diagnosed one, I like to send these just 
> because, as long as we work on such protocols, I think it's useful to detail 
> them to the WG for broader awareness.

I for one definitely appreciate these kinds of emails. It could well
save someone a late night (or a week of late nights) somewhere, even
if it doesn't result in textual changes to an RFC to try to preempt
the mistakes.
>
> David
>
> _______________________________________________
> TLS mailing list -- tls@ietf.org
> To unsubscribe send an email to tls-le...@ietf.org



-- 
Astra mortemque praestare gradatim

_______________________________________________
TLS mailing list -- tls@ietf.org
To unsubscribe send an email to tls-le...@ietf.org

Reply via email to