Witam ponownie. ;)
Dwa tygodnie temu dodałem pierwsze (moim zdaniem ciekawe ;)) zadanie dla naszej społeczności. Dostałem wiadomości od paru osób - to cieszy. Jakby ktoś jeszcze chciał spróbować swoich sił to odsyłam do zadania:
https://forum.pasja-informatyki.pl/10154/zadanie-%231-gra-w-statki
Zawsze służę pomocą zarówno przy zakodowaniu fragmentu lub radą jak przez dany problem przebrnąć.
A teraz pora przejść do dzisiejszego zadania. Trochę trudniejszegego, ale trudność ta wynika tylko i wyłącznie na napisaniu odpowiedniego algorytmu. Dacie radę! Co prawda początkowo planowałem grę w sudoku, ale co się odwlecze to nie uciecze. ;) Zmieniłem temat, ponieważ parokrotnie odpowiadałem tutaj na pytania związane z tematyką adresacji. Projekt dotyczy połączenia kilku dziedzin, zatem to co tygryski uwielbiają najbardziej. :)
Krótki wstęp teoretyczny. Przy dzieleniu sieci na podsieci odróżniamy część przeznaczoną na sieć (w naszym przykładzie 3 pierwsze oktety w ramce) oraz część przeznaczoną na hosty (w tym przypadku ostatni oktet).
Każdy adres IPv4 składa się z 4 oktetów zawieracych 8 bitów, które przelicza się w następujący sposób:
Przeanalizuj kolejne kroki konwersji adresu binarnego na adres dziesiętny.
W przykładzie tym liczba binarna:
10101100 00010000 00000100 00010100
po zamianie przestawiona jest w postaci:
172.16.4.20
Podczas konwersji zachowaj następującą kolejność:
- Podziel 32 bity na 4 oktety.
- Zamień każdy oktet na postać dziesiętną.
- Wstaw kropkę pomiędzy tak otrzymanymi liczbami dziesiętnymi.
W zakresie wszystkich adresów związanych z każdą siecią IPv4, można wyróżnić trzy typy:
Adres sieciowy (ang. network address) - Adres, który określa całą sieć.
Adres rozgłoszeniowy (ang. broadcast address) - Specjalny adres używany w celu wysyłania danych do wszystkich hostów w określonej sieci.
Adres hosta (urządzenia końcowego) – Adres przyporządkowany urządzeniu końcowemu pracującemu w sieci.
Adres sieciowy jest standardowym sposobem odwoływania się do sieci.
W zakresie adresów IPv4 związanych z daną siecią, pierwszy (najniższy) adres zarezerwowany jest dla adresu sieciowego. W adresie tym wszystkie bity w polu hosta mają wartość 0.
Adres rozgłoszeniowy IPv4 jest specjalnym adresem występującym w każdej sieci, umożliwiającym jednoczesne komunikowanie się ze wszystkimi hostami w danej sieci. Oznacza to, iż aby wysłać dane do wszystkich urządzeń końcowych w danej sieci, host wysyła pojedynczy pakiet zaadresowany adresem rozgłoszeniowym.
Adres rozgłoszeniowy jest ostatnim (najwyższym) adresem w zakresie adresów związanych z daną siecią. Jest to adres, w którym wszystkie bity znajdujące się w polu hosta mają wartość 1. W przypadku sieci 10.0.0.0 z 24 bitową maską sieciową, adres rozgłoszeniowy będzie miał postać 10.0.0.255. Adres ten określany jest również jako rozgłoszenie skierowane (ang. directed broadcast).
Adresy hostów - Jak już wspomniałem, każde urządzenie końcowe musi być jednoznacznie określone za pomocą unikatowego adresu, aby móc dostarczyć do niego wysyłany pakiet. W adresacji IPv4 urządzenia końcowe pracujące w danej sieci, mogą mieć przypisane adresy z zakresu ograniczonego adresem sieciowym oraz rozgłoszeniowym.
Przedrostki (prefixy) sieciowe
Główne pytanie, które należy sobie zadać brzmi: Skąd mamy wiedzieć ile bitów reprezentuje część związaną z siecią, a ile bitów reprezentuje pole hosta? W przypadku, gdy opisujemy adresy sieciowe IPv4, informację o długości prefiksu dodajemy do adresu sieciowego. Długość przedrostka (prefixu) jest liczbą bitów w adresie, która określa bity (pole) sieci. Na przykład w zapisie 172.16.4.0 /24, „/24” to długość prefixu, która oznacza, iż pierwsze 24 bity określają adres sieci. Oznacza to, iż w tym przypadku ostatnie 8 bitów (ostatni oktet) pozostaje bitami (polem) hosta.
No i w końcu część główna, czyli podział sieci na podsieci.
Miał być "krótki" wstęp teoretyczny, a wyszło jak zwykle. ;)) Sorry, ale osoby, zaznajomione z tą tematyką chyba się nie obrażą za taką ścianę, a osobom, które dopiero się uczą na bank nie zaszkodzi.
W tym zadaniu nie uwzględniamy sieci VLSM (masek zmiennej dłguości), chcociaż całkiem niewykluczone, że za jakiś czas pojawi się zadanie związane z tą tematyką. Jeżeli czujesz się na siłach, to zawsze możesz spróbować na własną rękę.
Rozumiem, że nie każdy jest tutaj programistą, ale docelowo zadanie dotyczy napisania programu. Niemniej jeżeli masz pytania do samego podziału - także na nie odpowiem. Wszak jesteśmy tu by się swoją wiedzą wzajemnie dzielić i by każdego dnia stawać się odrobinkę mądrzejszymi. :))
Parę screenów z działania programu:
A tu przykład na ogromną przewagę szybkości obliczeń komputerów. Maksymalna liczba podsieci jaką udało mi się wygenorować:
A wszystkie wygenerowane podsieci dostępne pod tym linkiem (za duuuuużo spamu :)):
http://kabu.webd.pl/zelent/Podsieci.txt