From ad8414367daaaec9633e8a9f5a432ab4dfe35d66 Mon Sep 17 00:00:00 2001 From: Christos Choutouridis Date: Sun, 27 Sep 2026 16:23:11 +0300 Subject: [PATCH] Report: Added intro and DSL --- README.md | 1 - report/.gitignore | 8 ++ report/report.pdf | Bin 0 -> 101101 bytes report/report.tex | 324 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 332 insertions(+), 1 deletion(-) create mode 100644 report/.gitignore create mode 100644 report/report.pdf create mode 100644 report/report.tex diff --git a/README.md b/README.md index f93ead0..da2ab9e 100644 --- a/README.md +++ b/README.md @@ -282,7 +282,6 @@ The generated Python is the only executable Mininet backend. a raw dictionary. `topology_parser.py` provides `parse_topology(raw)`, which converts that dictionary into a typed `Topology`. -The loader's convenience API, `load(path)`, performs both operations. Neither stage depends on Mininet. The semantic model uses dataclasses for `Topology`, `Node`, `Interface`, `Link`, diff --git a/report/.gitignore b/report/.gitignore new file mode 100644 index 0000000..62ca9b8 --- /dev/null +++ b/report/.gitignore @@ -0,0 +1,8 @@ +# LaTeX auxiliary files +*.aux +*.log +*.out +*.synctex.gz +_minted*/* + + diff --git a/report/report.pdf b/report/report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e788c0f2237a34acca1a8a2323315341c02b2251 GIT binary patch literal 101101 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 TY8n?XIL(X=xl~nM{oS|#1I`c7 literal 0 HcmV?d00001 diff --git a/report/report.tex b/report/report.tex new file mode 100644 index 0000000..4951cf5 --- /dev/null +++ b/report/report.tex @@ -0,0 +1,324 @@ +% !TEX TS-program = xelatex +% !TEX encoding = UTF-8 Unicode +% !TEX spellcheck = el-GR +% +% Compiter Networks II report +% +% Requires compilation with pdfLaTeX or XeLaTeX +% +% authors: +% Χρήστος Χουτουρίδης ΑΕΜ 8997 +% cchoutou@ece.auth.gr + +% +% Options: +% +% 1) mainlang= +% Default: english +% Set the default language of the document which affects hyphenations, +% localization (section, dates, etc...) +% +% example: \documentclass[mainlang=greek]{AUThReport} +% +% 2) +% Add hyphenation and typesetting support for other languages +% Currently supports: english, greek, german, frenc +% +% example: \documentclass[english, greek]{AUThReport} +% +% 3) short: Requests a shorter title for the document +% Default: no short +% +% example: \documentclass[short]{AUThReport} +% +\documentclass[a4paper, 11pt, mainlang=greek, english]{AUThReport/AUThReport} + +\CurrentDate{\today} + +% Document setup +%--------------------------------- + +% \WorkGroup{Ομάδα Χ} + +\AuthorName{Χρήστος Χουτουρίδης} +\AuthorMail{cchoutou@ece.auth.gr} +\AuthorAEM{8997} + +%\CoAuthorName{Όνομα Επίθετο} +%\CoAuthorAEM{AEM} +%\CoAuthorMail{xxx@ece.auth.gr} + +\DocTitle{Αυτοματοποιημένη Ανάπτυξη Τοπολογίας και Ανάλυση Πρωτοκόλλων στο Mininet} +%\DocSubTitle{Ανάλυση και υλοποίηση του αλγόριθμου bitonic sort για υποσύστημα γραφικών με χρήση CUDA} + +\Department{Τμήμα ΗΜΜΥ. Τομέας Ηλεκτρονικής} +\ClassName{Δίκτυα Υπολογιστών ΙΙ} +% +\InstructorName{Αναστάσιος Ντελόπουλος} +\InstructorMail{antelopo@ece.auth.gr} + +\CoInstructorName{Εμανουήλ Τσαρδουλιάς} +\CoInstructorMail{etsardou@ece.auth.gr} + + +% Local package requirements +%--------------------------------- + +\usepackage{enumitem} +\usepackage{tabularx} +\usepackage{array} +\usepackage{multirow} +\usepackage{float} +\usepackage{xcolor} +\usepackage{soul} +\usepackage{amsmath} +\usepackage{footnote} +\usepackage{footmisc} + + +%\definecolor{red-highlight}{rgb}{1.0, 0.11, 0.0} +\definecolor{red-highlight}{rgb}{1.0, 0.31, 0.0} +\definecolor{green-highlight}{rgb}{0.0, 0.62, 0.42} + +\newcommand{\bxrd}[1]{\colorbox{red-highlight}{#1}} +\newcommand{\bxgr}[1]{\colorbox{green-highlight}{#1}} + +\newcommand{\trd}[1]{\textcolor{red-highlight}{\textbf{#1}}} +\newcommand{\tgr}[1]{\textcolor{green-highlight}{\textbf{#1}}} + +% “virtual” cites +% ---------------------------------------- +%\newcommand{\citeKnuthACM}{% +% Donald E. Knuth, \emph{Structured Programming with go to Statements}, ACM Computing Surveys, vol. 6, no. 4, 1974 +%} + +% Links +% Repository links +% ---------------------------------------- +\newcommand{\repoGithub}{https://github.com/hoo2/Computer-Networks-II} +\newcommand{\repoGitea}{https://git.hoo2.net/hoo2/Computer-Networks-II} + +\newcommand{\topologyJsonUrl}{\repoGithub/blob/HEAD/exercise/topology.json} +\newcommand{\buildNetworkUrl}{\repoGithub/blob/HEAD/source/build_network.py} +\newcommand{\resultsUrl}{\repoGithub/tree/HEAD/exercise/results} + +\newcommand{\dslDesignUrl}{\repoGithub/blob/HEAD/Mininet_DSL_Design.md} + +\begin{document} + +\InsertTitle + +%\tableofcontents + + +\section{Εισαγωγή} + +Η παρούσα εργασία έχει ως αντικείμενο την \textbf{αυτοματοποιημένη ανάπτυξη δικτυακών τοπολογιών στο περιβάλλον Mininet}, +με βάση μια δηλωτική περιγραφή σε αρχείο JSON. +Στο πλαίσιο αυτό υλοποιείται εφαρμογή σε Python, η οποία διαβάζει περιγραφές της τοπολογίας σε μια πρότυπη \textbf{Domain-Specific +Language -- DSL}, και δημιουργεί δυναμικά τους αντίστοιχους hosts, μεταγωγείς, συνδέσμους και δρομολογητές και εφαρμόζει +τις απαιτούμενες ρυθμίσεις δικτύου. +Το Mininet χρησιμοποιείται ως περιβάλλον εξομοίωσης, ώστε η τοπολογία να μπορεί να κατασκευάζεται και να εξετάζεται +με χρήση των ίδιων εργαλείων και πρωτοκόλλων που χρησιμοποιούνται σε ένα πραγματικό σύστημα Linux. + +Μετά την ανάπτυξη της τοπολογίας πραγματοποιούνται τρία πειράματα χαμηλού επιπέδου για τη μελέτη των πρωτοκόλλων +\textbf{DHCP} και \textbf{ARP}, καθώς και της \textbf{δρομολόγησης μεταξύ διαφορετικών υποδικτύων}. +Μέσω καταγραφών με το \texttt{tcpdump} εξετάζεται η διαδικασία D.O.R.A. του DHCP, η αντιστοίχιση διευθύνσεων IP σε +διευθύνσεις MAC μέσω του ARP και η μεταβολή των Ethernet διευθύνσεων και του TTL κατά τη διέλευση ενός IP πακέτου +από τον δρομολογητή. +Στόχος των πειραμάτων είναι η σύνδεση της θεωρητικής λειτουργίας των πρωτοκόλλων με την πραγματική μορφή των +πακέτων που ανταλλάσσονται στα διαφορετικά επίπεδα του δικτύου. + + +\subsection{Παραδοτέα} + +Τα παραδοτέα της εργασίας αποτελούνται από: +\begin{itemize} + \item Την παρούσα τεχνική αναφορά. + \item Το αρχείο \href{\topologyJsonUrl}{\texttt{exercise/topology.json}}, το οποίο περιγράφει δηλωτικά την τοπολογία δικτύου που χρησιμοποιείται στην εργασία. + \item Τον κατάλογο \texttt{source/}, ο οποίος περιέχει το αρχείο \href{\buildNetworkUrl}{\texttt{build\_network.py}}, καθώς και τα υπόλοιπα αρχεία + Python που υλοποιούν την εφαρμογή. + \item Τον κατάλογο \href{\resultsUrl}{\texttt{exercise/results/}}, ο οποίος περιέχει τις μετρήσεις και τα παραγόμενα αρχεία των πειραμάτων της εργασίας. + \item Τους συνδέσμους προς τα αποθετήρια στο \href{\repoGithub}{GitHub} και στον \href{\repoGitea}{προσωπικό μου server}, τα οποία περιέχουν τον πηγαίο κώδικα, + τον κώδικα παραγωγής της αναφοράς και τα αποτελέσματα των πειραμάτων. +\end{itemize} + + +\section{Υλοποίηση του Builder} + +\subsection{Δηλωτική γλώσσα περιγραφής τοπολογίας} + +Για την περιγραφή των δικτυακών τοπολογιών σχεδιάστηκε μία μικρή \textbf{δηλωτική γλώσσα ειδικού σκοπού} +(Domain-Specific Language -- DSL), η οποία χρησιμοποιεί το JSON ως μορφή αναπαράστασης. +Στόχος της γλώσσας είναι να περιγράφει την \emph{επιθυμητή κατάσταση του δικτύου} και όχι τη σειρά των εντολών +που απαιτούνται για την κατασκευή του στο Mininet. +Με αυτόν τον τρόπο η περιγραφή της τοπολογίας παραμένει ανεξάρτητη από λεπτομέρειες της υλοποίησης, όπως τα +ονόματα των εικονικών διεπαφών ή η ακριβής ακολουθία κλήσεων προς το Mininet API. +Η αναλυτική σχεδίαση και η γραμματική της γλώσσας τεκμηριώνονται επίσης στο αρχείο +\href{\dslDesignUrl}{\texttt{Mininet\_DSL\_Design.md}} του αποθετηρίου. + +\subsubsection{Σχεδιαστική προσέγγιση} + +Ο σχεδιασμός της γλώσσας πραγματοποιήθηκε \textbf{από πάνω προς τα κάτω}, ξεκινώντας από τις έννοιες που είναι +φυσικό να χρησιμοποιούνται για την περιγραφή ενός δικτύου, όπως οι \emph{κόμβοι}, οι \emph{διεπαφές}, οι \emph{σύνδεσμοι} και οι +\emph{υπηρεσίες}. +Παράλληλα, κάθε αφηρημένη έννοια επιλέχθηκε έχοντας υπόψη τις διαθέσιμες πρωτογενείς λειτουργίες του Mininet και +του δικτυακού υποσυστήματος του Linux. +Η προσέγγιση αυτή επιτρέπει στη γλώσσα να παραμένει υψηλού επιπέδου, χωρίς να εισάγει κατασκευές που δεν μπορούν +να μεταφραστούν με σαφή και συστηματικό τρόπο στο υποκείμενο περιβάλλον εκτέλεσης. + +Οι βασικές λειτουργίες που απαιτούνται από την εργασία μπορούν να αναχθούν σε ένα σχετικά μικρό σύνολο +\emph{πρωτογενών κατασκευών} του Mininet και του Linux. +Η δημιουργία hosts και switches, η σύνδεσή τους μέσω links και η εκτέλεση εντολών μέσα στους αντίστοιχους +network namespaces επαρκούν για την κατασκευή της απαιτούμενης τοπολογίας. +Ένας δρομολογητής μπορεί αντίστοιχα να μοντελοποιηθεί ως host με περισσότερες από μία διεπαφές, κατάλληλη +Layer-3 διευθυνσιοδότηση και ενεργοποιημένη προώθηση IP. +Ο DHCP server μπορεί να θεωρηθεί ως υπηρεσία που εκτελείται σε έναν κόμβο και συνδέεται με συγκεκριμένη διεπαφή. + +Πριν οριστικοποιηθούν οι οντότητες της DSL, εξετάστηκαν οι βασικές λειτουργίες που παρέχει το Mininet και το +δικτυακό υποσύστημα του Linux για την κατασκευή και παραμετροποίηση μιας τοπολογίας. +Οι κύριες λειτουργίες που χρησιμοποιήθηκαν ως βάση είναι οι \texttt{addHost()}, \texttt{addSwitch()} και +\texttt{addLink()}, καθώς και η δυνατότητα εκτέλεσης εντολών μέσα σε κάθε network namespace μέσω του +\texttt{node.cmd()}. +Στις λειτουργίες αυτές προστίθενται η παραμετροποίηση διεπαφών και δρομολόγησης μέσω εργαλείων του Linux και η +εκκίνηση διεργασιών, όπως ο \texttt{dnsmasq}, μέσα στον αντίστοιχο κόμβο. +Η ανάλυση αυτή χρησιμοποιήθηκε για να \textbf{σταθεροποιηθεί το σύνολο των αφαιρέσεων της DSL}, έτσι ώστε κάθε +υψηλού επιπέδου κατασκευή να έχει σαφή δρόμο μετάφρασης προς τις διαθέσιμες λειτουργίες του backend. + +Με βάση τις παρατηρήσεις αυτές επιλέχθηκε ένα σύνολο οντοτήτων ώστε η DSL να \textbf{καλύπτει τον χώρο των + κατασκευών που απαιτούνται από την εργασία}. +Αντίστοιχα, το σύνολο των primitives του Mininet και του Linux που χρησιμοποιείται είναι επαρκές ώστε κάθε +κατασκευή της DSL να μπορεί να μεταφραστεί σε συγκεκριμένες λειτουργίες του backend. +Με αυτή την έννοια, τόσο η γλώσσα ως προς τον χώρο του προβλήματος όσο και τα χρησιμοποιούμενα primitives ως +προς τον χώρο της υλοποίησης λειτουργούν \emph{«επί»}. +Δηλαδή, δεν παραμένει απαίτηση της εργασίας χωρίς αναπαράσταση στη DSL ούτε κατασκευή της DSL χωρίς αντίστοιχη +υλοποίηση στο Mininet και στο Linux. +Οι βασικές οντότητες της γλώσσας είναι οι \emph{κόμβοι}, οι \emph{διεπαφές}, οι \emph{σύνδεσμοι}, οι +\emph{ρυθμίσεις κόμβων} και οι \emph{υπηρεσίες}. + +\subsubsection{Βασική γραμματική} + +Η τοπολογία περιγράφεται από τρεις κύριες κατηγορίες αντικειμένων: \texttt{nodes}, \texttt{links} και +\texttt{services}. +Η βασική δομή της γλώσσας μπορεί να συνοψιστεί ως εξής: + +\begin{verbatim} + Network + |-- Nodes + | |-- name + | |-- type + | |-- interfaces + | `-- settings + | + |-- Links + | |-- name + | |-- endpoints + | | |-- node + | | `-- interface + | `-- settings + | + `-- Services + |-- type + |-- node + |-- interface + `-- settings +\end{verbatim} + +Κάθε κατηγορία έχει \textbf{διαφορετική σημασιολογική ευθύνη}. +Ένας κόμβος(node) αναπαριστά έναν συμμετέχοντα του δικτύου, μία διεπαφή(interface) ένα σημείο σύνδεσης που ανήκει σε έναν κόμβο +και ένας σύνδεσμος(link) συνδέει δύο τέτοια σημεία. +Οι ρυθμίσεις(settings) κόμβου περιγράφουν ιδιότητες του ίδιου του δικτυακού namespace, ενώ οι υπηρεσίες(services) αναπαριστούν +ανεξάρτητες διεργασίες που εκτελούνται μέσα σε αυτό. + +\subsubsection{Κόμβοι και διεπαφές} + +Οι κόμβοι δηλώνονται με ένα μοναδικό λογικό όνομα και έναν τύπο. +Οι τύποι που υποστηρίζονται στην παρούσα υλοποίηση είναι \texttt{host}, \texttt{switch} και \texttt{router}. +Ο τύπος εκφράζει τη \emph{σημασιολογία του κόμβου} και όχι απαραίτητα το συγκεκριμένο αντικείμενο του Mininet που +θα χρησιμοποιηθεί για την υλοποίησή του. + +Οι διεπαφές \textbf{ανήκουν στους κόμβους} και προσδιορίζονται από λογικά ονόματα, τα οποία δεν απαιτείται να +ταυτίζονται με τα ονόματα που θα δημιουργηθούν τελικά στο Linux. +Για παράδειγμα, μία διεπαφή με λογικό όνομα \texttt{lan} μπορεί κατά την υλοποίηση να αντιστοιχιστεί στη φυσική +διεπαφή \texttt{r0-eth0}. +Η επιλογή αυτή επιτρέπει στο αρχείο JSON να χρησιμοποιεί ονόματα που εκφράζουν τον ρόλο μιας διεπαφής και όχι +λεπτομέρειες της διαδικασίας δημιουργίας της. + +Μία διεπαφή μπορεί να χρησιμοποιεί στατική διευθυνσιοδότηση, DHCP ή να μην διαθέτει καθόλου Layer-3 +παραμετροποίηση. +Στην περίπτωση στατικής διευθυνσιοδότησης δηλώνεται η διεύθυνση μαζί με το prefix και, προαιρετικά, μία +προεπιλεγμένη πύλη. +Επιπλέον μπορούν να δηλωθούν ιδιότητες όπως η διεύθυνση MAC και το MTU. + +Ιδιαίτερη σημασία έχει η διάκριση μεταξύ της \textbf{απουσίας} του πεδίου \texttt{interfaces} και της δήλωσης +ενός κενού αντικειμένου \texttt{interfaces}. +Όταν το πεδίο παραλείπεται, ο κόμβος θεωρείται ότι διαθέτει \emph{δυναμικό σύνολο διεπαφών} και νέες διεπαφές +μπορούν να δημιουργηθούν κατά την επίλυση των συνδέσμων. +Αντίθετα, όταν το πεδίο υπάρχει, ακόμη και αν είναι κενό, το σύνολο των διαθέσιμων διεπαφών θεωρείται +\emph{σταθερό}. + +\subsubsection{Σύνδεσμοι και αυτόματη επιλογή διεπαφών} + +Κάθε σύνδεσμος αποτελεί αυτοτελή οντότητα και συνδέει ακριβώς δύο endpoints. +Κάθε endpoint προσδιορίζει τον κόμβο στον οποίο ανήκει και τη λογική διεπαφή μέσω της οποίας πραγματοποιείται η +σύνδεση. +Η διεπαφή μπορεί να δηλωθεί ρητά ή να χρησιμοποιηθεί ο ειδικός επιλογέας \texttt{auto}. + +Όταν χρησιμοποιείται το \texttt{auto} σε κόμβο με σταθερό σύνολο διεπαφών, επιλέγεται μία από τις δηλωμένες +διεπαφές που δεν έχει ήδη δεσμευτεί από άλλη σύνδεση. +Αν δεν υπάρχει ελεύθερη διεπαφή, η τοπολογία θεωρείται μη έγκυρη και \textbf{δεν δημιουργείται επιπλέον θύρα + σιωπηρά}. +Όταν αντίθετα το σύνολο διεπαφών έχει παραλειφθεί, το \texttt{auto} επιτρέπει τη δυναμική δημιουργία νέας λογικής +διεπαφής για τις ανάγκες του συνδέσμου. + +Οι σύνδεσμοι μπορούν επίσης να περιλαμβάνουν παραμέτρους προσομοίωσης χαρακτηριστικών του φυσικού μέσου. +Η τρέχουσα γλώσσα υποστηρίζει περιορισμό εύρους ζώνης, καθυστέρηση, απώλεια πακέτων και jitter μέσω των πεδίων +\texttt{bandwidth\_mbps}, \texttt{delay\_ms}, \texttt{loss\_percent} και \texttt{jitter\_ms}. + +\subsubsection{Ρυθμίσεις κόμβων και υπηρεσίες} + +Οι ρυθμίσεις που αφορούν τη λειτουργία του ίδιου του κόμβου τοποθετούνται στο αντικείμενο \texttt{settings} του +αντίστοιχου node. +Για τον τύπο \texttt{router}, για παράδειγμα, υποστηρίζονται η ενεργοποίηση του IP forwarding και η +απενεργοποίηση του reverse path filtering. +Οι ιδιότητες αυτές αντιμετωπίζονται ως \emph{χαρακτηριστικά του network namespace} και όχι ως ανεξάρτητες +υπηρεσίες. + +Οι υπηρεσίες μοντελοποιούνται ξεχωριστά επειδή αντιστοιχούν σε \textbf{διεργασίες που εκτελούνται πάνω σε έναν + κόμβο}. +Στην παρούσα εργασία υποστηρίζεται η υπηρεσία \texttt{dhcp-server}, η οποία συνδέεται με έναν κόμβο και μία από +τις διεπαφές του. +Οι παράμετροι της υπηρεσίας περιλαμβάνουν το εύρος διευθύνσεων που μπορούν να εκχωρηθούν και την προεπιλεγμένη +πύλη που διαφημίζεται στους DHCP clients. + +Η θέση εκτέλεσης μιας υπηρεσίας και η διεπαφή στην οποία συνδέεται αποτελούν μέρος της ίδιας της ταυτότητάς της +και για τον λόγο αυτό δηλώνονται έξω από το αντικείμενο \texttt{settings}. +Με αυτόν τον διαχωρισμό, το \texttt{settings} περιγράφει αποκλειστικά τη συμπεριφορά της υπηρεσίας και όχι το +σημείο στο οποίο αυτή τοποθετείται μέσα στην τοπολογία. + +\subsubsection{Αυστηρότητα της γραμματικής} + +Η γραμματική σχεδιάστηκε ώστε να είναι \textbf{αυστηρή} και να μην αγνοεί άγνωστα πεδία ή μη υποστηριζόμενες +τιμές. +Ένα τυπογραφικό λάθος σε ένα όνομα ιδιότητας δεν αντιμετωπίζεται επομένως ως απουσία της ιδιότητας, αλλά ως +σφάλμα της περιγραφής. +Η επιλογή αυτή περιορίζει την πιθανότητα μία συντακτικά αποδεκτή αλλά διαφορετική από την επιθυμητή τοπολογία +να δημιουργηθεί χωρίς εμφανή προειδοποίηση. + +Η γλώσσα διαχωρίζει επίσης τη \emph{δομική εγκυρότητα} μιας περιγραφής από τη \emph{σημασιολογική συνέπειά} της. +Ένα αντικείμενο μπορεί να ακολουθεί σωστά τη γραμματική αλλά να περιγράφει, για παράδειγμα, έναν σύνδεσμο προς +ανύπαρκτο κόμβο ή μία στατική πύλη εκτός του αντίστοιχου υποδικτύου. +Η διάκριση αυτή αξιοποιείται στη συνέχεια από την αρχιτεκτονική του builder, όπου η ανάλυση της γραμματικής και +ο σημασιολογικός έλεγχος πραγματοποιούνται σε \textbf{διαφορετικά στάδια}. + + + + +\subsection{Συμπεράσματα} +... + +\section{Σύνοψη} + +Τέλος, ... + +\end{document}