SIK06.rst

Sieci Komputerowe

Analiza nagłówków IP, TCP i UDP. Fragmentacja IP. *

Podstawowym założeniem modelu komunikacji sieciowej jest podział na warstwy (ang. layers) współpracujące ze sobą w ściśle określony sposób.

Kapsułkowanie danych

Przed wysłaniem dane wraz z przekazywaniem do niższych warstw sieci zmieniają swój format, co nosi nazwę procesu kapsułkowania (enkapsulacji).

Komunikacja w modelu ISO/OSI:

a1

i TCP/IP:

a2

Format nagłówka Ethernet

a3

Pola:

Dst (ang. Ethernet Destination Address, 48 bitów) Docelowy adres urządzenia pracującego w sieci Ethernet.
Src (ang. Ethernet Source Address, 48 bitów) źródłowy adres urządzenia pracującego w sieci Ethernet.
Type (16 bitów) Kod określający rodzaj protokołu użytego do przesyłania danych lub ilość danych wyrażona w bajtach.

Protokół IP

Protokół IP (ang. Internet Protocol) implementuje warstwę sieci. Jest to protokół bezpołączeniowy. Użycie protokołu IP pozwala na przesyłanie datagramów bez zapewnienia niezawodności. Protokół ten zapewnia segmentację datagramów celem przesyłania ich przez łącza o różnej maksymalnej długości pakietu.

Postać nagłówka IP:

a4

Pola:

Wersja - numer wersji protokołu; obecnie powszechnie stosowana jest wersja 4,
DN - długość przedstawionego tu nagłówka w słowach 32-bitowych,
Typ obsługi - informacja o wymaganiach na jakość obsługi datagramu; zawiera poziom ważności pakietu oraz może zawierać wymagania:
minimalizacji opóźnienia,
maksymalizacji przepustowości,
maksymalizacji niezawodności,
minimalizacji kosztu;
Łączna długość - długość całego datagramu (nagłówka i danych razem) w bajtach,
Nr identyfikacyjny - numer nadawany pakietom w celu poprawnego złożenia ich po fragmentacji; każdy fragment danego pakietu ma ten sam numer identyfikacyjny,
Flagi - znaczniki bitowe, mogące oznaczać, że danego datagramu nie należy fragmentować lub że jest to ostatni fragment,
Przesunięcie fragmentu - w przypadku fragmentacji podaje położenie danego fragmentu względem początku pakietu przed fragmentacją w 64-bitowych jednostkach; w przypadku braku fragmentacji równe zeru,
Czas życia (ang. Time To Live, TTL) - licznik, który jest zmniejszany o 1 za każdym przejściem datagramu przez router, a gdy osiągnie zero, datagram jest usuwany; ma na celu zapobieganie niekończącemu się przesyłaniu datagramów, które uległy zapętleniu; licznik powinien być tak ustawiony, aby przy prawidłowej pracy sieci nie zdążył osiągnąć zera przed dostarczeniem datagramu do celu,
Protokół - kod oznaczający protokół wyższej warstwy, którego dane zawarte są w polu danych tego datagramu; mogą być to protokoły TCP, UDP, ICMP i inne (https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers),
Suma kontrolna nagłówka - potwierdza nienaruszenie danych zawartych w omawianym tu nagłówku; gdy nie odpowiada zawartości nagłówka, datagram jest w całości odrzucany,
Adres źródłowy IP - 32-bitowy adres węzła nadającego dany datagram,
Adres docelowy IP - adres węzła, do którego skierowany jest dany datagram,
Opcje - pole o zmiennej długości, mogące zawierać opcje dotyczące sposobu wyznaczania trasy, bezpieczeństwa, znakowania czasu przybycia datagramu do routerów i inne,
Wypełnienie - dopełnia długość nagłówka do najbliższej wielokrotności 32 bitów; wielkość tego pola zależy od wielkości pola opcji.

Po nagłówku IP następują dane, zawierające informacje protokołu wyższej warstwy.

TCP

Nagłowek formatu TCP:

a5

Znaczenie poszczególnych pól jest następujące:

Port Źródłowy - informuje odbiorcę, na którym porcie nadawca prowadzi wymianę informacji,
Port docelowy - numer portu odbiorcy, na podstawie którego podejmuje on decyzję o przesłaniu pakietu do odpowiedniego zadania,
Numer sekwencyjny - pozycja, jaką zajmuje w przesyłanym strumieniu danych pierwszy bajt danych tego pakietu; pozwala stwierdzić, czy nie nastąpiło zagubienie lub zduplikowanie pakietu - powinien on wskazywać na pozycję następnego bajtu po ostatnio odebranym,
Numer potwierdzanego bajtu - numer o jeden większy od numeru sekwencyjnego ostatnio odebranego bajtu; ważny tylko jeżeli znacznik ACK jest ustawiony (patrz pole Znaczniki),
Długość nagłówka - ilość 32-bitowych słów stanowiących opisywany tu nagłówek,
Zarezerwowane - bity o wartości stałej równej zeru; przewidziane do wykorzystania w przyszłości,
Znaczniki - sześć bitów służących do oznaczania specjalnych funkcji pakietu:
URG - oznacza, że pakiet zawiera tzw. pilne dane,
ACK - potwierdzenie,
PSH - funkcja Push,
RST - oznacza natychmiastowe przerwanie połączenia,
SYN - używany przy nawiązywaniu połączenia, oznaczający jednocześnie synchronizację numerów sekwencyjnych nadawcy i odbiorcy,
FIN - zakończenie połączenia,
Rozmiar okna - podaje odbiorcy danego pakietu, ile bajtów może on wysłać nie oczekując na potwierdzenie; ważne tylko gdy ustawiony znacznik ACK,
Suma kontrolna - 16-bitowa, dotyczy całego segmentu, służy do sprawdzania poprawności transmisji,
Wskaźnik do pilnych danych - wskazuje na pierwszy oktet następujący po bloku danych pilnych; ważny jedynie gdy ustawiony znacznik URG,
Opcje - ciąg danych zmiennej długości mogący zawierać informacje o różnych dodatkowych funkcjach,
Wypełnienie - zawartość nieistotna; dopełnia nagłówek do całkowitej wielokrotności 32 bitów.

UDP

Format nagłówka UDP:

a6

Pola:

Port źródłowy
Port docelowy
Długość datagramu - łączna długość nagłówka i danych
Suma kontrolna - procedurę wyliczania sumy kontrolnej można znaleźć tutaj : http://www.netfor2.com/udpsum.htm.

Przykłady

Najczęściej stosowany zapis to taki który wykorzystuje zapis szesnastkowy, czyli każda para koduje jeden bajt (8 bitów). Zamianę znaków na wartości liczbowe dokonywane są za pomocą tablicy ASCII. Do odczytywania plików w postaci binarnej możemy wykorzystywać tzw. Hex editory.

abc

W podanym przypadku Adres MAC nadawcy wynosi 54:04:A6:3C:ED:2B, a adresata 00:15:6D:C4:27:4B , pole typu ma wartość 0800 co oznacza, że kolejne dane reprezentują nagłówek IP.

10-te pole nagłówka IP mówi o protokole, w tym wypadku jest to wartość 06 mówiąca, że mamy do czynienia z protokołem TCP. Adres IP nadawcy zapisany jest w bajtach 13-16 nagłówka, czyli: C0 A8 02 65. Adres docelowy zapisany jest na bajtach 17-20: C7 3B 96 2A. W wyniku zamiany na liczby dziesiętne uzyskamy C0 =192, A8 = 168, 02 = 2 oraz 65 = 101. Stąd adres źródła pakietu to 192.168.2.101.

Po nagłówku IP znajduje się nagłówek TCP. Pierwsze dwa bajty oznaczają numer Portu źródła, a kolejne dwa bajty numer Portu celu.

W analizie nagłówków pomagają programy do analizy ruchu sieciowego takie jak Wireshark.

Wszystkie pliki poniżej otwieraj w programie Wireshark.

Przykład: Klient na 150.254.76.10 otwiera połączenie TCP do serwera na 150.254.78.2 na port 7245, jednak na tym porcie nie nasłuchuje żadna aplikacja.

PlikTCP

Klient na 150.254.76.10 otwiera połączenie TCP do serwera na 150.254.78.2, po czym zamyka je nie wysyłając żadnych danych.

PlikTCP2

Sprawdź gdzie można znaleźć adresy ethernetowy, adresy nadawcy i odbiorcy, poszczególne flagi oraz numery potwierdzeń i sekwencji. Zobacz jak są one kodowane w pliku.

Wysyłanie stworzonego przez siebie pakietu TCP/IP:

Zapis do pliku i otwarcie w Wireshark.

    f = open("testfile.txt","wb")

ethernet  = b'\x00\x0c\x29\xd3\xbe\xd6' # MAC Address Destination
ethernet += b'\x00\x0c\x29\xe0\xc4\xaf' # MAC Address Source
ethernet += b'\x08\x00'                 # Protocol-Type: IPv4

ip_header  = b'\x45\x00\x00\x28'  # Version, IHL, Type of Service | Total Length
ip_header += b'\xab\xcd\x00\x00'  # Identification | Flags, Fragment Offset
ip_header += b'\x40\x06\xa6\xec'  # TTL, Protocol | Header Checksum
ip_header += b'\x0a\x0a\x0a\x02'  # Source Address
ip_header += b'\x0a\x0a\x0a\x01'  # Destination Address

tcp_header  = b'\x30\x39\x00\x50' # Source Port | Destination Port
tcp_header += b'\x00\x00\x00\x00' # Sequence Number
tcp_header += b'\x00\x00\x00\x00' # Acknowledgement Number
tcp_header += b'\x50\x02\x71\x10' # Data Offset, Reserved, Flags |  Window Size
tcp_header += b'\xe6\x32\x00\x00' # Checksum | Urgent Pointer

    packet = ethernet + ip_header + tcp_header
    f.write(packet)

Musimy wpierw przegenerować plik binarny na postać zrozumiałą dla Wiresharka

hexdump -C testfile.txt > file.txt

Następnie możemy w Wireshark zrobić import HexDump w postaci hexadecimal, pakiet typu Ethernet lub stworzyc z niego plik pcap (format zapisu ramek internetowych)

text2pcap file.txt out.pcap

I otworzyć ten plik w wiresharku.

Zadanie (20 pkt)

Dla podanego niżej pakietu podaj: adresy Mac nadawcy i odbiorcy (szesnastkowo), Typ używanego protokołu, ustawione flagi w nagłówku IP, adres IP nadawcy i adres IP odbiorcy (w systemie dziesiętnym). Numer portu nadawcy i numer portu odbiorcy (w systemie dziesiętnym).

0800 207a 705c 0000 a283 2029 0800 4500
0030 0edb 4000 fe06 4e71 898c 0401 898c
0866 0017 8430 1692 1aed 4816 1eac 6018
2238 39d6 0000 0204 05b4 ffff a123

Zadanie (10 pkt)

Odpowiedz na pytanie, czyz się różnią flagi PSH i URG w nagłówku TCP?

Zadanie (20 pkt)

Otwórz w Wiresharku i przeanalizuj nagłówki w komunikacji:

Klient na 192.168.1.6 wysyła do serwera na 192.168.1.200 1000 bajtów protokołem TCP.

Plik1

Klient na 192.168.1.6 wysyła do serwera na 192.168.1.200 10000 bajtów protokołem TCP.

Plik2

Kiedy klient inicjuje sesją TCP, jego poczatkowy numer sekwencyjny przypisywany jest w sposób losowy. Może być to dowolna liczba pomiędzy 0 a 4,294,967,295. Programy takie jak Wireshark często dla ułatwienia analizy wyświetlają nam jednak "wartość relatywną" czyli normalizują je tak, że początkowa wartość jest równa 0 (wypisując ją zamiast prawdziwych wartości). Wyszukaj jak zmienić w ustawieniach wiresharka żeby podawać prawdziwe wartości numerów sekwencyjnych.

Podaj prawdziwe początkowe numery Seq w przypadku obu komunikacji.

Wybierz Statystyki->Graf przepływu a następnie w polu typ przepływu wybierz Przepływy TCP.

Przeanalizuj i opisz w jaki sposób przypisywane są kolejne numery ACK i SEQ (dlaczego kolejne wartości zwiększają się o taką liczbę, a nie inną).

Zadanie (20 pkt)

Klient na 192.168.1.6 wysyła do serwera na 192.168.1.200 1000 bajtów protokołem UDP. Brak fragmentacji.

Plik3

Klient na 192.168.1.6 wysyła do serwera na 192.168.1.200 10000 bajtów protoko?em UDP. Nast?puje fragmentacja na poziomie protokołu IP.

Plik4

W intersieci UDP/IP od chwili, gdy datagram jest dzielony na fragmenty, fragmenty te podróżują jako oddzielne datagramy, aż do ostatecznego odbiorcy, gdzie muszą zostać złożone.

Podaj jakie trzy pola nagłówka IP służą do kontroli procesów fragmentacji i składania datagramów. Odpowiedz na pytanie, ile razy w komunikacji z Plik4 przesyłany jest nagłówek UDP?

Zadanie (10 pkt)

W pliku znajduje się wynik działania ping -c 10 -s 20 192.168.1.200, uruchomionego na 192.168.1.6. w tym wypadku po nagłówku IP zawarty jest nagłówek ICMP.

Plik5

Które pole nagłówka IP mówi że mamy do czynienia z nagłowkiem ICMP? Jaka jest wartość tego pola.

Zadanie (20 pkt)

Stwórz plik będący pakietem UDP o dowolnych numerach MAC, adresie adresata i nadawcy 127.0.0.1, poprawnym header checksum (możesz wykorzystać wiresharka do jego obliczenia!), porcie nadawcy i odbiorcy wynoszącym 9999 oraz komunikacie (danych) będącym Twoim numerem indeksu (jako liczba hex - nie tłumaczona na znaki ASCII). Wskazówka: dodaj dane na końcu pakietu jako element pakietu.

By włączyć obliczanie checksum zaznacz opcję:

Preferences -> Protocols -> IPv4 -> check "Validate the IPv4 checksum if possible"

Prześlij plik na maszynę prowadzącego korzystając z netcata 150.254.78.69, na port 2222

nc 150.254.78.69 2222 < twoj_plik.pcap

odczekaj sekunde i wcisnij ctr+c (nc sam nie zakończy komunikacji po przesłaniu pliku, musisz zrobić to sam).

Aby sprawdzić czy udało nam się wykonać zadanie można wejść na stronę i odszukać swój wpis

Wpis powinien (z dokładnością do numeru indeksu -287046) - wygladać tak jak pierwszy na liście wpis prowadzącego. Uwaga w szczególności przedostatnia liczba powinna być równa 1 - oznacza ona że nagłówek IP jest poprawny (suma kontrolna jest poprawna).

Jako rozwiązanie zadania prześlij swój numer indeksu na moodle.