Gdy „nie działa internet”, pierwszy krok to nie restart wszystkiego, tylko trzy proste pytania do sieci: czy docieram do tego komputera (ping), którędy prowadzi trasa (tracert w Windowsie, traceroute w Linuksie) i czy działa zamiana nazwy na adres (nslookup). Umiejętność odczytania wyniku jest ważniejsza niż samo uruchomienie polecenia. Na lekcji uczniowie analizują przykładowe wyniki w Pythonie i wyciągają wnioski.
Scenariusz jest przeznaczony na 45 minut dla klasy znającej adresy IP, DNS i wyrażenia regularne w Pythonie — na przykład po lekcjach o DNS i DHCP. Wyniki w ćwiczeniu są wymyślone (adresy z zakresów zarezerwowanych dla dokumentacji: 192.0.2.x, 198.51.100.x, 203.0.113.x); uczniowie mogą też uruchomić polecenia na własnym komputerze, pamiętając, że wyniki będą inne.
Przygotowanie stanowisk
Potrzebny jest Python 3 i edytor lub IDLE. Rozpakuj pakiet z sekcji materiałów do osobnego folderu i uruchamiaj skrypty z tego folderu. Program uruchomisz przez Run → Run Module albo poleceniem python start.py, python3 start.py lub py start.py.
Cele i plan lekcji
Po zajęciach uczeń potrafi:
- odczytać z wyniku
pingliczbę pakietów, stratę i czasy odpowiedzi; - odczytać z wyniku
traceroutekolejne routery, opóźnienia i hop bez odpowiedzi; - rozpoznać w wyniku
nslookuppoprawną odpowiedź i błąd NXDOMAIN; - wnioskować o miejscu problemu: lokalna sieć, łącze, DNS lub serwer.
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Problem: „nie działa internet” — od czego zacząć? |
| 5–15 min | Odczyt ping, traceroute, nslookup |
| 15–22 min | Typowe wzorce i ich znaczenie |
| 22–37 min | Trzy zadania w Pythonie |
| 37–42 min | Uruchomienie poleceń na własnym komputerze |
| 42–45 min | Pytania kontrolne |
ping
ping adres wysyła pakiety ICMP „echo” i mierzy czas odpowiedzi. W wyniku (Linux) każdy wiersz ma icmp_seq (numer próby), ttl (pozostały limit przeskoków) i time (czas w milisekundach); na końcu statystyka: liczba wysłanych i odebranych pakietów, procent strat oraz rtt min/avg/max/mdev (najmniejszy, średni, największy czas i odchylenie). Interpretacja:
- 0% strat i stabilne czasy — łącze działa dobrze;
- kilkanaście lub kilkadziesiąt procent strat — niestabilne łącze (Wi-Fi, przeciążenie);
- duże wahania czasów (jak 22 → 98 ms) — chwilowe przeciążenie;
- brak odpowiedzi — host wyłączony, brak trasy albo ruch ICMP blokowany przez zaporę (brak odpowiedzi nie zawsze znaczy awaria).
Na ping nazwa komputer najpierw pyta DNS — błąd „nieznany host” wskazuje na DNS, nie na łącze.
traceroute (tracert)
Pokazuje kolejne routery na trasie do celu i czas odpowiedzi każdego z nich (trzy pomiary). Wiersz * * * oznacza brak odpowiedzi z tego routera — często router po prostu nie odpowiada na takie zapytania, a dalsze hopy działają. Skok opóźnienia między hopami wskazuje odcinek, na którym czas rośnie (np. łącze międzymiastowe lub zagraniczne). W Windowsie polecenie nazywa się tracert.
nslookup
nslookup nazwa pyta serwer DNS (w wyniku: Server, czyli który serwer odpowiedział) o adres nazwy. Poprawna odpowiedź zawiera Name i Address; komunikat NXDOMAIN oznacza, że takiej nazwy nie ma. Jeśli ping 192.0.2.10 działa, a ping szkola.edu.pl — nie, problem leży w DNS.
Strategia
Od najbliższego do najdalszego: brama domyślna (ping 192.168.10.1) → adres w internecie (ping 8.8.8.8 — publiczny serwer DNS Google, przykład adresu bez nazwy) → nazwa (ping szkola.edu.pl). Pierwszy krok, który zawodzi, wskazuje miejsce problemu.
Zadania
Zadanie 1. ping. Napisz analiza_ping(tekst) zwracającą liczbę wysłanych i odebranych pakietów, procent strat oraz najmniejszy, średni i największy czas. Przeanalizuj oba wyniki (bez strat i ze stratami) i porównaj z podsumowaniem w wyniku.
Zadanie 2. traceroute. Napisz analiza_trace(tekst) zwracającą dla każdego skoku adres i średni czas. Wskaż skoki bez odpowiedzi i miejsce największego wzrostu opóźnienia.
Zadanie 3. nslookup. Napisz analiza_nslookup(tekst), która dla poprawnej odpowiedzi zwraca „nazwa -> adres”, a dla błędu — „nazwa nie istnieje”. Zapisz po jednym wniosku diagnostycznym dla każdego wyniku.
Dla chętnych: oblicz średnią i odchylenie standardowe czterech czasów z pierwszego wyniku ping i porównaj z rtt min/avg/max/mdev.
Rozwiązanie i wyniki
import re
PING_OK = """PING 192.0.2.10 (192.0.2.10) 56(84) bytes of data.
64 bytes from 192.0.2.10: icmp_seq=1 ttl=57 time=12.4 ms
64 bytes from 192.0.2.10: icmp_seq=2 ttl=57 time=11.8 ms
64 bytes from 192.0.2.10: icmp_seq=3 ttl=57 time=13.9 ms
64 bytes from 192.0.2.10: icmp_seq=4 ttl=57 time=12.3 ms
--- 192.0.2.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 11.8/12.6/13.9/0.8 ms
"""
PING_STRATY = """PING 198.51.100.7 (198.51.100.7) 56(84) bytes of data.
64 bytes from 198.51.100.7: icmp_seq=1 ttl=51 time=22.1 ms
64 bytes from 198.51.100.7: icmp_seq=2 ttl=51 time=25.0 ms
64 bytes from 198.51.100.7: icmp_seq=4 ttl=51 time=98.7 ms
--- 198.51.100.7 ping statistics ---
5 packets transmitted, 3 received, 40% packet loss, time 4010ms
rtt min/avg/max/mdev = 22.1/48.6/98.7/35.4 ms
"""
TRACE = """traceroute to 192.0.2.10 (192.0.2.10), 30 hops max, 60 byte packets
1 192.168.10.1 0.9 ms 0.8 ms 0.8 ms
2 198.51.100.1 8.1 ms 8.0 ms 8.3 ms
3 * * *
4 203.0.113.5 15.2 ms 15.0 ms 15.4 ms
5 192.0.2.10 16.1 ms 16.0 ms 16.4 ms
"""
NS_OK = """Server: 192.168.10.1
Address: 192.168.10.1#53
Name: szkola.edu.pl
Address: 192.0.2.10
"""
NS_BLAD = """Server: 192.168.10.1
Address: 192.168.10.1#53
** server can't find brak.edu.pl: NXDOMAIN
"""
def analiza_ping(tekst):
czasy = [float(x) for x in re.findall(r"time=([\d.]+) ms", tekst)]
wyslane, odebrane = map(int, re.search(r"(\d+) packets transmitted, (\d+) received", tekst).groups())
strata = round((wyslane - odebrane) / wyslane * 100)
return wyslane, odebrane, strata, min(czasy), round(sum(czasy) / len(czasy), 1), max(czasy)
def analiza_trace(tekst):
skoki = []
for linia in tekst.splitlines()[1:]:
m = re.match(r"\s*(\d+)\s+(.*)", linia)
numer, reszta = int(m.group(1)), m.group(2)
if reszta.strip() == "* * *":
skoki.append((numer, None, None))
else:
adres = reszta.split()[0]
czasy = [float(x) for x in re.findall(r"([\d.]+) ms", reszta)]
skoki.append((numer, adres, round(sum(czasy) / len(czasy), 1)))
return skoki
def analiza_nslookup(tekst):
if "NXDOMAIN" in tekst:
return "nazwa nie istnieje"
nazwa = re.search(r"Name:\s+(\S+)", tekst).group(1)
adres = re.search(r"Name:.*\nAddress: (\S+)", tekst).group(1)
return nazwa + " -> " + adres
# Zadanie 1: ping
for nazwa, tekst in (("OK", PING_OK), ("straty", PING_STRATY)):
wyslane, odebrane, strata, mn, sr, mx = analiza_ping(tekst)
print(nazwa, "| wyslano", wyslane, "odebrano", odebrane, "| strata", str(strata) + "%", "| min/sr/max", mn, sr, mx)
# Zadanie 2: traceroute
skoki = analiza_trace(TRACE)
for numer, adres, sr in skoki:
print(numer, adres or "brak odpowiedzi", sr if sr is not None else "-")
bez_brakow = [s for s in skoki if s[2] is not None]
skok, wzrost = max(((b[0], round(b[2] - a[2], 1)) for a, b in zip(bez_brakow, bez_brakow[1:])), key=lambda x: x[1])
print("Najwiekszy wzrost opoznienia przed skokiem", skok, ":", wzrost, "ms")
# Zadanie 3: nslookup
print(analiza_nslookup(NS_OK))
print(analiza_nslookup(NS_BLAD))
Program wypisze:
OK | wyslano 4 odebrano 4 | strata 0% | min/sr/max 11.8 12.6 13.9
straty | wyslano 5 odebrano 3 | strata 40% | min/sr/max 22.1 48.6 98.7
1 192.168.10.1 0.8
2 198.51.100.1 8.1
3 brak odpowiedzi -
4 203.0.113.5 15.2
5 192.0.2.10 16.2
Najwiekszy wzrost opoznienia przed skokiem 2 : 7.3 ms
szkola.edu.pl -> 192.0.2.10
nazwa nie istnieje
Wnioski: pierwszy wynik oznacza sprawne łącze (0% strat, czasy około 12 ms); drugi — niestabilne łącze (40% strat i skok do 98,7 ms). Wiersz * * * w trasie to router, który nie odpowiedział, ale kolejne hopy działają, więc nie jest to awaria. Największy wzrost opóźnienia występuje na odcinku między routerem 1 (sieć lokalna) a 2 (operator). Zadanie dla chętnych (rozszerzenie.py) wypisuje:
12.6 0.8
Podsumowanie mdev w wyniku ping to odchylenie standardowe czasów (tu 0,8 ms).
Typowe błędy
| Objaw | Co sprawdzić |
|---|---|
Brak odpowiedzi z ping, a strona się otwiera | Host blokuje ICMP (zapora) — brak odpowiedzi nie zawsze oznacza awarię. |
ping nazwa zgłasza „unknown host”, a ping adres działa | Problem z DNS, nie z łączem. |
* * * w trasie zinterpretowane jako awaria | Router może nie odpowiadać na takie zapytania; sprawdź, czy dalsze hopy odpowiadają. |
| Procent strat nie zgadza się z podsumowaniem | Liczba odpowiedzi w wierszach jest mniejsza o brakujące numery icmp_seq; liczy się liczba wysłanych i odebranych w podsumowaniu. |
| Wynik w Windowsie wygląda inaczej | Windows używa innego formatu i tracert; zasady odczytu są takie same, zmieniają się tylko słowa. |
| Wnioski z jednego pomiaru | Czasy i straty wahają się; powtórz test kilka razy. |
Pytania kontrolne i punktacja
- Co oznacza wiersz
* * *w wyniku traceroute? - Co sugeruje błąd NXDOMAIN w
nslookup? - W jakiej kolejności diagnozujemy brak internetu?
Odpowiedzi: Router na tej pozycji nie odpowiedział na zapytanie (często dlatego, że tak jest skonfigurowany); sam w sobie nie oznacza awarii trasy. Że nazwa nie istnieje w DNS. Od najbliższego do najdalszego: brama, adres w internecie, nazwa.
Proponowana punktacja (razem 10 punktów): zadanie 1 — funkcja analiza_ping 2 pkt, dwa wyniki i porównanie 1 pkt; zadanie 2 — analiza_trace 2 pkt, skok bez odpowiedzi i wzrost opóźnienia 1 pkt; zadanie 3 — analiza_nslookup 1 pkt, wnioski diagnostyczne 2 pkt; strategia od najbliższego do najdalszego 1 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.
Materiały do pobrania
Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.
Co dalej?
Następny krok to diagnostyka w Packet Tracerze i analiza ruchu narzędziem Wireshark. Ten materiał rozwija dział o diagnostyce sieci w kursie Sieci w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.
Źródła techniczne: ping w Wikipedii) oraz traceroute. Zobacz też lekcję o DNS.
Poprowadź kolejne lekcje Sieci
Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.
Kup dostęp do kursu Sieci →