Computing FoundationsHow the Internet Works › Day 15

Hands-on lab — Day 15: What Happens When You Load a Web Page

Commands

Setup

cd labs/sections/computing-foundations/day-015-what-happens-when-you-load-a

Run

bash examples/trace_page_load.sh
bash examples/trace_page_load.sh en.wikipedia.org
bash starter/trace_page_load.sh

Test

bash tests/run_tests.sh

File tree

examples/trace_page_load.sh
expected-output/FIELDS.md
expected-output/sample-macos.txt
metadata.yml
README.md
requirements/README.md
security.md
starter/journey-worksheet.md
starter/trace_page_load.sh
tests/run_tests.sh
troubleshooting.md

Lab README

Day 015 lab — Trace a Real Page Load

Lesson

  • Lesson title: What Happens When You Load a Web Page
  • Day number: 15 of 365
  • Lesson article: https://ai-roadmap-365.github.io/day-015-what-happens-when-you-load-a
  • Lab files: everything you need is in this directory — follow “How to run” below.
  • Browse the course locally: from the repository root, this lab also appears in the course website at /labs/day-015-what-happens-when-you-load-a when the site is running.

Purpose

Day 15's lesson maps the journey a web request takes — URL, DNS, TCP, TLS, HTTP, server, response, render. This lab makes the first stops concrete: you point three standard command-line tools at a real website and watch its name resolve to an address, measure the round-trip time, and read the per-stage connection timings. By the end you can say, with real numbers, where the time goes when a page starts to load.

Learning objectives

  • Resolve a host name to an IP address with dig (the DNS stop).
  • Measure round-trip time to a host with ping, and recognise when ping is blocked.
  • Read curl's -w timing fields as a timeline of DNS, TCP, and TLS stages.
  • Compute each stop's cost by subtracting consecutive curl timestamps.
  • Complete a four-exercise shell script and run an automated test that degrades gracefully offline.

Prerequisites

  • The Day 15 lesson (read it first — it explains every stop this lab measures).
  • Days 1–14 of this course (the terminal and running commands).
  • An internet connection for live values; the lab and its tests still run and pass offline (network checks are skipped).

Supported operating systems

  • macOS — fully supported (tested on macOS with Apple Silicon).
  • Linux — fully supported (dig, ping, curl; on minimal images dig may need the dnsutils/bind-utils package).
  • Windows — run the scripts unmodified inside WSL, or use the PowerShell equivalents noted in troubleshooting.md.

Hardware requirements

Any computer made in roughly the last 15 years. The lab only sends tiny network probes and reads their timings; it needs no minimum RAM, disk, or GPU.

Required software

  • bash (3.2 or newer — preinstalled on macOS and Linux).
  • dig, ping, and curl — preinstalled on macOS and most Linux systems. See requirements/README.md.

Free and open-source options

Everything here is free: bash, dig, ping, and curl are open-source or ship with your OS. No account, API key, or purchase is needed. The lab only queries public hosts over ordinary web traffic.

Installation

None. Copy this directory (or clone the repository) and you are ready:

cd labs/sections/computing-foundations/day-015-what-happens-when-you-load-a

File structure

day-015-what-happens-when-you-load-a/
├── README.md                         ← you are here
├── metadata.yml                      ← machine-readable lab metadata
├── starter/
│   ├── trace_page_load.sh            ← YOUR working file (4 exercises)
│   └── journey-worksheet.md          ← worksheet for the practice assignment
├── examples/
│   └── trace_page_load.sh            ← completed reference implementation
├── tests/
│   └── run_tests.sh                  ← automated checks (skip network checks offline)
├── expected-output/
│   └── sample-macos.txt              ← real captured run (macOS, example.com)
├── requirements/
│   └── README.md                     ← dependency statement
├── troubleshooting.md
└── security.md

How to run

From this directory:

## 1. See the finished result first (defaults to example.com)
bash examples/trace_page_load.sh

## 2. Trace a site of your choice
bash examples/trace_page_load.sh en.wikipedia.org

## 3. Your task: complete the four exercises in the starter, then run it
bash starter/trace_page_load.sh

## 4. Check your work
bash tests/run_tests.sh

What the commands do

  • bash examples/trace_page_load.sh [host] — runs the reference script. It performs dig +short on the host (DNS: name → IP), ping -c 2 (round-trip time), and curl -sS -o /dev/null -w "..." with the fields time_namelookup, time_connect, time_appconnect, and time_total (the DNS, TCP, TLS, and total timings), printing a labelled journey report. If a tool is missing or the network is down, it prints a clear note and continues.
  • bash starter/trace_page_load.sh [host] — the same report skeleton with four PENDING-exercise-N lines; each exercise comment names the exact command to substitute in.
  • bash tests/run_tests.sh — runs the reference script and checks the report's structure (header, footer, the three stops). If the network is reachable it also checks that a real IP and real curl timings appear; if not, it skips those checks with a message and still exits 0.

Expected output

See expected-output/sample-macos.txt — a real captured run (macOS, example.com, 2026-07-12):

=== Request Journey Report ===
Host: example.com
Generated on: 2026-07-12

--- Stop 1: DNS lookup (name -> IP) ---
Resolved IP address(es):
  104.20.23.154
  172.66.147.243

--- Stop 2: Round-trip time (ping -c 2) ---
  PING example.com (104.20.23.154): 56 data bytes
  64 bytes from 104.20.23.154: icmp_seq=0 ttl=58 time=16.488 ms
  ...

--- Stop 3: Connection stages (curl -w timings) ---
  dns=0.003654s connect=0.021513s tls=0.046752s total=0.073891s
  ...
=== End of report ===

Your numbers will differ with distance and network — that is the point. Read the curl line as a timeline: DNS finished at 3.7 ms, TCP connect at 21.5 ms, TLS at 46.8 ms, and the full response at 73.9 ms.

Validation steps

  1. Run bash examples/trace_page_load.sh — it must print the report and exit without errors.
  2. Confirm Stop 1 shows a resolved IP, Stop 2 shows time= values (or a clear "blocked" note), and Stop 3 shows a dns=... total=... line.
  3. Complete the four exercises in starter/trace_page_load.sh and run it; no PENDING-exercise line should remain.
  4. Run the tests (next section) — all checks must pass (or be skipped offline).

Tests

bash tests/run_tests.sh

Expected final line online: 12 checks, 0 failure(s), 0 skipped. Offline it reads 7 checks, 0 failure(s), 3 skipped. The command exits 0 on success and non-zero on any structural failure, so it can run in CI with or without a network.

Cleanup

Nothing to clean up: the scripts make only tiny outbound probes and write no files outside their own console output. To reset your work, restore the starter from version control: git checkout -- starter/trace_page_load.sh.

Troubleshooting

See troubleshooting.md for the full list (dig missing, ping blocked, could not resolve host, all-zero timings, WSL notes).

Security notes

See security.md. Short version: the scripts query only the public host you name, over ordinary DNS and HTTPS traffic, send no data beyond a normal GET, need no elevated privileges, and write nothing to disk.

Extension exercises

  1. Run traceroute <host> (Windows: tracert) and count the network hops; note where the round-trip time jumps.
  2. Trace two sites — one hosted near you and one on another continent — and compare their DNS, TLS, and total curl times.
  3. Extend the reference script to also print time_starttransfer (when the first response byte arrived) and update the tests to check for it.
  • Previous day: Day 14 — the last lesson of the tools-and-terminal week (labs/sections/computing-foundations/day-014-.../).
  • Next day: Day 16 — IP Addresses, DNS, and Routing (labs/sections/computing-foundations/day-016-ip-addresses-dns-and-routing/, to be written).

Expected output

FIELDS.md

# Required report fields (all platforms)

A correct run of `trace_page_load.sh` prints, in order:

1. `=== Request Journey Report ===`
2. `Host: <host name>`
3. `Generated on: YYYY-MM-DD`
4. `--- Stop 1: DNS lookup (name -> IP) ---` followed by one or more resolved
   IP addresses (or a clear "no address" note when offline).
5. `--- Stop 2: Round-trip time (ping -c 2) ---` followed by `ping` output with
   `time=` values (or a clear "blocked/failed" note — many networks block ping).
6. `--- Stop 3: Connection stages (curl -w timings) ---` followed by a line of
   the form `dns=<s> connect=<s> tls=<s> total=<s>` (or a "could not complete"
   note when offline).
7. `=== End of report ===`

`sample-macos.txt` in this directory is a real captured run (macOS, Apple
Silicon, `example.com`, 2026-07-12). Linux output has the same shape; only the
exact `ping` wording and the timing values differ.

## Online vs offline

- **Online:** Stops 1–3 show real values — a resolved IP, `time=` round trips,
  and a `dns=...total=...` timing line. `tests/run_tests.sh` prints
  `12 checks, 0 failure(s), 0 skipped.`
- **Offline (dig/ping/curl fail):** the report still prints all three stop
  headers with clear "unavailable" notes, and the tests skip the live-value
  checks and still exit 0 — `7 checks, 0 failure(s), 3 skipped.`

sample-macos.txt

=== Request Journey Report ===
Host: example.com
Generated on: 2026-07-12

--- Stop 1: DNS lookup (name -> IP) ---
Resolved IP address(es):
  104.20.23.154
  172.66.147.243

--- Stop 2: Round-trip time (ping -c 2) ---
  PING example.com (104.20.23.154): 56 data bytes
  64 bytes from 104.20.23.154: icmp_seq=0 ttl=58 time=16.488 ms
  64 bytes from 104.20.23.154: icmp_seq=1 ttl=58 time=17.128 ms
  
  --- example.com ping statistics ---
  2 packets transmitted, 2 packets received, 0.0% packet loss
  round-trip min/avg/max/stddev = 16.488/16.808/17.128/0.320 ms

--- Stop 3: Connection stages (curl -w timings) ---
  dns=0.003654s connect=0.021513s tls=0.046752s total=0.073891s
  Read each value as the elapsed time from the start at which that
  stage finished. Subtract consecutive values to get each stop's cost:
    time_namelookup = when DNS resolved
    time_connect    = when the TCP connection opened
    time_appconnect = when the TLS handshake finished
    time_total      = when the full response arrived

=== End of report ===

Source files

examples/trace_page_load.sh (2827 bytes)
#!/usr/bin/env bash
# Day 015 lab — completed reference implementation.
# Trace the first stops of a web page's request journey for one host:
#   1. DNS lookup    (dig +short)      name -> IP address
#   2. Round-trip time (ping -c 2)     how long a back-and-forth takes
#   3. Connection stages (curl -w)     DNS / TCP / TLS / total timings
#
# Usage:  bash examples/trace_page_load.sh [hostname]
# Default host is example.com (a safe, standard test domain).
#
# Requires a network connection. If a step's tool is missing or the
# network is unavailable, the script prints a clear note and continues,
# so it never crashes mid-report.
set -uo pipefail

host="${1:-example.com}"

echo "=== Request Journey Report ==="
echo "Host: ${host}"
echo "Generated on: $(date '+%Y-%m-%d')"
echo

# --- Stop 1: DNS lookup (name -> IP address) ---
echo "--- Stop 1: DNS lookup (name -> IP) ---"
if command -v dig >/dev/null 2>&1; then
  ips="$(dig +short "${host}" 2>/dev/null)"
  if [ -n "${ips}" ]; then
    echo "Resolved IP address(es):"
    echo "${ips}" | sed 's/^/  /'
  else
    echo "DNS lookup returned no address (offline, or name not found)."
  fi
else
  echo "dig not installed — try: nslookup ${host}  or  host ${host}"
fi
echo

# --- Stop 2: Round-trip time (ping) ---
echo "--- Stop 2: Round-trip time (ping -c 2) ---"
if command -v ping >/dev/null 2>&1; then
  if ping_out="$(ping -c 2 "${host}" 2>&1)"; then
    echo "${ping_out}" | sed 's/^/  /'
  else
    echo "  ping failed or was blocked (many networks block ICMP)."
    echo "  A blocked ping does NOT mean the site is down — see the curl step."
  fi
else
  echo "  ping not installed on this system."
fi
echo

# --- Stop 3: Connection stage timings (curl) ---
echo "--- Stop 3: Connection stages (curl -w timings) ---"
if command -v curl >/dev/null 2>&1; then
  fmt='dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s total=%{time_total}s\n'
  timing="$(curl -sS --max-time 15 -o /dev/null -w "${fmt}" "https://${host}" 2>/dev/null)"
  rc=$?
  if [ "${rc}" -eq 0 ]; then
    echo "  ${timing}"
    echo "  Read each value as the elapsed time from the start at which that"
    echo "  stage finished. Subtract consecutive values to get each stop's cost:"
    echo "    time_namelookup = when DNS resolved"
    echo "    time_connect    = when the TCP connection opened"
    echo "    time_appconnect = when the TLS handshake finished"
    echo "    time_total      = when the full response arrived"
  else
    echo "  curl could not complete the request (offline, or the host refused"
    echo "  the connection). This often just means no network right now —"
    echo "  reconnect and retry. A failed curl does not prove the site is down."
  fi
else
  echo "  curl not installed on this system."
fi
echo

echo "=== End of report ==="
metadata.yml (655 bytes)
lesson_id: D015
day: 15
kind: command-line-inspection
languages: [bash]
setup_commands:
  - cd labs/sections/computing-foundations/day-015-what-happens-when-you-load-a
run_commands:
  - bash examples/trace_page_load.sh
  - bash examples/trace_page_load.sh en.wikipedia.org
  - bash starter/trace_page_load.sh
test_commands:
  - bash tests/run_tests.sh
cleanup_commands:
  - 'git checkout -- starter/trace_page_load.sh  # optional: reset your work'
requires_network: true
requires_api_key: false
estimated_minutes: 30
last_executed: '2026-07-12'
executed_on: 'macOS (Apple Silicon), bash tests/run_tests.sh → 12 checks, 0 failure(s), 0 skipped (online)'
requirements/README.md (1191 bytes)
# Dependencies — Day 015 lab

**A POSIX shell and three standard network tools.** This lab installs
nothing of its own:

- `bash` ≥ 3.2 (preinstalled on macOS and every mainstream Linux distribution).
- `dig` — DNS lookup tool. Preinstalled on macOS. On minimal Linux images it
  may live in a package: `dnsutils` (Debian/Ubuntu) or `bind-utils`
  (Fedora/RHEL). If you cannot install it, the lesson and troubleshooting
  notes give `nslookup` and `host` as drop-in alternatives.
- `ping` — round-trip probe. Preinstalled on macOS and Linux. **Note:** in
  some container images `ping` needs the `CAP_NET_RAW` capability or root, and
  many networks block ping (ICMP) entirely. A blocked or missing `ping` does
  not stop the lab — the script and tests continue and simply skip that value.
- `curl` — HTTP client. Preinstalled on macOS and most Linux systems
  (`apt install curl` / `dnf install curl` if absent).

There is deliberately no `requirements.txt`/`package.json` here; the tools are
part of a normal developer system. The lab needs a network connection for live
values, but its tests are written to run and pass offline as well, skipping the
network-dependent checks.
starter/journey-worksheet.md (2176 bytes)
# Request Journey Worksheet — Day 015

Pick a website you use often and trace its request journey with the three
tools. Fill in every field below with your real numbers.

**Site chosen (host name):** _______________________________________

## 1. DNS lookup — name to IP address

Command: `dig +short <host>`

- Resolved IP address(es): _______________________________________
- How many addresses came back? ________

## 2. Round-trip time — ping

Command: `ping -c 2 <host>`

- Round-trip time, packet 1: ________ ms
- Round-trip time, packet 2: ________ ms
- Were any packets lost, or was ping blocked? ________________________
  (Remember: a blocked ping does NOT mean the site is down.)

## 3. Connection stages — curl timings

Command:

```
curl -sS -o /dev/null \
  -w "dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s total=%{time_total}s\n" \
  https://<host>
```

Record each timestamp (elapsed time from the start at which the stage finished):

| Field | Value (seconds) |
| --- | --- |
| `time_namelookup` (DNS done) | |
| `time_connect` (TCP open) | |
| `time_appconnect` (TLS done) | |
| `time_total` (full response) | |

## 4. Read the timeline

Subtract consecutive values to get each stop's cost:

- DNS cost = `time_namelookup` = ________ s
- TCP handshake cost = `time_connect` − `time_namelookup` = ________ s
- TLS handshake cost = `time_appconnect` − `time_connect` = ________ s
- Server + transfer cost = `time_total` − `time_appconnect` = ________ s
- **Which stop cost the most?** _______________________________________

## 5. Narrate the journey (5–8 sentences)

Using your real numbers, tell the story of your site's request journey.
Which stop cost the most? Given your round-trip time from step 2, roughly
how many round trips does the setup imply? Did the site feel latency-bound
(far away, high RTT) or fast and nearby?

_____________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________

_____________________________________________________________________
starter/trace_page_load.sh (2279 bytes)
#!/usr/bin/env bash
# Day 015 lab — YOUR working file. Trace the request journey for one host.
#
# The report skeleton is already here. Your job is the four numbered
# exercises below: replace each `PENDING-exercise-N` echo line with the real
# command named in its comment, so the report prints genuine values. The
# completed reference version is examples/trace_page_load.sh — run that first
# to see the finished result, then rebuild it here yourself.
#
# Usage:  bash starter/trace_page_load.sh [hostname]
# Default host is example.com (a safe, standard test domain).
set -uo pipefail

host="${1:-example.com}"

echo "=== Request Journey Report ==="
echo "Host: ${host}"
echo "Generated on: $(date '+%Y-%m-%d')"
echo

# --- Stop 1: DNS lookup (name -> IP address) ---
echo "--- Stop 1: DNS lookup (name -> IP) ---"
# Exercise 1: resolve the host to its IP address(es).
#   Replace the echo line below with:  dig +short "${host}"
echo "PENDING-exercise-1: run dig +short on the host"
echo

# --- Stop 2: Round-trip time (ping) ---
echo "--- Stop 2: Round-trip time (ping -c 2) ---"
# Exercise 2: measure the round-trip time with two ping packets.
#   Replace the echo line below with:  ping -c 2 "${host}"
echo "PENDING-exercise-2: run ping -c 2 on the host"
echo

# --- Stop 3: Connection stage timings (curl) ---
echo "--- Stop 3: Connection stages (curl -w timings) ---"
# Exercise 3: print curl's per-stage timings for https://<host>.
#   Replace the echo line below with a curl command that uses -w with the
#   fields time_namelookup, time_connect, time_appconnect, time_total, e.g.:
#     curl -sS -o /dev/null \
#       -w "dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s total=%{time_total}s\n" \
#       "https://${host}"
echo "PENDING-exercise-3: run the curl -w timing command for the host"
echo

# --- Stop 4: your reading of the timeline ---
echo "--- Stop 4: which stop cost the most? ---"
# Exercise 4: after running Stop 3, subtract consecutive curl values and
# write, in the string below, which stop (DNS, TCP connect, TLS, or server)
# took the most time for your host. Replace the placeholder text.
echo "PENDING-exercise-4: replace with your finding, e.g. 'TLS took the most, about 0.02s'"
echo

echo "=== End of report ==="
tests/run_tests.sh (3452 bytes)
#!/usr/bin/env bash
# Tests for the Day 015 lab. Run from the lab directory:
#   bash tests/run_tests.sh
#
# The lab needs a network, but the tests degrade gracefully offline:
# structural checks (report shape) always run; the network checks
# (real DNS/curl values) run only when the network is reachable, and are
# SKIPPED with a clear message otherwise. The script exits 0 either way,
# as long as the structural checks pass.
set -u

lab_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
example="${lab_dir}/examples/trace_page_load.sh"
failures=0
checks=0
skips=0

check() {
  local label="$1" ok="$2"
  checks=$((checks + 1))
  if [ "${ok}" = "yes" ]; then
    echo "  ok: ${label}"
  else
    echo "  FAIL: ${label}"
    failures=$((failures + 1))
  fi
}

skip() {
  skips=$((skips + 1))
  echo "  skip: $1"
}

echo "Running ${example} against example.com ..."
output="$(bash "${example}" example.com 2>&1)"
exit_code=$?

# --- Structural checks (always run, offline or online) ---
[ "${exit_code}" -eq 0 ] && check "script exits successfully" "yes" || check "script exits successfully" "no"
echo "${output}" | grep -q '^=== Request Journey Report ===$' && check "prints report header" "yes" || check "prints report header" "no"
echo "${output}" | grep -q '^=== End of report ===$' && check "prints report footer" "yes" || check "prints report footer" "no"
echo "${output}" | grep -q '^Host: example.com$' && check "names the host" "yes" || check "names the host" "no"
echo "${output}" | grep -q -- '--- Stop 1: DNS lookup' && check "has Stop 1 (DNS)" "yes" || check "has Stop 1 (DNS)" "no"
echo "${output}" | grep -q -- '--- Stop 2: Round-trip time' && check "has Stop 2 (ping)" "yes" || check "has Stop 2 (ping)" "no"
echo "${output}" | grep -q -- '--- Stop 3: Connection stages' && check "has Stop 3 (curl)" "yes" || check "has Stop 3 (curl)" "no"

# --- Network detection: probe independently of the report ---
# Try a real request; if it fails (or curl is missing), treat as offline and
# skip the live-value checks instead of failing the suite.
if command -v curl >/dev/null 2>&1 && curl -sS --max-time 15 -o /dev/null https://example.com >/dev/null 2>&1; then
  network="up"
else
  network="down"
fi

if [ "${network}" = "up" ]; then
  echo "Network is reachable — running online checks."
  echo "${output}" | grep -Eq 'Resolved IP address' && check "DNS returned an address" "yes" || check "DNS returned an address" "no"
  # The IP line is an indented dotted quad or a hex IPv6 address.
  echo "${output}" | grep -Eq '^  [0-9a-fA-F:.]+$' && check "prints a resolved IP value" "yes" || check "prints a resolved IP value" "no"
  echo "${output}" | grep -Eq 'connect=[0-9]' && check "curl reports a connect time" "yes" || check "curl reports a connect time" "no"
  echo "${output}" | grep -Eq 'tls=[0-9]' && check "curl reports a TLS time" "yes" || check "curl reports a TLS time" "no"
  echo "${output}" | grep -Eq 'total=[0-9]' && check "curl reports a total time" "yes" || check "curl reports a total time" "no"
else
  echo "Network appears unavailable (curl did not return timings)."
  skip "DNS returned an address (needs network)"
  skip "prints a resolved IP value (needs network)"
  skip "curl connect/TLS/total timings (needs network)"
  echo "  The report structure is correct; re-run with a connection to see live values."
fi

echo
echo "${checks} checks, ${failures} failure(s), ${skips} skipped."
[ "${failures}" -eq 0 ]

Troubleshooting

Troubleshooting — Day 015 lab

dig: command not found

dig is not installed. Install it (sudo apt install dnsutils on Debian/Ubuntu, sudo dnf install bind-utils on Fedora/RHEL), or use a built-in alternative that does the same DNS lookup:

nslookup example.com
host example.com

ping shows no replies, "Request timeout", or "Operation not permitted"

Two common causes, neither meaning the site is down:

  • Many networks and servers block ping (ICMP) on purpose. Confirm the site is really reachable with curl instead — it uses ordinary web traffic.
  • In some containers ping needs extra privileges (CAP_NET_RAW). Either run the container with that capability or just skip the ping value; the rest of the lab is unaffected.

curl: (6) could not resolve host

The DNS stop failed. Check the spelling of the host name and your internet connection, then run dig (or nslookup) on the same name to confirm whether resolution is the problem.

The curl timings are all 0.000000s

curl could not reach the host — usually you are offline, or a proxy or firewall blocked the request. Reconnect and retry. The reference script detects this and prints a "could not complete the request" note instead of misleading zeros.

Tests report checks "skipped"

That is expected when you are offline: the structural checks still run and pass, and the live network checks are skipped with a message. Re-run with a connection to see 12 checks, 0 failure(s), 0 skipped.

The starter still prints PENDING-exercise-N

Those lines mark the four exercises you have not finished yet. Open starter/trace_page_load.sh, find each PENDING-exercise-N echo, and replace it with the command named in the comment just above it.

Windows: bash / dig is not recognized

Use WSL (wsl --install, then open Ubuntu and follow the Linux path). In native PowerShell the nearest equivalents are Resolve-DnsName example.com (DNS), Test-Connection example.com (round-trip time), and curl.exe -w "..." (timings).

Security notes

Security notes — Day 015 lab

  • What the scripts do: they query the single public host you name (default example.com) with a DNS lookup (dig), two ping packets (ping), and one HTTPS GET request whose body is discarded (curl -o /dev/null). They make no other network connections, write no files, and change no settings.
  • What data leaves your machine: only what any web request sends — a DNS query for the host name and a normal HTTPS GET. No personal data, no credentials, and no payload beyond a standard request are transmitted. The page content is downloaded and immediately thrown away.
  • Privileges: everything runs as your normal user. Nothing here needs sudo. (In some containers ping alone may need extra capability; that is a container setting, not a request for elevated privileges by this lab.)
  • Choosing a host: query hosts you are allowed to probe — your own sites, or well-known public ones such as example.com or a major encyclopedia. Repeated automated probing of a host you do not control can look like abuse; this lab sends only a couple of packets and one request, which is normal browsing-level traffic.
  • Reading before running: both scripts are short and commented — read them first. Running unread shell scripts is a common way to get compromised; the course's rule is that every lab script is small enough to read and understand before executing.