Το Address Resolution Protocol (ARP) (πρωτόκολλο επίλυσης διευθύνσεων) ορίστηκε στο RFC 826 το 1982 και χρησιμοποιείται για να βρεθεί μια διεύθυνση του επιπέδου συνδέσμου (link layer) ή διεύθυνση υλικού (hardware address) ενός ξένου υπολογιστή με βάση μια διεύθυνση του επιπέδου επικοινωνίας (network layer). Αν και το συναντάμε κυρίως με τα πρωτόκολλα IPv4 και Ethernet (το RFC 826 το ονομάζει πρωτόκολλο επίλυσης διευθύνσεων Ethernet (Ethernet Address Resolution Protocol)), το ARP μπορεί να χρησιμοποιηθεί με το IP πάνω στο ATM ή το FDDI.
Η λειτουργία του ARP μπορεί να χωριστεί σε 4 κατηγορίες:
Η πρώτη περίπτωση ισχύει όταν δυο host βρίσκονται στο ίδιο φυσικό δίκτυο (physical network, π.χ. συνδεδεμένοι με ένα καλώδιο Ethernet), κατά συνέπεια επικοινωνούν απευθείας, χωρίς την μεσολάβηση δρομολογητή. Οι υπόλοιπες τρεις είναι οι πιο κοινές στο Διαδίκτυο εφ' όσον δυο ξένοι υπολογιστές χωρίζονται σχεδόν πάντα από πάνω από τρεις κόμβους.
Bit 0-7 | Bit 8-15 | Bit 16-23 | Bit 24-31 |
Τύπος υλικού (ΤΥ) | Τύπος πρωτόκολλου (ΤΠ) | ||
Μέγεθος ΤΥ (ΜΤΥ) | Μέγεθος ΤΠ (ΜΤΠ) | Ενέργεια (Λ) | |
Διεύθυνση υλικού αποστολέα (ΔΥΑ) | |||
Διεύθυνση πρωτοκόλλου αποστολέα (ΔΠΑ) | |||
Διεύθυνση υλικού παραλήπτη (ΔΥΠ) | |||
Διεύθυνση πρωτοκόλλου παραλήπτη (ΔΠΠ) |
Κάθε ξένος υπολογιστής που είναι συνδεδεμένος σ' ένα δίκτυο που βασίζεται στο ARP κρατάει έναν κατάλογο (ARP table) ζευγών του τύπου Διεύθυνση πρωτοκόλλου → Αντίστοιχη διεύθυνση υλικού (π.χ. ο δρομολογητής μπορεί να έχει το ζεύγος 192.168.0.30 → 30:30:30:30:30:30 για τον host C). Στην περίπτωση που, για ένα συγκεκριμένο χρονικό διάστημα, δεν υπάρχει επικοινωνία με έναν ξένο υπολογιστή που βρίσκεται στον κατάλογο, το ζεύγος που τον αναφέρει αφαιρείται.
Τα ερωτήματα ARP στέλνονται με broadcast, που σημαίνει πως διάφοροι ξένοι υπολογιστές τα λαμβάνουν. Παρακάτω δίνεται η λίστα των βημάτων που ακολουθεί ένας ξένος υπολογιστής όταν λάβει ένα ερώτημα ARP:
Στο εξής παράδειγμα, υποθέτουμε πως κανένα πακέτο δεν έχει σταλθεί ακόμα, οπότε κανένας υπολογιστής δεν έχει γνώση των γειτόνων του. Ο Α θέλει να στείλει ένα μήνυμα στο Β ˙ ορίστε τα πακέτα που κυκλοφορούν στο δίκτυο (υποθέτουμε πως δεν υπάρχει καμία άλλη δραστηριότητα). Για να βρει την διεύθυνση υλικού του Β, ο Α κάνει broadcast ένα ερώτημα ARP.
Bit 0-7 | Bit 8-15 | Bit 16-23 | Bit 24-31 |
Τύπος υλικού = 1 | Τύπος πρωτόκολλου = 0x0800 | ||
Μέγεθος ΤΥ = 6 | Μέγεθος ΤΠ = 4 | Ενέργεια = 1 | |
Διεύθυνση υλικού αποστολέα = 0x101010101010 | |||
Διεύθυνση πρωτοκόλλου αποστολέα = 0xC0A8000A | |||
Διεύθυνση υλικού παραλήπτη = αυτό ψάχνουμε | |||
Διεύθυνση πρωτοκόλλου παραλήπτη = 0xC0A80014 |
Το ερώτημα αυτό φτάνει στον δρομολογητή ο οποίος ξέρει πως ο host Β δεν βρίσκεται στο ίδιο υποδίκτυο (subnet) με τον Α. Στέλνει λοιπόν το εξής πακέτο απάντηση:[1]
Bit 0-7 | Bit 8-15 | Bit 16-23 | Bit 24-31 |
Τύπος υλικού = 1 | Τύπος πρωτόκολλου = 0x0800 | ||
Μέγεθος ΤΥ = 6 | Μέγεθος ΤΠ = 4 | Ενέργεια = 2 | |
Διεύθυνση υλικού αποστολέα = 0xDDDDDDDDDDDD | |||
Διεύθυνση πρωτοκόλλου αποστολέα = 0xC0A80014 | |||
Διεύθυνση υλικού παραλήπτη = 0x101010101010 | |||
Διεύθυνση πρωτοκόλλου παραλήπτη = 0xC0A8000A |
Ο Α μπορεί τώρα να επικοινωνήσει με τον Β. Στέλνει λοιπόν το πρώτο πακέτο δεδομένων με διεύθυνση πρωτοκόλλου 192.168.0.20 αλλά διεύθυνση υλικού DD:DD:DD:DD:DD:DD. Ο δρομολογητής διαβάζει το πακέτο (αφού του προορίζεται με βάση την διεύθυνση MAC) αλλά συνειδητοποιεί πως δεν είναι ο τελικός αποδέκτης (με βάση την διεύθυνση IP).
Εφόσον, υποθέτουμε ότι δεν έχει γίνει ακόμα καμία ανταλλαγή δεδομένων (πλην των δυο παραπάνω πακέτων), ο δρομολογητής δεν ξέρει την διεύθυνση υλικού του υπολογιστή με διεύθυνση IP 192.168.0.20, γι'αυτόν τον λόγο στέλνει μέσω της διεπαφής δικτύου (network interface) που τον συνδέει με το υποδίκτυο όπου βρίσκεται ο Β, ένα ερώτημα ARP όπως το παραπάνω αλλάζοντας μόνο[2] τα πεδία ΔΥΑ, ΔΠΑ (με τα στοιχεία του δρομολογητή, 0xDDDDDDDDDDDD και 0xC0A800FE αντίστοιχα).
Το ερώτημα φτάνει στον Β που διαβάζοντας το πεδίο ΔΠΠ ξέρει πως το μήνυμα τον αφορά και πρέπει να απαντήσει. Στέλνει λοιπόν το εξής πακέτο, με αποδέκτη τον δρομολογητή:
Bit 0-7 | Bit 8-15 | Bit 16-23 | Bit 24-31 |
Τύπος υλικού = 1 | Τύπος πρωτόκολλου = 0x0800 | ||
Μέγεθος ΤΥ = 6 | Μέγεθος ΤΠ = 4 | Ενέργεια = 2 | |
Διεύθυνση υλικού αποστολέα = 0x202020202020 | |||
Διεύθυνση πρωτοκόλλου αποστολέα = 0xC0A80014 | |||
Διεύθυνση υλικού παραλήπτη = 0xDDDDDDDDDDDD | |||
Διεύθυνση πρωτοκόλλου παραλήπτη = 0xC0A800FE |
Ο δρομολογητής μπορεί πλέον τώρα να προωθήσει τα δεδομένα του Α στον Β. Αν ο Β χρειαστεί να απαντήσει στον Α, πρέπει να βρει την διεύθυνση υλικού του. Στέλνει λοιπόν ερώτημα και λαμβάνει απάντηση από τον δρομολογητή (ο οποίος έχει τα αναγκαία στοιχεία στον κατάλογο ARP του) που συμπεριλαμβάνει την διεύθυνση MAC DD:DD:DD:DD:DD:DD.
Δρομολογητής | A | B | C | ||||
Διευ. πρωτο. | Διευ. υλικού | Διευ. πρωτο. | Διευ. υλικού | Διευ. πρωτο. | Διευ. υλικού | Διευ. πρωτο. | Διευ. υλικού |
192.168.0.10 | 10:10:10:10:10:10 | 192.168.0.20 | DD:DD:DD:DD:DD:DD | 192.168.0.254 | DD:DD:DD:DD:DD:DD | × | × |
192.168.0.20 | 20:20:20:20:20:20 | × | × | 192.168.0.10 | DD:DD:DD:DD:DD:DD | × | × |
To InARP (Inverse ARP) χρησιμοποιείται για να βρεθεί μια διεύθυνση πρωτοκόλλου με βάση μια διεύθυνση υλικού. Ορίστηκε στο RFC 2390 και λειτουργεί ως επέκταση του ARP εφ' όσον βασίζεται στην ίδια δομή πακέτων (μόνο ο κωδικός λειτουργίας αλλάζει).
Το RARP (Reverse ARP) προτείνει την ίδια υπηρεσία, αλλά για να βρεθεί η διεύθυνση υλικού του ίδιου του αποστολέα. Ορίστηκε στο RFC 903 και δεν είναι μέρος της στοίβας TCP/IP διότι δεν είναι ένα πρωτόκολλο IP.[3] Το πρωτόκολλο αυτό είναι πια ξεπερασμένο και αντικαθίσταται με το BOOTP.