[Interest] TCP ACK with QDataStream -- OR: disconnect race condition detection
Thiago Macieira
thiago.macieira at intel.com
Mon Sep 10 13:19:23 CEST 2012
On segunda-feira, 10 de setembro de 2012 12.54.50, Till Oliver Knoll wrote:
> Then it is about time that the Qt docs be corrected:
>
> "The bytesWritten() signal is emitted when data has been written to the
> socket (i.e., when the client has read the data)."
>
> With emphasis on "the client has read the data" that implies to me that the
> client has ACK'ed (on the Transport / TCP layer) the data.
>
> http://qt-project.org/doc/qt-4.8/qabstractsocket.html
Thanks for pointing it out. Correcting:
https://codereview.qt-project.org/34513
> > There's simply no way to get the number of bytes ACK'ed from the other
> > side. I did search the Linux TCP API yesterday and I couldn't find
> > anything suitable.
>
> That comes as a surprise.
It's not, if you read this part:
> > And even if there were such a way, the ACK information is useless, since
> > the application on the other side may never read from the socket.
>
> That's what I said. See my other notes about "At least/most/exactly once"
> semantics.
>
> However I dare to say that for most "desktop networking applications" it is
> "good enough" to know the number of bytes vacing been ACK'ed by the
> client's Transport layer - if they care at all.
>
> So no, I don't quite agree that this information is "entirely useless"
> (however I agree that if you're serious about e.g. "reliable message
> delivery" you'd want to combine that information with an Application layer
> protocol of some sort).
It's a layering violation for the Application layer to depend on how the
Transport layer works. As I pointed out, the Transport layer may deliver the
bytes and even ACK them, but the Application layer above may never receive
them, for a variety of reasons.
For example, the application may exit unexpectedly before reading those bytes.
It may fail to decrypt them (Presentation layer). It may decrypt them and fail
to parse them. And even if the socket correctly delivers the bytes and they
are interpreted correctly, the application may fail to act on them (e.g.,
delayed action).
For all those reasons and many others, the information is useless. Why does
the local-side application care that the bytes were received? Since the layers
above Transport can still fail, the information is useless.
It cares that the bytes were correctly interpreted and that the requested
action was taken. That requires an Application-layer acknowledgement.
> >> .... Qt is
> >> /not/ one of them. ;)
> >
> > It is.
>
> Not according to the documentation ;)
Not for long.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
Intel Sweden AB - Registration Number: 556189-6027
Knarrarnäsgatan 15, 164 40 Kista, Stockholm, Sweden
More information about the Interest
mailing list