[e2e] The One and Only True Push
David P. Reed
dpreed at reed.com
Thu Jan 13 13:31:41 PST 2005
Regarding "true push" - that's not what I was concerned about, but Bob's
right. TCP isn't the Berkeley sockets API. If "push" is missing from
the API, that's not the protocol's fault... it's been there from the start.
In fact, when we split functionality specifically there in NCP only for
Telnet out (here's another story from my own days designing TCP) we
implemented the "urgent pointer" (which was pretty much from my DSP
protocol, so blame me) and that was supposed to be an end-to-end Push,
meaning to the TCP on the other end precisely that "your app client
needs to process all the buffered data, including sender, network and
receiver buffers, in order at high speed up to the sequence number in
the urgent pointer, because something important to you is contained
therein". The urgent pointer was a monotone pointer supposed to be the
max of all urgent pointer values ever set by the sender, and
retransmitted packets were supposed to get the latest (maximum).
That's TRUE PUSH.
Sadly, the Unix implementors, who were typically arrogant OS guys and
weren't at the meetings where we hashed this out, misunderstood the
point, and felt that the urgent pointer should not show through in the
sockets API they supported, so people didn't use it as the general
end-to-end push it was meant to be. Instead, people were looking for
"process interrupt" functionality (which was part of Telnet, not part
of TCP) and persisted in misunderstanding the point of the layer
separation. They perseverated on "acking" each urgent pointer value,
even though the point was that the INTERRUPT was encoded in the data
stream, and thus encumbered the PUSH, at least on Berkeley UNIX systems,
with app layer semantics that it should never ever have had.
More information about the end2end-interest
mailing list