Introduction
CAIDA provides an easy way for researchers to conduct on-demand measurements on the Ark platform based around the scamper Python module. This platform provides the ability to conduct ping, traceroute, DNS lookups, HTTP, UDP, and alias resolution measurements. Vetted academic researchers will be granted shell access to a CAIDA system that provides the capability to conduct measurements and receive responses in near real-time. If you are an academic researcher who would like access, please contact
Getting started with the Python module
The module is extensively documented with examples in the scamper python module documentation on CAIDA’s website. The module supports different methods for interacting with vantage points (VPs) running scamper; we support the multiplexed (mux) interface on Ark, which provides access to all of the VPs that are listed publicly and operational. See Ark monitor locations for the publicly listed VPs.
On CAIDA’s systems, we provide the mux interface at
/run/ark/mux
.
The following example implements the well-known shortest-ping
measurement technique, which conducts delay measurements to an IP
address from a distributed set of VPs, and reports the shortest of all
the observed delays with the name of the VP that observed the delay.
If the script was saved as shortest-ping.py
, then you could run
this script using
python3 shortest-ping.py /run/ark/mux 192.172.226.122
import sys
from datetime import timedelta
from scamper import ScamperCtrl
if len(sys.argv) != 3:
print("usage: shortest-ping.py $mux $ip")
sys.exit(-1)
with ScamperCtrl(mux=sys.argv[1]) as ctrl:
ctrl.add_vps(ctrl.vps())
for i in ctrl.instances():
ctrl.do_ping(sys.argv[2], inst=i)
min_rtt = None
min_vp = None
for o in ctrl.responses(timeout=timedelta(seconds=10)):
if o.min_rtt is not None and (min_rtt is None or min_rtt > o.min_rtt):
min_rtt = o.min_rtt
min_vp = o.inst
if min_rtt is not None:
print(f"{min_vp.name} {(min_rtt.total_seconds()*1000):.1f} ms")
else:
print(f"no responses for {sys.argv[2]}")
Vantage point metadata
Different Ark VPs provide different measurement capabilities according to the preference of the VP’s host. Currently, all VPs support ping and traceroute measurements. Most also support DNS, UDP probes, and HTTP measurements. If a script attempts to use a measurement primitive that is not supported by the VP, the module will raise a Python exception. You can determine the supported measurements for each VP before conducting a measurement by examining the tags reported by the module for each VP. Current tags are:
primitive:dns
: the VP supports DNS queriesprimitive:http
: the VP supports HTTP queriesprimitive:udp
: the VP supports UDP probes
Beyond these tags, each VP will also provide approximate location information via other properties as documented.
To get a list of VPs that have the ability to send DNS queries:
with ScamperCtrl(mux='/run/ark/mux') as ctrl:
vps = [vp for vp in ctrl.vps() if 'primitive:dns' in vp.tags]
Experiments this environment has supported
-
University of Twente’s anycast census. Results updated daily in Anycast Census GitHub.
-
Analysis of nameserver ECS deployments. Results published in CoNEXT 2025.
-
Locating and Enumerating anycast. Results published in ANRW 2025.
Related Documentation
-
Publication: An Integrated Active Measurement Programming Environment
M. Luckie, S. Hariprasad, R. Sommese, B. Jones, K. Keys, R.K.P. Mok, and k. claffy.
Proceedings of the 26th Passive and Active Measurement (PAM) Conference, March 2025. -
Presentation: A Python-based Integrated Active Measurement Programming Environment on Ark
Presented at CAIDA’s GMI-AIMS-5 workshop, February 2025. -
Blog: Towards a Domain Specific Language for Internet Active Measurement
-
Blog: Developing active Internet measurement software locally to run on Ark
-
Blog: Understanding the deployment of public recursive resolvers
Questions about the programming environment?
Please send questions or comments regarding the environment to