[153328] in North American Network Operators' Group
Re: IPv6 day and tunnels
daemon@ATHENA.MIT.EDU (Owen DeLong)
Tue Jun 5 02:20:49 2012
From: Owen DeLong <owen@delong.com>
In-Reply-To: <CAAAwwbV7O=J2=Np4Kn7eve42t=jE05Z0KN5cDQnpJOwTT9aptw@mail.gmail.com>
Date: Mon, 4 Jun 2012 23:18:16 -0700
To: Jimmy Hess <mysidia@gmail.com>
Cc: "nanog@nanog.org" <nanog@nanog.org>
Errors-To: nanog-bounces+nanog.discuss=bloom-picayune.mit.edu@nanog.org
On Jun 4, 2012, at 7:47 PM, Jimmy Hess wrote:
> On 6/4/12, Owen DeLong <owen@delong.com> wrote:
> [snip]
>> Probing as you have proposed requires you to essentially do a binary =
search
>> to arrive
>> at some number n where 1280=E2=89=A4n=E2=89=A49000, so, you end up =
doing something like
>> this:
> [snip]
>> So, you waited for 13 timeouts before you actually passed useful
>> traffic? Or, perhaps you putter along at the lowest possible MTU =
until you
> [snip]
> Instead of waiting for 13 timeouts, start with 4 initial probes in
> parallel, and react rapidly to the responses you receive; say
> 9000,2200, 1500, 830.
>=20
What's the point of an 830 probe when the minimum valid MTU is 1280?
> Don't wait until any timeouts until the possible MTUs are narrowed.
>=20
>=20
> FindLocalMTU(B,T)
> Let B :=3D Minimum_MTU
> Let T :=3D Maximum_MTU
> Let D :=3D Max(1, Floor( ( (T - 1) - (B+1) ) / 4 ))
> Let R :=3D T
> Let Attempted_Probes :=3D []
>=20
> While ( ( (B + D) < T ) or Attempted_Probes is not Empty ) =
do
> If R is not a member of Attempted_Probes or Retries < =
1 then
> AsynchronouslySendProbeOfSize (R)
> Append (R,Tries) to list of Attempted_Probes if not =
exists
> or if (R,Tries) already in list then increment =
Retries.
Did I miss the definition of Tries and/or Retries somewhere? ;-)
> else
> T :=3D R - 1
> Delete from Attempted_Probes (R)
> end
>=20
> if ( (B + D) < T ) AsynchronouslySendProbeOfSize =
(B+ D)
> if ( (B + 2*D) < T ) AsynchronouslySendProbeOfSize (B+ =
2*D)
> if ( (B + 3*D) < T ) AsynchronouslySendProbeOfSize (B+ =
3*D)
> if ( (B + 4*D) < T ) AsynchronouslySendProbeOfSize (B+ =
4*D)
>=20
Shouldn't all of those be <=3D T?
> Wait_For_Next_Probe_Response_To_Arrive()
> Wait_For_Additional_Probe_Response_Or_Short_Subsecond_Delay()
> Add_Probe_Responses_To_Queue(Q)
Not really a Queue, more of a list. In fact, no real need to maintain a =
list at all,
you could simply keep a variable Q and let Q=3Dmax(Q,Probe_response)
> R :=3D Get_Largest_Received_Probe_Size(Q)
Which would allow you to eliminate this line altogether and replace R =
below with Q.
> If ( R > T ) then
> T :=3D R
> end
>=20
> If ( R > B ) then
> B :=3D R
> D :=3D Max(1, Floor( ( (R - 1) - (B+1) ) / 4 ))
> end
> done
>=20
> Result :=3D B
>=20
>=20
> #
>=20
> If you receive the response at n=3D830 first, then wait 1ms and send =
the
> next 4 probes 997 1164 1331 1498, and resend the n=3D1500 probe
> If 1280 is what the probe needs to detect. You'll receive a
> response for 1164 , so wait 1ms then retry n=3D1498
> next 4 probes are 1247 1330 1413 1496
> if 1280 is what the probe needs to detect, You'll receive a
> response for 1247, so wait 1ms resend n=3D1496
> next 4 probes are 1267 1307 1327 1347
> if 1280 is what you neet to detect, you'll receive
> response for 1267, so
> retry n=3D1347 wait 1ms
> next 4 probes are: 1276 1285 1294 1303
> next 4 probes are: 1277 1278 1279 1280
> next 2 parallel probes are: 1281 1282
>=20
> You hit after 22 probes, but you only needed to wait for n=3D1281 =
n=3D1282
> and their retry to time out.
>=20
But that's a whole lot more packets than working PMTU-D to get there and
you're also waiting for all those round trips, not just the 4 timeouts.
The round trips add up if you're dealing with a 100ms+ RTT. 22 RTTs at
100ms is 2.2 seconds. That's a long time to go without first data packet
passed,
Owen