Sieci · DHCP

DHCP — scenariusz lekcji i analiza konfiguracji

Wymiana DORA, pula adresów, dzierżawa i jej wygasanie na modelu serwera DHCP w Pythonie. Trzy zadania z powtarzalnym zegarem.

45 minutPoziom podstawowyPliki i rozwiązania

Materiał redakcyjny TablicaPro · liceum i technikum

DISCOVER → OFFER → REQUEST → ACK
DISCOVER, OFFER, REQUEST, ACK.
Adres na czas dzierżawy.

Gdy telefon łączy się z domową siecią Wi-Fi, nikt nie wpisuje mu adresu IP, maski ani adresu bramy — robi to DHCP. Serwer (zwykle router) przydziela adresy z puli na ograniczony czas, a klient go przedłuża albo oddaje. Na lekcji uczniowie śledzą cztery komunikaty wymiany DORA na modelu serwera DHCP w Pythonie (to uproszczenie, bez prawdziwych pakietów) i sprawdzają, co dzieje się, gdy pula się kończy.

Scenariusz jest przeznaczony na 45 minut dla klasy znającej adresy IPv4, maski i słowniki w Pythonie — na przykład po lekcjach o podziale na podsieci i DNS. Klasę można rozbudować o oglądanie konfiguracji prawdziwego routera lub polecenia ipconfig /all (Windows) i ip addr (Linux).

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:

  • wymienić cztery komunikaty wymiany DHCP: Discover, Offer, Request, Acknowledge;
  • wskazać parametry, które DHCP przekazuje klientowi (adres, maska, brama, serwer DNS, czas dzierżawy);
  • wyjaśnić pojęcia puli adresów i dzierżawy oraz skutki jej wygaśnięcia;
  • przewidzieć zachowanie serwera przy tym samym i nowym kliencie oraz przy wyczerpanej puli.
CzasPraca na lekcji
0–5 minProblem: kto przydziela adresy w sieci?
5–15 minDORA, pula, dzierżawa
15–22 minCo jeszcze przekazuje DHCP
22–37 minTrzy zadania na modelu
37–42 minPorównanie z ipconfig /all lub konfiguracją routera
42–45 minPytania kontrolne

Wymiana DORA

  1. Discover — nowy klient rozgłasza zapytanie: „czy jest tu serwer DHCP?”.
  2. Offer — serwer proponuje wolny adres z puli.
  3. Request — klient prosi o przydzielenie zaproponowanego adresu (informuje o tym także inne serwery).
  4. Acknowledge — serwer potwierdza i przekazuje konfigurację: adres, maskę, bramę domyślną, adresy serwerów DNS i czas dzierżawy.

Pula i dzierżawa

Pula to zakres adresów, które serwer może przydzielać (np. 192.168.10.100–192.168.10.102); adresy spoza puli (np. bramy, drukarek) przydziela się ręcznie i pozostawia poza nią. Dzierżawa to czas, na jaki klient dostaje adres. Przed jej wygaśnięciem klient prosi o przedłużenie; jeśli się nie odezwie, adres wraca do puli. Ten sam klient (rozpoznawany po adresie MAC) zwykle dostaje ten sam adres. Gdy pula jest wyczerpana, nowy klient nie dostaje adresu i nie może korzystać z sieci (często widać wtedy adres 169.254.x.x, nadany samodzielnie przez system — zobacz lekcję o adresach prywatnych).

Model w Pythonie

Klasa SerwerDHCP trzyma pulę trzech adresów i słownik dzierżaw (MAC → (adres, czas końca)). Metoda przydziel najpierw usuwa przeterminowane dzierżawy, potem zwraca stary adres klienta albo pierwszy wolny. Czas to liczba sekund przekazywana jawnie, dzięki czemu wynik jest powtarzalny. Model pomija m.in. rozgłaszanie, odnowienia i konflikty adresów.

Zadania

Zadanie 1. Wymiana DORA. Uzupełnij funkcję dora(serwer, mac, teraz) tak, aby wypisywała cztery komunikaty i zwracała przydzielony adres. Przeprowadź ją dla klienta AA:AA w chwili 0.

Zadanie 2. Ten sam klient, nowi klienci, pula. Powtórz wymianę dla AA:AA w chwili 100, a potem dla BB:BB, CC:CC i DD:DD. Pula ma trzy adresy — zapisz, co dostał każdy.

Zadanie 3. Wygasanie. Dzierżawa trwa 3600 s, a pozostałych klientów odnowiono w chwili 100. Klient DD:DD ponawia prośbę w chwili 3601, a potem w chwili 3701. Zapisz wyniki i listę zajętych adresów.

Dla chętnych: zmień czas dzierżawy na 60 s i sprawdź, kiedy klient AA:AA traci adres, jeśli nie odnawia dzierżawy.

Rozwiązanie i wyniki

import ipaddress


class SerwerDHCP:
    def __init__(self, siec, pierwszy, ostatni, czas_dzierzawy):
        self.siec = ipaddress.ip_network(siec)
        self.pula = [str(ipaddress.ip_address(x)) for x in range(
            int(ipaddress.ip_address(pierwszy)), int(ipaddress.ip_address(ostatni)) + 1)]
        self.czas = czas_dzierzawy
        self.dzierzawy = {}

    def zwolnij_przeterminowane(self, teraz):
        for mac in [m for m, (ip, do) in self.dzierzawy.items() if do <= teraz]:
            del self.dzierzawy[mac]

    def przydziel(self, mac, teraz):
        self.zwolnij_przeterminowane(teraz)
        if mac in self.dzierzawy:
            ip = self.dzierzawy[mac][0]
        else:
            uzyte = {ip for ip, _ in self.dzierzawy.values()}
            wolne = [ip for ip in self.pula if ip not in uzyte]
            if not wolne:
                return None
            ip = wolne[0]
        self.dzierzawy[mac] = (ip, teraz + self.czas)
        return ip


def dora(serwer, mac, teraz):
    print("DISCOVER od", mac)
    ip = serwer.przydziel(mac, teraz)
    if ip is None:
        print("brak wolnych adresow")
        return None
    print("OFFER", ip)
    print("REQUEST", ip)
    print("ACK", ip, "na", serwer.czas, "s")
    return ip


serwer = SerwerDHCP("192.168.10.0/24", "192.168.10.100", "192.168.10.102", 3600)

# Zadanie 1: wymiana DORA
dora(serwer, "AA:AA", 0)

# Zadanie 2: ten sam klient, inny klient, wyczerpanie puli
print(dora(serwer, "AA:AA", 100))
print(dora(serwer, "BB:BB", 100), dora(serwer, "CC:CC", 100), dora(serwer, "DD:DD", 100))

# Zadanie 3: wygasanie dzierzawy
print(dora(serwer, "DD:DD", 3601))
print(dora(serwer, "DD:DD", 3701))
print(sorted(ip for ip, _ in serwer.dzierzawy.values()))

Program wypisze:

DISCOVER od AA:AA
OFFER 192.168.10.100
REQUEST 192.168.10.100
ACK 192.168.10.100 na 3600 s
DISCOVER od AA:AA
OFFER 192.168.10.100
REQUEST 192.168.10.100
ACK 192.168.10.100 na 3600 s
192.168.10.100
DISCOVER od BB:BB
OFFER 192.168.10.101
REQUEST 192.168.10.101
ACK 192.168.10.101 na 3600 s
DISCOVER od CC:CC
OFFER 192.168.10.102
REQUEST 192.168.10.102
ACK 192.168.10.102 na 3600 s
DISCOVER od DD:DD
brak wolnych adresow
192.168.10.101 192.168.10.102 None
DISCOVER od DD:DD
brak wolnych adresow
None
DISCOVER od DD:DD
OFFER 192.168.10.100
REQUEST 192.168.10.100
ACK 192.168.10.100 na 3600 s
192.168.10.100
['192.168.10.100']

Klient AA:AA po powtórnej prośbie dostaje ten sam adres, BB:BB i CC:CC — kolejne dwa, a DD:DD przy wyczerpanej puli — nic (None). Pozostali klienci odnowili dzierżawy w chwili 100, więc kończą się w chwili 3700. W chwili 3601 nic jeszcze nie wygasło i DD:DD nadal nie dostaje adresu (None); w chwili 3701 dzierżawy wygasają, adresy wracają do puli, a DD:DD dostaje pierwszy wolny (192.168.10.100) i jako jedyny ma wtedy adres. Zadanie dla chętnych (rozszerzenie.py) wypisuje:

255.255.255.0 192.168.10.255 254

Typowe błędy

ObjawCo sprawdzić
Klient dostaje nowy adres przy każdej prośbieBrak sprawdzenia, czy jego MAC jest już w słowniku dzierżaw.
Pula wyczerpuje się, choć klienci już wyszliBrak zwalniania przeterminowanych dzierżaw.
Dwóch klientów dostaje ten sam adresNie sprawdzono zajętych adresów przed przydziałem.
Adres z puli pokrywa się z adresem bramyPula powinna omijać adresy przydzielone ręcznie.
Zasięg puli większy niż siećPierwszy i ostatni adres puli muszą leżeć w sieci i poza adresem sieci i rozgłoszeniowym.
Uznanie modelu za pełny DHCPModel pomija m.in. rozgłaszanie, odnowienia, rezerwacje i konflikty adresów.

Pytania kontrolne i punktacja

  1. Wymień cztery komunikaty wymiany DHCP w kolejności.
  2. Co się dzieje z adresem po wygaśnięciu dzierżawy?
  3. Jaki skutek ma wyczerpanie puli adresów?

Odpowiedzi: Discover, Offer, Request, Acknowledge. Wraca do puli i może być przydzielony innemu klientowi. Nowy klient nie dostaje adresu i nie może korzystać z sieci.

Proponowana punktacja (razem 10 punktów): zadanie 1 — cztery komunikaty 2 pkt, zwrot adresu 1 pkt; zadanie 2 — ten sam adres dla tego samego klienta 1 pkt, pula 2 pkt; zadanie 3 — wygasanie dzierżawy 2 pkt, lista zajętych adresów 1 pkt; wyjaśnienie parametrów DHCP 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 ping, tracert i nslookup do diagnozowania sieci oraz konfiguracja DHCP w Packet Tracerze. Ten materiał rozwija dział o usługach sieciowych w kursie Sieci w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.

Źródła techniczne: DHCP w Wikipedii oraz RFC 2131. 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