Εξερευνώντας τη μηχανή VoIP Mediastreamer2. Μέρος 8

Το υλικό του άρθρου είναι παρμένο από το δικό μου κανάλι ζεν.

Εξερευνώντας τη μηχανή VoIP Mediastreamer2. Μέρος 8

Δομή πακέτων RTP

Στο παρελθόν άρθρο χρησιμοποιούμε TShark πραγματοποίησε τη σύλληψη πακέτων RTP που ανταλλάσσονταν μεταξύ του δέκτη και του πομπού μας. Λοιπόν, σε αυτό θα βάψουμε τα στοιχεία της συσκευασίας σε διάφορα χρώματα και θα μιλήσουμε για τον σκοπό τους.

Ας ρίξουμε μια ματιά στο ίδιο πακέτο, αλλά με χρωματιστά περιθώρια και επεξηγηματικές ετικέτες:
Εξερευνώντας τη μηχανή VoIP Mediastreamer2. Μέρος 8

Στο κάτω μέρος της καταχώρισης, τα byte που συνθέτουν το πακέτο RTP είναι χρωματισμένα και αυτό με τη σειρά του είναι το ωφέλιμο φορτίο του πακέτου UDP (η κεφαλίδα του είναι κυκλωμένη με μαύρο χρώμα). Τα έγχρωμα φόντα υποδεικνύουν τα byte της κεφαλίδας RTP και το μπλοκ δεδομένων που περιέχει το ωφέλιμο φορτίο του πακέτου RTP επισημαίνεται με πράσινο χρώμα. Τα δεδομένα παρουσιάζονται σε δεκαεξαδική μορφή. Στην περίπτωσή μας, αυτό είναι ένα ηχητικό σήμα συμπιεσμένο σύμφωνα με το u-law (mu-law), δηλ. ένα δείγμα έχει μέγεθος 1 byte. Εφόσον χρησιμοποιήσαμε τον προεπιλεγμένο ρυθμό δειγματοληψίας (8000 Hz), με ρυθμό πακέτων 50 Hz, κάθε πακέτο RTP θα πρέπει να περιέχει 160 byte ωφέλιμου φορτίου. Θα το δούμε αυτό μετρώντας τα byte στην πράσινη περιοχή, θα πρέπει να υπάρχουν 10 γραμμές από αυτά.

Σύμφωνα με το πρότυπο, η ποσότητα των δεδομένων στο ωφέλιμο φορτίο πρέπει να είναι πολλαπλάσιο των τεσσάρων, ή με άλλα λόγια, πρέπει να περιέχει έναν ακέραιο αριθμό λέξεων τεσσάρων byte. Εάν συμβεί ότι το ωφέλιμο φορτίο σας δεν ταιριάζει με αυτόν τον κανόνα, τότε πρέπει να προσθέσετε byte μηδενικής αξίας στο τέλος του ωφέλιμου φορτίου και να ορίσετε το bit Padding. Αυτό το bit βρίσκεται στο πρώτο byte της κεφαλίδας RTP και είναι χρωματισμένο σε τιρκουάζ. Σημειώστε ότι όλα τα byte ωφέλιμου φορτίου είναι 0xFF, κάτι που μοιάζει με το u-law silence.

Η κεφαλίδα του πακέτου RTP αποτελείται από 12 υποχρεωτικά byte, αλλά σε δύο περιπτώσεις μπορεί να είναι μεγαλύτερη:

  • Όταν ένα πακέτο φέρει ένα ηχητικό σήμα που λαμβάνεται με τη μίξη σημάτων από διάφορες πηγές (ροές RTP), τότε μετά τα πρώτα 12 byte της κεφαλίδας υπάρχει ένας πίνακας με μια λίστα αναγνωριστικών πηγής των οποίων τα ωφέλιμα φορτία χρησιμοποιήθηκαν για τη δημιουργία του ωφέλιμου φορτίου αυτού του πακέτου. Σε αυτήν την περίπτωση, στα κάτω τέσσερα bit του πρώτου byte της κεφαλίδας (πεδίο Αριθμός αναγνωριστικών πηγών που συνεισφέρουν) υποδεικνύει τον αριθμό των πηγών. Το μέγεθος του πεδίου είναι 4 bit, επομένως ο πίνακας μπορεί να περιέχει έως και 15 αναγνωριστικά πηγής. Καθένα από τα οποία καταλαμβάνει 4 byte. Αυτός ο πίνακας χρησιμοποιείται κατά τη ρύθμιση μιας κλήσης συνδιάσκεψης.

  • Όταν ο τίτλος έχει την επέκταση . Σε αυτήν την περίπτωση, το bit ορίζεται στο πρώτο byte της κεφαλίδας X. Στην εκτεταμένη κεφαλίδα, μετά τον πίνακα των συμμετεχόντων (εάν υπάρχει), υπάρχει μια κεφαλίδα επέκτασης μιας λέξης, ακολουθούμενη από τις λέξεις επέκτασης. Μια επέκταση είναι μια συλλογή από byte που μπορείτε να χρησιμοποιήσετε για να μεταφέρετε πρόσθετα δεδομένα. Το πρότυπο δεν ορίζει τη μορφή αυτών των δεδομένων - μπορεί να είναι οτιδήποτε. Για παράδειγμα, μπορεί να είναι κάποιες πρόσθετες ρυθμίσεις για τη συσκευή που λαμβάνει πακέτα RTP. Για ορισμένες εφαρμογές, ωστόσο, έχουν αναπτυχθεί εκτεταμένα πρότυπα κεφαλίδων. Αυτό γίνεται, για παράδειγμα, για επικοινωνίες στο πρότυπο ED-137 (Πρότυπα διαλειτουργικότητας για στοιχεία VoIP ATM).

Τώρα ας δούμε τα πεδία κεφαλίδας με περισσότερες λεπτομέρειες. Παρακάτω είναι μια κανονική εικόνα με τη δομή της κεφαλίδας RTP, στην οποία επίσης δεν μπόρεσα να αντισταθώ και ζωγράφισα στα ίδια χρώματα.

Εξερευνώντας τη μηχανή VoIP Mediastreamer2. Μέρος 8
VER — αριθμός έκδοσης πρωτοκόλλου (τρέχουσα έκδοση 2)·

P - μια σημαία που ορίζεται σε περιπτώσεις όπου το πακέτο RTP συμπληρώνεται με κενά byte στο τέλος.

X - επισήμανση ότι η κεφαλίδα είναι εκτεταμένη.

CC — περιέχει τον αριθμό των αναγνωριστικών CSRC που ακολουθούν τη σταθερή κεφαλίδα (μετά τις λέξεις 1..3), ο πίνακας δεν φαίνεται στο σχήμα.

M — δείκτης της αρχής ενός καρέ ή της παρουσίας ομιλίας στο κανάλι (εάν χρησιμοποιείται ανιχνευτής παύσης ομιλίας). Εάν ο δέκτης δεν περιέχει ανιχνευτή παύσης ομιλίας, τότε αυτό το bit θα ρυθμιστεί μόνιμα.

PTYPE - καθορίζει τη μορφή του ωφέλιμου φορτίου.

Αριθμός ακολουθίας - αριθμός πακέτου, που χρησιμοποιείται για την επαναφορά της σειράς με την οποία παίζονται τα πακέτα, καθώς η πραγματική κατάσταση είναι όταν τα πακέτα μπορούν να φτάσουν στον παραλήπτη με λάθος σειρά με την οποία στάλθηκαν. Η αρχική τιμή πρέπει να είναι τυχαία, αυτό γίνεται έτσι ώστε εάν η ροή RTP είναι κρυπτογραφημένη, θα είναι δύσκολο να την χακάρετε. Επίσης, αυτό το πεδίο σάς επιτρέπει να ανιχνεύσετε χαμένα πακέτα.

Timestamp - χρονική σήμανση. Ο χρόνος μετριέται σε δείγματα σήματος, δηλ. Εάν μια ριπή περιέχει 160 δείγματα, τότε η χρονική σήμανση της επόμενης ριπής θα είναι επιπλέον 160. Η αρχική τιμή της χρονικής σφραγίδας πρέπει να είναι τυχαία.

SSRC — αναγνωριστικό της πηγής πακέτου, πρέπει να είναι μοναδικό. Είναι καλύτερα να το δημιουργήσετε τυχαία πριν ξεκινήσετε τη ροή RTP.

Εάν αναπτύξετε τον δικό σας πομπό ή δέκτη RTP, θα πρέπει να ελέγξετε τα πακέτα σας περισσότερες από μία φορές για να αυξήσετε την παραγωγικότητα, σας συνιστώ να μάθετε πώς να χρησιμοποιείτε το φιλτράρισμα πακέτων στο TShark, σας επιτρέπει να καταγράφετε μόνο τα πακέτα που είναι ενδιαφέρον για εσάς. Σε ένα περιβάλλον όπου δεκάδες συσκευές RTP λειτουργούν στο δίκτυο, αυτό είναι πολύ πολύτιμο. Στη γραμμή εντολών TShark, οι επιλογές φιλτραρίσματος καθορίζονται με την επιλογή "-f". Χρησιμοποιήσαμε αυτήν την επιλογή όταν θέλαμε να καταγράψουμε πακέτα από τη θύρα 8010:
-f "udp port 8010"
Οι παράμετροι φιλτραρίσματος είναι ουσιαστικά ένα σύνολο κριτηρίων που πρέπει να πληροί ένα πακέτο "πιασμένο". Η συνθήκη μπορεί να ελέγξει τη διεύθυνση, τη θύρα, την τιμή ενός συγκεκριμένου byte στο πακέτο. Οι συνθήκες μπορούν να συνδυαστούν με λογικές πράξεις "AND", "OR" κ.λπ. Ένα πολύ δυνατό εργαλείο.

Εάν θέλετε να δείτε τη δυναμική των αλλαγών πεδίου σε παρτίδες, θα χρειαστεί να αντιγράψετε την έξοδο TShark σε ένα αρχείο, όπως φαίνεται στο τελευταίο άρθρο, περνώντας την έξοδο TShark στην είσοδο στόχος. Στη συνέχεια, ανοίξτε το αρχείο καταγραφής με λιγότερο, vim ή άλλο εργαλείο που μπορεί να λειτουργήσει γρήγορα με τεράστια αρχεία κειμένου και να αναζητήσει συμβολοσειρές, μπορείτε να μάθετε όλες τις αποχρώσεις της συμπεριφοράς των πεδίων πακέτων σε μια ροή RTP.

Εάν πρέπει να ακούσετε το σήμα που μεταδίδεται από τη ροή RTP, τότε πρέπει να χρησιμοποιήσετε την έκδοση TShark με οπτική διεπαφή Wireshark. Με απλούς χειρισμούς του ποντικιού, μπορείτε να ακούσετε και να δείτε την κυματομορφή του σήματος. Αλλά υπό έναν όρο - εάν είναι κωδικοποιημένο σε μορφή u-law ή a-low.

Επόμενο άρθρο θα κάνουμε μια αμφίδρομη ενδοεπικοινωνία μαζί σας. Προμηθευτείτε ένα ζευγάρι ακουστικά και έναν συνομιλητή.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο