Computing Foundations › How the Internet Works › Day 15
Hands-on lab — Day 15: What Happens When You Load a Web Page
- ← Back to the Day 15 lesson
- Open the hands-on files on GitHub — clone or download them from the public labs repository
- Local path in your clone:
labs/sections/computing-foundations/day-015-what-happens-when-you-load-a/
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-awhen 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-wtiming fields as a timeline of DNS, TCP, and TLS stages. - Compute each stop's cost by subtracting consecutive
curltimestamps. - 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 imagesdigmay need thednsutils/bind-utilspackage). - 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, andcurl— preinstalled on macOS and most Linux systems. Seerequirements/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 performsdig +shorton the host (DNS: name → IP),ping -c 2(round-trip time), andcurl -sS -o /dev/null -w "..."with the fieldstime_namelookup,time_connect,time_appconnect, andtime_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 fourPENDING-exercise-Nlines; 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 realcurltimings 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
- Run
bash examples/trace_page_load.sh— it must print the report and exit without errors. - Confirm Stop 1 shows a resolved IP, Stop 2 shows
time=values (or a clear "blocked" note), and Stop 3 shows adns=... total=...line. - Complete the four exercises in
starter/trace_page_load.shand run it; noPENDING-exerciseline should remain. - 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
- Run
traceroute <host>(Windows:tracert) and count the network hops; note where the round-trip time jumps. - Trace two sites — one hosted near you and one on another continent — and compare their DNS, TLS, and total
curltimes. - Extend the reference script to also print
time_starttransfer(when the first response byte arrived) and update the tests to check for it.
Navigation
- 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
curlinstead — it uses ordinary web traffic. - In some containers
pingneeds 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 HTTPSGETrequest 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 containerspingalone 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.comor 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.