DHCP

Με τον όρο **DHCP** (*Dynamic Host Configuration Protocol*) αναφερόμαστε σε ένα μηχανισμό διαχείρισης πρωτοκόλλων TCP/IP . 

Το TCP/IP πρωτόκολλο είναι ουσιαστικά ένα λογισμικό που τρέχει σε έναν router και σε υπολογιστή και διευθετεί όλα τα θέματα επικοινωνίας με αυτόν τον υπολογιστή και άλλους που χρησιμοποιούν αυτό το πρωτόκολλο ως γλώσσα. Για να δουλέψει το ίδιο λογισμικό σε τόσους πολλούς υπολογιστές υπάρχει η ανάγκη  να το ξεκινήσουμε σε κάθε υπολογιστή με τις αντίστοιχες παραμέτρους για αυτόν και για τη θέση του στο δίκτυο. Η *αρχικοποίηση* (*initialisation*) αυτή μπορεί να γίνει κατά τη διάρκεια της εκκίνησης (αν το πρωτόκολλο είναι συγχωνευμένο στο λειτουργικό σύστημα) ή με την κλήση του πρωτοκόλλου από κάποια εφαρμογή (αν το πρωτόκολλο υπάρχει στην εφαρμογή). Οι παράμετροι αυτές μπορούν να οριστούν τοπικά, για κάθε υπολογιστή ξεχωριστά. Κάτι τέτοιο όμως δημιουργεί αρκετά προβλήματα:
*Χρειάζεται πάρα πολλή εργασία από τον διαχειριστή του δικτύου η οποία είναι χρονοβόρα και επιρρεπής σε λάθη.
*Το να διατηρούνται οι παράμετροι ενημερωμένες απαιτεί συνεχή δουλειά η οποία αυξάνεται γεωμετρικά με τις αλλαγές που συμβαίνουν στο δίκτυο, ειδικά αν υπάρχουν υπολογιστές που αλλάζουν συνεχώς θέση (π.χ. φορητοί Η/Υ).
*Η αλλαγή μίας παραμέτρου κοινής για τους υπολογιστές σε ένα *[[subnet]]* (π.χ. τοπική διεύθυνση ενός *[[router]]*) απαιτεί αλλαγές σε κάθε υπολογιστή.
*Μερικά μηχανήματα μπορεί να λειτουργούν ως τερματικά. Κάτι τέτοιο σημαίνει ότι δεν έχουν αποθηκευτικό χώρο για να κρατήσουν τις ρυθμίσεις. 
*Σε περιπτώσεις έλλειψης διευθύνσεων ή ενός δικτύου που αλλάζει συνέχεια είναι χάσιμο χρόνου να δίνουμε σε έναν μη σταθερό υπολογιστή μόνιμη διεύθυνση. Μία καλύτερη προσέγγιση θα ήταν να χρησιμοποιούνται ομάδες διευθύνσεων από ομάδες υπολογιστών. Η «χειροκίνητη» ρύθμιση τέτοιου είδους δεν παρέχει εύκολο τρόπο για να γίνει αυτό. 

Όλοι αυτοί οι λόγοι οδήγησαν στην ανάγκη για έναν αυτόματο μηχανισμό διαχείρισης των TCP/IP πρωτοκόλλων. Ο DHCP είναι αυτή τη στιγμή ο πιο προηγμένος μηχανισμός για τη δουλειά αυτή.

## Ιστορική Αναδρομή

Παλαιότερα τα περισσότερα βασισμένα σε TCP/IP δίκτυα ήταν μικρά και στατικά. Κάτι τέτοιο έκανε εφικτή την δια χειρός αλλαγή και ρύθμιση των διευθύνσεων οι οποίες αποθηκεύονταν στη μνήμη του υπολογιστή. Αν χρειαζόταν ποτέ ένας υπολογιστής να αλλάξει διεύθυνση τότε αυτό γινόταν από την κονσόλα του και συνήθως απαιτούσε και επανεκκίνηση.

Σχετικά σύντομα, και καθώς άρχισαν να δημιουργούνται όλο και πιο σύνθετα δίκτυα υπήρξε η ανάγκη για κεντρική διαχείριση των διευθύνσεων. Αυτό έγινε γιατί στα δίκτυα αυτά άρχισαν να χρησιμοποιούνται κατά κόρον *[[client workstation]]* που ήταν φτηνοί και δεν είχαν μνήμη για αποθήκευση των διευθύνσεων. Ένα ειδικό πρωτόκολλο, το **RARP**, δημιουργήθηκε για τέτοιες περιπτώσεις. Επέτρεπε σε ένα μηχάνημα σε ένα τμήμα του δικτύου να «μάθει» τη διεύθυνση του και μετά να ξεκινήσει κανονική λειτουργία στο TCP/IP.

Ένα άλλο πρωτόκολλο, το **BOOTP**, αναπτύχθηκε επίσης για να επιτρέψει σε αυτά τα workstations να λαμβάνουν τις παραμέτρους του TCP/IP παράλληλα με άλλα δεδομένα του λειτουργικού συστήματος που χρειάζονταν για να ξεκινήσει το *workstation* να λειτουργεί κανονικά μετά την εκκίνηση του. Αυτό επέτρεπε ρυθμίσεις σε πιο ευρέα δίκτυα καθώς δεν ήταν περιορισμένο σε ένα κομμάτι του δικτύου. Το BOOTP στη συνέχεια εμπλουτίστηκε από το **BOOTP extension mechanism**, χρησιμοποιώντας στο τελευταίο πεδίο του frame πιο συγκεκριμένα δεδομένα και επιλογές μηνυμάτων. Αυτή η έκδοση του BOOTP έμελλε να είναι ο πρόγονος του DHCP.

Η επόμενη προσθήκη στο BOOTP μας έδωσε το **Dynamic Host Configuration Protocol** (DHCP). Υπάρχουν δύο κύριες διαφορές μεταξύ των δύο πρωτοκόλλων. Καταρχάς το DHCP ορίζει μηχανισμούς διαμέσου των οποίων μπορούν να μοιραστούν διευθύνσεις στους πελάτες (clients) πεπερασμένης χρήσης ώστε να μπορούμε εύκολα να κάνουμε αναδιοργάνωση των διευθύνσεων και να τις δώσουμε σε διαφορετικούς πελάτες. Ακόμα το DCHP παρέχει στον πελάτη το μηχανισμό με τον οποίο μόνος του μπορεί να ανασύρει τις πληροφορίες που χρειάζεται για να λειτουργήσει στο δίκτυο.

Το DHCP παρέχει ένα *framework* για να περνάνε πληροφορίες για τις ρυθμίσεις μέσω ενός TCP/IP δικτύου. Επίσης είναι βασισμένο στο BOOTP,  γεγονός που του δίνει τη δυνατότητα για αυτόματο καθορισμό επαναχρησιμοποιήσιμων διευθύνσεων και επιπρόσθετες επιλογές ρυθμίσεων. Ακόμα το DHCP είναι πλήρως συμβατό με το BOOTP. Το DHCP έρχεται με ένα προκαθορισμένο αριθμό από επιλογές που έχει κληρονομήσει από το extension mechanism του BOOTP, προσθέτοντας κάποιες ακόμα πληροφορίες, και είναι ανοιχτό για περαιτέρω επέκταση, κληρονομώντας έτσι την επεκτασιμότητα του BOOTP.

## Εισαγωγή στο πρωτόκολλο

To DHCP παρέχει παραμέτρους ρυθμίσεων για ένα μοντέλο δικτύου πελάτη-διακομιστή. Οι *DHCP server hosts* δεσμεύουν τις διευθύνσεις του δικτύου και στέλνουν τις πληροφορίες για αυτές στους *client-hosts*. Το DHCP αποτελείται από δύο τμήματα. Το πρώτο είναι το πρωτόκολλο που στέλνει παραμέτρους ρυθμίσεων από τον server στον host και το δεύτερο είναι ο μηχανισμός για να αντιστοιχίζει τις διευθύνσεις στους hosts.

### Αντιστοίχιση διευθύνσεων IP

Το DHCP υποστηρίζει 3 μηχανισμούς για να αντιστοιχίζει διευθύνσεις. Αυτοί είναι:
***Αυτόματη αντιστοίχιση** (με αντιστοίχιση μόνιμης διεύθυνσης)
***Δυναμική αντιστοίχιση** (με διεύθυνση με ημερομηνία λήξης)
***Χειροκίνητη αντιστοίχιση** (ο διαχειριστής κανονίζει ότι θεωρεί καλύτερο)

### Αποστολή παραμέτρων ρύθμισης

Ο πελάτης στέλνει μήνυμα στο διακομιστή για να του ζητήσει τις παραμέτρους και ο server ανταποκρίνεται με ένα μήνυμα που τις περιέχει.

### Συμβατότητα με το BOOTP
Η δομή των μηνυμάτων είναι βασισμένη στη δομή των μηνυμάτων του BOOTP. Αυτό γίνεται για τους εξής λόγους:

*Όσον αφορά τον πελάτη το DHCP είναι επέκταση του BOOTP. Αυτή η συμπεριφορά επιτρέπει στους πελάτες του BOOTP να επικοινωνούν με διακομιστές του DHCP χωρίς να χρειάζονται αλλαγές.
*Το DHCP υποστηρίζει τη συμπεριφορά του *BOOTP relay agent*.
*Χρήση των relay agents: Το DHCP δεν χρειάζεται διακομιστή για κάθε τμήμα του δικτύου. Για να έχουμε μεγάλο μέγεθος δικτύου και οικονομία το DHCP μπορεί να λειτουργήσει διαμέσου routers ή relay agents του BOOTP. Έτσι προωθούνται τα μηνύματα και σε άλλα τμήματα του δικτύου. Αυτό εκμηδενίζει την ανάγκη για ένα διακομιστή DHCP σε κάθε φυσικό δίκτυο.

## Δέσμευση Διευθύνσεων δικτύου

Όπως προαναφέρθηκε το DHCP έχει 3 μηχανισμούς για να δεσμεύει και να αντιστοιχίζει διευθύνσεις δικτύου. Ένα δίκτυο μπορεί να χρησιμοποιεί έναν η περισσότερους μηχανισμούς ανάλογα με την απόφαση του διαχειριστή του. Η δυναμική αντιστοίχιση είναι ο μόνος από τους 3 μηχανισμούς που επιτρέπει αυτόματη επαναχρησιμοποίηση μίας διεύθυνσης που δεν χρειάζεται πια από τον πελάτη στον οποίο δόθηκε. Έτσι η δυναμική αντιστοίχηση είναι ιδιαιτέρως χρήσιμη για δίκτυα που αποτελούνται από πολλούς πελάτες που συνδέονται προσωρινά, ή σε περιπτώσεις που παρατηρείται έλλειψη διευθύνσεων IP ανάμεσα σε μία ομάδα πελατών που δεν χρειάζονται μόνιμες διευθύνσεις. Ο βασικός μηχανισμός για τη δυναμική αντιστοίχηση των διευθύνσεων είναι απλός. Ο πελάτης ζητά τη χρήση μίας διεύθυνσης για ένα πεπερασμένο χρονικό διάστημα (*lease*). Ο μηχανισμός εγγυάται να μην αντιστοιχίσει τη διεύθυνση αλλού σε αυτό το διάστημα και προσπαθεί να επιστρέφει την ίδια διεύθυνση κάθε φορά που αυτός ο πελάτης ζητά διεύθυνση. Ο πελάτης μπορεί να:

*ζητήσει το lease με άλλες πληροφορίες
*ρωτήσει αν είναι δυνατή η μόνιμη αντιστοίχιση με ένα αορίστου χρόνου lease
*στείλει μήνυμα για να απελευθερώσει τη διεύθυνση πίσω στο διακομιστή όταν δεν τη χρειάζεται άλλο

Στην χειροκίνητη αντιστοίχηση το DHCP απλά χειρίζεται τον έλεγχο λαθών που μπορεί να προκύψουν από την διαχείριση των διευθύνσεων. Στην αυτόματη αντιστοίχηση το DHCP μπορεί να δίνει μόνιμες διευθύνσεις στους hosts χωρίς ανθρώπινη παρέμβαση.

Σαν τελικό έλεγχο ο διακομιστής ελέγχει αν η διεύθυνση που πάει να δώσει όντως δεν χρησιμοποιείται. Αυτό γίνεται με μία ICMP echo ενώ παράλληλα και ο πελάτης ελέγχει την διεύθυνση που έλαβε.

## Αποστολή παραμέτρων ρύθμισης

(Οι διακομιστές DHCP έχουν οριστεί βάση των RFCs  – )

Ο πελάτης ζητά από το διακομιστή να του αποστείλει τις παραμέτρους ρύθμισης. Αυτή η διαδικασία αποτελείται από την αποστολή συγκεκριμένης μορφής μηνυμάτων από τον πελάτη που απαντώνται από τις ρυθμίσεις που στέλνει ο διακομιστής. Το μοντέλο της αποθήκευσης των ρυθμίσεων του δικτύου υπάρχει στο διακομιστή. Η δομή του είναι απλή καθώς αυτό αποτελείται από ζεύγη κλειδιών-τιμών (keys-values). Το κλειδί αποτελεί ένα μοναδικό αναγνωριστικό ενώ η τιμή περιέχει τις ρυθμίσεις για το συγκεκριμένο πελάτη. Δεν χρειάζονται όμως όλοι οι πελάτες αρχικοποίηση με όλες τις παραμέτρους. Δύο τεχνικές χρησιμοποιούνται για να περιοριστεί η αποστολή των παραμέτρων από το διακομιστή στον πελάτη.

*Οι περισσότερες παράμετροι έχουν προεπιλεγμένες τιμές (Βάση των RFCs). Αν ο πελάτης δεν λάβει διαφορετικές πληροφορίες από το διακομιστή, χρησιμοποιεί αυτές τις τιμές.
*Ο πελάτης και ο διακομιστής μπορούν να διαπραγματευτούν την αποστολή μόνο των απαιτούμενων παραμέτρων. Ο πελάτης στο μήνυμα που στέλνει περιέχει την επιλογή parameter request list option για να ενημερώσει για το ποιες παραμέτρους χρειάζεται.

## Μορφές μηνυμάτων

Όπως προαναφέρθηκε τα μηνύματα που στέλνονται ακολουθούν τη μορφή του BOOTP ώστε να είναι συμβατά με τους relay agents του BOOTP και τους πελάτες του BOOTP. Η μορφή τους είναι η ακόλουθη ενώ οι αριθμοί δηλώνουν το μέγεθος του κάθε πεδίου:

Σε μηνύματα DHCP πρέπει να υπάρχει τουλάχιστον μία επιλογή (message type) οπότε το πεδίο δεν είναι ποτέ κενό.

Εκτός από αυτές τις επιλογές γεννήθηκε η ανάγκη για να δημιουργηθούν και άλλες. Αυτές χωρίζονται σε 2 κατηγορίες: τις παραμέτρους ρυθμίσεων και τις πληροφορίες για τον έλεγχο μηνυμάτων. Αναλυτικά περιγράφονται στο RFC 2132.

## Μοντέλο Πελάτη-Διακομιστή
right|150px|
Ο πελάτης (Client) και ο διακομιστής (Server) εμπλέκονται σε μία ανταλλαγή μηνυμάτων ώστε να πάρει ο πελάτης τις ζητούμενες ρυθμίσεις. Αυτές ακολουθούν τα εξής βήματα:

*Ο πελάτης μεταδίδει μία `DHCPDISCOVER`. 
*Ο διακομιστής απαντά με ένα μήνυμα `DHCPOFFER`. 
*Ο πελάτης λαμβάνει το  `DHCPOFFER` και  αναμεταδίδει ένα `DHCPREQUEST` για να ζητήσει ρυθμίσεις. 
*Αν κάποιοι διακομιστές δεν προτιμήθηκαν από τον πελάτη (σε δίκτυα με άνω του ενός διακομιστές) δηλαδή κατανοούν την  `DHCPREQUEST` ως απόρριψή τους. Ο διακομιστής που επελέγη με την `DHCPREQUEST` απαντά με το μήνυμα `DHCPACK` που περιέχει τις παραμέτρους για τον πελάτη. 
*Ο πελάτης λαμβάνει την `DHCPACK` και ρυθμίζεται βάση αυτών. Αν λάβει την εντολή `DHCPNAK (απόρριψη)`, ξαναρχίζει τη διαδικασία. 
*Ο πελάτης μπορεί να ελευθερώσει τη διεύθυνσή του με το μήνυμα `DHCPRELEASE` στο διακομιστή.
*Ο διακομιστής λαμβάνει την `DHCPRELEASE` και σημειώνει το lease ως ελεύθερο. 

Υπάρχει η περίπτωση ο client να επαναχρησιμοποιήσει μία διεύθυνση που είχε. Έτσι απλά παρακάμπτει μερικά από τα παραπάνω βήματα.

## Ασφάλεια
Το πρωτόκολλο DHCP δεν διαθέτει κανένα μηχανισμό ασφαλείας. 

Η αυτόματη ανάκτηση διεύθυνσης και διακομιστών DNS μπορεί να δημιουργήσει τα εξής προβλήματα:
* Κάποιος κακόβουλος να παρεμβάλει ένα διακομιστή DHCP ο οποίος:
** θα δίνει κακόβουλες διευθύνσεις διακομιστών DNS με αποτέλεσμα όσοι τον χρησιμοποιούν να είναι ευάλωτοι σε επιθέσεις Man-in-the-middle.
** θα δίνει ψεύτικες διευθύνσεις με αποτέλεσμα να μην μπορούν οι υπολογιστές-πελάτες να συνδεθούν στο δίκτυο (επίθεση άρνησης εξυπηρέτησης - Denial of Service attack)
* Μπορεί κάποιος να ζητάει συνεχώς διευθύνσεις από το διακομιστή DHCP (είτε κακόβουλα είτε λόγω αστοχίας υλικού ή λογισμικού) με αποτέλεσμα να τελειώσουν όλες οι διευθύνσεις που μπορεί να παρέχει ο διακομιστής DHCP (επίθεση άρνησης εξυπηρέτησης - Denial of Service attack).

## Δείτε επίσης
* Μοντέλο πελάτη-διακομιστή

## Παραπομπές


## Εξωτερικοί σύνδεσμοι
* Το πρωτόκολλο DHCP 
* Εργαστήριο Ethereal: DHCP - πειράματα με το DHCP με χρήση του εργαλείου Ethereal
* DHCP Server Security  - άρθρο γύρω από την ασφάλεια των DHCP servers. 

Κατηγορία:Δίκτυα υπολογιστών
Κατηγορία:Επιστήμη υπολογιστών