Sieci · diagnostyka

ping, tracert i nslookup — diagnozowanie przykładowych problemów

Czytanie wyników ping, traceroute i nslookup na przykładowych danych: strata pakietów, opóźnienia, hop bez odpowiedzi i NXDOMAIN. Trzy zadania w Pythonie.

45 minutPoziom podstawowyPliki i rozwiązania

Materiał redakcyjny TablicaPro · liceum i technikum

4 packets transmitted, 3 received, 25% packet loss
40% strat, skok do 98,7 ms.
Niestabilne łącze.

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 ping liczbę pakietów, stratę i czasy odpowiedzi;
  • odczytać z wyniku traceroute kolejne routery, opóźnienia i hop bez odpowiedzi;
  • rozpoznać w wyniku nslookup poprawną odpowiedź i błąd NXDOMAIN;
  • wnioskować o miejscu problemu: lokalna sieć, łącze, DNS lub serwer.
CzasPraca na lekcji
0–5 minProblem: „nie działa internet” — od czego zacząć?
5–15 minOdczyt ping, traceroute, nslookup
15–22 minTypowe wzorce i ich znaczenie
22–37 minTrzy zadania w Pythonie
37–42 minUruchomienie poleceń na własnym komputerze
42–45 minPytania 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

ObjawCo sprawdzić
Brak odpowiedzi z ping, a strona się otwieraHost blokuje ICMP (zapora) — brak odpowiedzi nie zawsze oznacza awarię.
ping nazwa zgłasza „unknown host”, a ping adres działaProblem z DNS, nie z łączem.
* * * w trasie zinterpretowane jako awariaRouter może nie odpowiadać na takie zapytania; sprawdź, czy dalsze hopy odpowiadają.
Procent strat nie zgadza się z podsumowaniemLiczba 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 inaczejWindows używa innego formatu i tracert; zasady odczytu są takie same, zmieniają się tylko słowa.
Wnioski z jednego pomiaruCzasy i straty wahają się; powtórz test kilka razy.

Pytania kontrolne i punktacja

  1. Co oznacza wiersz * * * w wyniku traceroute?
  2. Co sugeruje błąd NXDOMAIN w nslookup?
  3. 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 →

Zobacz program kursu