If you ping A from B, and you don't get an answer then you don't
know what happened.
It could be that the ping in the forward direction was dropped or the
response in the reverse direction. What you actually end up measuring
is something like: 1-(B->A | A->B) and its pretty tough to separate the
different drop probabilities unless you assume they're the same.
Obviously an easy way to deal with this is to measure the connection on
both sides and correlate the results (which is what Paxon did), but this
has the downside of requiring you to install measurement software at
every two points you wish to measure between.
However, we think its possible to do this purely from the sender by
using the sequence numbers and duplicate acks that TCP uses for
correctness. For a a second, forget that TCP is a transport protocol and
pretend that its really just a loss measurement server that tells you
which packets arrived and which didn't.
If you send a TCP packet from A to B and the packet is dropped in the
forward direction, then B will have no record of it arriving. If
another packet with higher sequence numbers is sent to B and it arrives,
then B will respond with a duplicate acknowledgement (indicating a loss
in the forward direction).
Similarly, if A sends a packet to B and the packet is delivered, but the
acknowledgement is dropped, then this can be seen because no
acknowledgement is received yet when a subsequent packet is sent its
sequence number is acknowledged (and a duplicate ack is not sent).
It gets a bit tricky when you have multiple losses (e.g. A sends two
packets to B and both are lost) but it still seems doable (wait and see
how the sequence space is filled in as the first packet is
retransmitted, etc...) at least up to some number of consecutive errors
(which should allow you to capture the vast majority of the error cases
seen).
This isn't a front burner item, but it feels like its a three-afternoon
tool to hack-up and could actually be somewhat useful.
- Stefan
P.S. Another fun tool to hack up is the web server load tester... Since
initial sequence numbers aren't randomized (they're supposed to be but
most implementations don't... they just increment), you can roughly
measure the number of connections.a web server is getting by sending
pairs of connection requests closely spaced and looking at how ISS
changed between the two requests.