===== Protokół IPv4 ===== IPv4 = Internet Protocol version 4 ([[https://tools.ietf.org/html/rfc791|RFC 791]]); czasami skracane do inet Budowa nagłówka IP [[https://tools.ietf.org/html/rfc791#section-3.1|[1]]] [[https://pl.wikipedia.org/wiki/IPv4#Nag.C5.82.C3.B3wek_IP|[2]]]: \\ * długość całego pakietu (z nagłówkiem), długość nagłówka i opcje * adresy IP: źródłowy i docelowy * protokół warstwy wyższej * http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml * ''less /etc/protocols'' * fragmentacja * numer identyfikacyjny, flaga MF i offset * flaga DF * TTL * [[https://en.wikipedia.org/wiki/Differentiated_services|DiffServ]] i [[https://en.wikipedia.org/wiki/Explicit_Congestion_Notification#Operation_of_ECN_with_IP|ECN]] (wcześniej ToS) Dla przetestowania fragmentacji spróbuj zmienić rozmiar pakietu ping: ''ping -s '', np: \\ ''ping -s 5000 1.1.1.1'' ===== ICMP i IGMP ===== ==== ICMP ==== Protokół IP nie przewiduje informowania nadawcy o problemach. Funkcje diagnostyczne i kontrolne dla IPv4 spełnia protokół [[http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol|ICMP (Internet_Control_Message_Protocol)]] \\ ICMP pozwala m. inn. na: * wysłanie informacji zwrotnej o niedostarczeniu pakietu (destination unreachable, TTL exceeded) * testowanie łączności (ping) Aby zaobserwować komunikaty ICMP, można wykonać: * ''ping '' * ''traceroute [-q 1] -T '' (porównaj z ''traceroute -I '') * połączenie do nieużywanego portu, np: ''host pl. lab-net-1'' (z lab-net) * połączenie do nieosiągalnego (np. nieistniejącego) adresu, np. ''host pl. lab-sec-33'' (z lab-net) ==== IGMP ==== Do zarządzanie przynależnością do grup multicastowych w IPv4 służy IGMP [[https://en.wikipedia.org/wiki/Internet_Group_Management_Protocol|[1]]]. Dzięki IGMP urządzenia sieciowe wysyłają wiadomości multicastowe tylko zainteresowanym odbiorcom [[https://en.wikipedia.org/wiki/IGMP_snooping|[2]]], a urządzenia końcowe mogą przyjmować tylko ramki z interesujących ich grup multicastowych. \\ Wyświetlenie grup do których należy komputer [IP]: ''netstat -g'' \\ Wyświetlenie grup do których należy komputer [MAC]: ''cat /proc/net/igmp''\\ Oczekiwanie na wiadomość multicastową: ''socat udp-recvfrom:2222,ip-add-membership=239.1.2.3:br0 -'' ++++ Przykładowy wynik poleceń: |
# netstat -ng
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
br0             1      224.0.0.251
br0             1      224.0.0.1

# cat /proc/net/igmp
Idx     Device    : Count Querier       Group    Users Timer    Reporter
3       wlan0     :     2      V3
                                FB0000E0     1 0:00000000               0
                                010000E0     1 0:00000000               0
++++
===== Trasowanie ===== Zadaniem warstwy łącza danych jest dostarczenie danych do wybranego **bezpośrednio połączonego** urządzenia.\\ Zadaniem warstwy sieci jest dostarczenie danych do wybranego urządzenia [w domyśle: **dowolnego** w sieci].\\ Jeśli cel nie jest bezpośrednio połączony, dane (pakiety) trzeba wysłać **przez** inne urządzenie, tj. trzeba wybrać dalszą **trasę** pakietu.\\ Stąd urządzenie działające na warstwie sieci to trasownik (router). Adresy IP i MAC na drodze pakietu od źródła do celu ===== Pomiędzy warstwą łącza danych a warstwą sieci ===== Protokół ARP - http://en.wikipedia.org/wiki/Address_Resolution_Protocol Narzędzia: * wyświetlanie znanych odwzorowań ''arp'' / ''ip neigh'' * ręczne dodanie odwzorowania \\ ''arp -i //br0// -s //1.0.0.0// //02:de:ad:00:be:ef//'' \\ ''ip neigh add //1.0.0.0// lladdr //02:de:ad:00:be:ef// dev //br0//'' * ręczne usunięcie odwzorowania \\ ''arp -i br0 -d //1.0.0.0//'' \\ ''ip neigh del //1.0.0.0// dev //br0//'' * czyszczenie wszystkich odwzorowań ''ip neigh flush all'' Ręczne wysyłanie żądania ARP – ''arping''\\ ''arping -I '' \\ ''arping -I //br0// //150.254.32.129//'' ++++ Przykładowe wyniki poleceń: |
# ip -4 n
10.0.0.1 dev wlan0 lladdr e8:de:27:34:8c:91 REACHABLE
10.0.0.253 dev wlan0  FAILED
10.0.0.254 dev wlan0 lladdr cc:af:78:34:82:d7 STALE
10.0.1.2 dev br0 lladdr 84:16:f9:bb:f4:a3 STALE
10.0.1.3 dev br0 lladdr 44:8a:5b:21:4c:e3 STALE
10.0.1.250 dev br0 lladdr 02:00:00:00:00:01 STALE

# arping -c 5 -I br0 10.0.1.250
ARPING 10.0.1.250
42 bytes from 02:00:00:00:00:01 (10.0.1.250): index=0 time=120.205 usec
42 bytes from 02:00:00:00:00:01 (10.0.1.250): index=1 time=59.082 usec
42 bytes from 02:00:00:00:00:01 (10.0.1.250): index=2 time=55.915 usec
42 bytes from 02:00:00:00:00:01 (10.0.1.250): index=3 time=57.665 usec
42 bytes from 02:00:00:00:00:01 (10.0.1.250): index=4 time=56.081 usec

--- 10.0.1.250 statistics ---
5 packets transmitted, 5 packets received,   0% unanswered (0 extra)
rtt min/avg/max/std-dev = 0.056/0.070/0.120/0.025 ms
++++ Slajdy: ''[[http://www.cs.put.poznan.pl/mlibuda/ARP.pdf|Protokół ARP]]'' Opis implementacji ARP pod Linuksem: ''man 7 arp'' (samo ''man arp'' pokaże pomoc dla polecenia ''arp'')

[EKSTRA]

Fragmentacja IP a rzeczywistość: https://blog.cloudflare.com/ip-fragmentation-is-broken/ Protokół ARP znalazł zastosowanie w wielu technologiach warstwy 2 ([[https://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml|[1]]]), natomiast na warstwie 3 używany jest tylko dla adresów IPv4. Komenda ''arp'' jest też dostępna w systemie Windows: https://technet.microsoft.com/en-us/library/cc940107.aspx Q: Dlaczego komenda ''arping'' nie uzupełnia mapowań IP—MAC?\\ A: Domyślnie Linux uzupełnia mapowania tylko w odpowiedzi na żądania ARP generowane przez jądro systemu. Aby akceptować inne pakiety ARP, można wydać polecenie:\\ ''sysctl net.ipv4.conf.all.arp_accept=1''\\ Dokumentacja: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt