Protocolul IPv4
Protocolul IP este utilizat pentru a permite dispozitivelor conectate în rețele diferite să schimbe informații prin intermediul unui dispozitiv intermediar numit router. O descriere completă a header-ului de IPv4 o găsiți aici. Header-ul unui pachet (packet) IP este următorul:
+----+---------------+---------------+---------------+---------------+
|Word| 1 | 2 | 3 | 4 |
+----+---------------+---------------+---------------+---------------+
|Byte|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|
+----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0|Version| IHL |Type of Service| Total Length |
+----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 4| Identification |Flags| Fragment Offset |
+----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 8| Time to Live | Protocol | Header Checksum |
+----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12| Source Address |
+----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 16| Destination Address |
+----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Următoarea strucură poate fi folosită pentru a reprezenta un pachet IPV4.
// include/protocols.h
struct ip_hdr {
// this means that version uses 4 bits, and ihl 4 bits
uint8_t ihl:4, ver:4; // we use version = 4
uint8_t tos; // Nu este relevant pentru temă (set pe 0)
uint16_t tot_len; // total length = ipheader + data
uint16_t id; // Nu este relevant pentru temă, (set pe 4)
uint16_t frag; // Nu este relevant pentru temă, (set pe 0)
uint8_t ttl; // Time to Live -> to avoid loops, we will decrement
uint8_t proto; // Identificator al protocolului encapsulat (e.g. ICMP)
uint16_t checksum; // checksum -> Since we modify TTL,
uint32_t source_addr; // Adresa IP sursă
uint32_t dest_addr; // Adresa IP destinație
};
Nu suntem interesați de anumite funcționalități din IP precum fragmentarea. Astfel, în cazul în care construiți un pachet IP de la 0, vom seta obligatoriu următoarele:
tos = 0
frag_off = 0
version = 4
ihl = 5
id = 4
În RFC 990 pagina 24 gășiți o listă de identificatori pentru diversele
protocoale ce pot fi encapsulate în IP. Vom folosi aceste valori pentru a completa câmpul protocol
.
Când un router primește un pachet de tip IPv4, trebuie să realizeze următoarele acțiuni:
-
Verifică dacă el este destinația: deși un intermediar, routerul este de asemenea o entitate cu interfețe de rețea și adrese IP asociate acestora, deci poate fi destinatarul unui pachet. În acest caz, routerul nu trebuie să trimită mai departe pachetul, ci să îi înțeleagă conținutul pentru a putea acționa în consecință. În cadrul acestei teme, routerul va răspunde doar la mesaje de tip ICMP.
-
Verifică checksum: routerul trebuie să recalculeze suma de control a pachetului, și să o compare cu cea primită în antetul de IP; dacă sumele diferă, pachetul a fost corupt și trebuie aruncat.
-
Verificare și actualizare
TTL
: pachetele cu câmpulTTL
având valoarea 1 sau 0 trebuiesc aruncate. Routerul va trimite înapoi, către emițătorul pachetului un mesaj ICMP de tip "Time exceeded" (mai multe detalii în secțiunea ICMP). Altfel, câmpulTTL
e decrementat. -
Căutare în tabela de rutare: routerul caută adresa IP destinație a pachetului în tabela de rutare pentru a determina adresa următorului hop, precum și interfața pe care va trebui scos pachetul. În caz că nu găsește nimic, pachetul este aruncat. Routerul va trimite înapoi, către emițătorul pachetului un mesaj ICMP de tip "Destination unreachable" (mai multe detalii în secțiunea ICMP).
-
Actualizare checksum: routerul recalculează suma de control a pachetului (această trebuie recalculată din cauza schimbării câmpului
TTL
) și o surpascrie în antetul IP al pachetului. -
Rescriere adrese L2: pentru a forma un cadru corect care să fie transmis la următorul hop, routerul are nevoie să rescrie adresele de L2: adresa sursă va fi adresa interfeței routerului pe care pachetul e trimis mai departe, iar adresa destinație va fi adresa MAC a următorului hop. Pentru a determina adresa următorului hop, routerul folosește protocolul ARP.
-
Trimiterea noului pachet pe interfața corespunzătoare următorului hop.