[Twisted-Python] Writing a low-level network debugging tool
Jonathan Ballet
jon at multani.info
Thu Dec 3 02:02:51 MST 2015
On 11/27/2015 03:39 PM, Phil Mayers wrote:
> On 27/11/15 14:05, Jonathan Ballet wrote:
>> - how many tries did it require
>> * if there were several tries, the timing of each ones
>
> Typically, application-layer code doesn't retry a DNS lookup; rather
> the
> c or other runtime will handle this, for example getaddrinfo() in
> glibc,
> according to settings read from /etc/resolv.conf or compiled-in
> defaults.
>
> So it depends on whether you want to emulate "typical" application
> code,
> a specific application stack that may or may not do it's own resolution
> (e.g. modern browsers) or something else.
That's a fair point, and I would like, as best as it can, to be as close
as possible as a "typical" application; the goal really would be to
measure the network conditions the applications are facing.
Although I understand I won't be able to get the retries number if the
underlying code is using getaddrinfo() or something like this, I was
thinking that twisted.names was maybe offering a "hand-made" resolver,
which was producing the UDP packets itself and offered a way to plug
some code there to measure these retries; I haven't checked yet.
But in any case, I guess it's going a little bit against my previous
point which was to try to measure things "as used by a 'typical'
application" (which isn't going to use twisted.names custom resolver.)
(Actually, I was surprised to discover that, although it can be
configured from the command-line, `dig` doesn't report the number of
tries/retries it makes, you can only deduce it by looking at the overall
command execution time.)
>> * how long does it take to get the first bytes of the endpoint
>> - how long does it take to complete the TCP connection handshake
>> - the status of the packets exchanged (how many retries, how many
>> packets lost, etc.)
>
> Some of this is available in platform-specific APIs e.g. SIOCGSTAMP and
> TCP_INFO socket options available on Linux.
>
> In general, any timings you make based on return of control from kernel
> will include error relating to system/scheduling issues. If you're
> concerned about getting raw, on-the-wire timings, this is extremely
> difficult without being in-kernel, and even then various issues - TCP
> offload for example - can end up hiding data from you.
I will have a look at these options, as I will be running my tests under
Linux anyway.
It's probably out of scope of Twisted anyway, but I could also retrieve
the packets sent on the wire by listening on the related network
interface set in promiscuous mode and correlate packets together. It's
... "slightly" more work though...
>> How far can I do this kind of things with Twisted? I know I can
>> somewhat
>> easily get the timings of the name resolution, the TCP connection
>> handshake also and the time to first byte(s), but what about the
>> packets? I haven't look at the code of Twisted Names yet, but if it's
>> doing the DNS request by itself, I may be able to plug-in somewhere
>> and
>> have my request counter and the timers associated, but I'm not sure if
>> the underlying details of the TCP protocol are exposed to the upper
>> layer such as Twisted?
>
> Only via platform-specific options.
>
> To do this kind of thing "reliably", you'd need to reimplement TCP in
> user-space.
>
> But the info above may be a helpful start.
Thanks for your answer Phil, I'll see what I can come up with!
Jonathan
More information about the Twisted-Python
mailing list