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.
struct iphdr {
// version este pe 4 biți, ihl este pe 4 biți
uint8_t version:4,
ihl:4; // Nu vom implementa protocolul IP cu opțiuni,
// așa că 5 × 32 bits = 160 bits = 20 bytes
// (internet header length)
uint8_t tos; // Nu este relevant pentru temă (set pe 0)
uint16_t tot_len; // dimensiunea totală a header + date
uint16_t id; // Nu este relevant pentru temă, (set pe 1)
uint16_t frag_off; // Nu este relevant pentru temă, (set pe 0)
uint8_t ttl; // Time to live
uint8_t protocol; // Identificator al protocolului encapsulat (e.g. ICMP)
uint16_t check; // checksum of the iphdr, we checksum = 0 when computing
uint32_t saddr; // Adresa IP sursă
uint32_t daddr; // 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 următoarele:
tos = 0
frag_off = 0
version = 4
ihl = 5
id = 1
Î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.