In diesem Kapitel geht es um die Technik, die einzelnen Sprachpakete von A nach B zu bekommen. Dies wird mit Hilfe von verschiedenen Übertragungsprotokollen geleistet. Diese Protokolle setzen aber wiederum auf verschiedene Netzwerkprotokolle (TCP und UDP) auf. Um manche Probleme zu verstehen, benötigt man ein grundlegendes Verständnis dieser Netzwerkprotokolle. Deshalb werden diese hier näher erklärt. Sie sind nicht wesentlich, um Asterisk erfolgreich einzusetzen, jedoch sehr wertvoll für ein tieferes Verständnis der Vorgänge. Dieses Kapitel ist in erster Linie als Nachschlagewerk für den Fall der Fälle gedacht.
Dem Leser sei an dieser Stelle der Wikipedia-Artikel zu diesem Thema wärmstens empfohlen und die nachfolgende Darstellung ist in ihrer Struktur an demselben[76] angelehnt.
Für alle Ungeduldigen, hier eine einfache und knappe Definition: TCP ist ein Protokoll, das sicherstellt, dass die Übertragung der gesamten Information vom Sender geordnet und vollständig beim Empfänger ankommt. Das Ziel der vollständigen und korrekten Datenübertragung wird mit einem relativ großen Overhead im Verhältnis zur Nutzlast erkauft. Im Gegensatz dazu investiert das Schwesterprotokoll UDP sehr viel weniger in die Steuerung der Übertragung und schickt einfach alles raus und stellt nicht sicher, dass jedes einzelne Datenpaket auch wirklich beim Empfänger ankommt. Für VoIP sind beide Protokolltypen von Bedeutung, da bei einem normalen VoIP-Anruf die initiale Verbindung über TCP hergestellt wird, die reinen Sprachdaten aber mit UDP übertragen werden. Speziell für die Übertragung von Audiodaten ist Quantität der Datenpakete wichtiger als Qualität.
Das Transmission Control Protocol (TCP) ist eine Vereinbarung (Protokoll) darüber, auf welche Art und Weise Daten zwischen Computern ausgetauscht werden sollen. Alle Betriebssysteme moderner Computer beherrschen TCP und nutzen es für den Datenaustausch mit anderen Rechnern. Das Protokoll ist ein zuverlässiges, verbindungsorientiertes Transportprotokoll in Computernetzwerken. Es ist Teil der Internetprotokollfamilie, der Grundlage des Internets. Entwickelt wurde TCP von Robert E. Kahn und Vinton G. Cerf. Ihre Forschungsarbeit, die sie bereits im Jahre 1973 begannen, zog sich über mehrere Jahre hin. Deshalb erfolgte die erste Standardisierung von TCP erst im Jahre 1981 als RFC 793. Danach gab es viele Erweiterungen, die bis heute in neuen RFCs (einer Reihe von technischen und organisatorischen Dokumenten zum Internet) spezifiziert werden und alle zu TCP gehören. Im Unterschied zum verbindungslosen UDP (User Datagram Protocol) stellt TCP einen virtuellen Kanal zwischen zwei Endpunkten einer Netzwerkverbindung (Sockets) her. Auf diesem Kanal können in beide Richtungen Daten übertragen werden. TCP setzt in den meisten Fällen auf das IP (Internet-Protokoll) auf, weshalb häufig (und oft nicht ganz korrekt) auch vom TCP/IP-Protokoll die Rede ist. Es ist in Schicht 4 des OSI-Referenzmodells angesiedelt. Aufgrund seiner vielen angenehmen Eigenschaften (Datenverluste werden erkannt und automatisch behoben, Datenübertragung ist in beiden Richtungen möglich, Netzwerküberlastung wird verhindert usw.) ist TCP ein sehr weit verbreitetes Protokoll zur Datenübertragung. Beispielsweise wird TCP als (fast) ausschließliches Transportmedium für das WWW, E-Mail, Daten in Peer-to-Peer-Netzwerken und für viele andere populäre Netzwerkdienste verwendet.
TCP ist im Prinzip eine Ende-zu-Ende-Verbindung in Vollduplex, welche die Übertragung der Informationen in beide Richtungen zu gleicher Zeit zulässt. Diese Verbindung kann in zwei Halbduplexverbindungen eingeteilt werden, bei denen Informationen in beide Richtungen (allerdings nicht gleichzeitig) fließen können. Die Daten in Gegenrichtung können dabei zusätzliche Steuerungsinformationen enthalten. Die Verwaltung (management) dieser Verbindung sowie die Datenübertragung werden von der TCP-Software übernommen. Die TCP-Software ist eine Funktionssammlung und (je nach Betriebssystem unterschiedlich) bei Linux auch im Betriebssystemkern, dem Linux-Kernel, angesiedelt. Anwendungen, die diese Software häufig nutzen, sind zum Beispiel Webbrowser und Webserver. Jede TCP-Verbindung wird eindeutig durch zwei Endpunkte identifiziert. Ein Endpunkt stellt ein geordnetes Paar dar, bestehend aus IP-Adresse und Port. Ein solches Paar bildet eine bi-direktionale Software-Schnittstelle und wird auch als Socket bezeichnet. Mit Hilfe der IP-Adressen werden die an der Verbindung beteiligten Rechner identifiziert; mit Hilfe der Ports werden dann auf den beiden beteiligten Rechnern die beiden miteinander kommunizierenden Programme identifiziert. Durch die Verwendung von Portnummern auf beiden Seiten der Verbindung ist es beispielsweise möglich, dass ein Webserver auf einem Port (normalerweise Port 80) gleichzeitig mehrere Verbindungen zu einem anderen Rechner geöffnet hat. Ports sind 16-Bit-Zahlen (Portnummern) und reichen von 0 bis 65535. Ports von 0 bis 1023 sind reserviert und werden von der IANA vergeben, z.B. ist Port 80 für das im WWW verwendete HTTP-Protokoll reserviert. Allerdings ist das Benutzen der vordefinierten Ports nicht bindend. So kann jeder Administrator beispielsweise einen FTP-Server (normalerweise Port 21) auch auf einem beliebigen anderen Port laufen lassen.
Ein Webserver, der seinen Dienst anbietet, generiert einen Endpunkt mit dem Port und seiner Adresse. Dies wird als passive open oder auch als listen bezeichnet. Will ein Client eine Verbindung aufbauen, generiert er einen eigenen Endpunkt aus seiner Rechneradresse und einer noch freien Portnummer. Mit Hilfe eines ihm bekannten Ports und der Adresse des Servers kann dann eine Verbindung aufgebaut werden. Während der Datenübertragungsphase (active open) sind die Rollen von Client und Server (aus TCP-Sicht) vollkommen symmetrisch. Insbesondere kann jeder der beiden beteiligten Rechner einen Verbindungsabbau einleiten. Während des Abbaus kann die Gegenseite noch Daten übertragen, die Verbindung kann also halb-offen sein.
Der Drei-Wege-Handshake ist die Bezeichnung für ein bestimmtes Verfahren, um eine in Bezug auf Übertragungsverluste sichere Datenübertragung zwischen zwei Instanzen zu ermöglichen. Obwohl überwiegend in der Netzwerktechnik verwendet, ist der Drei-Wege-Handshake nicht auf diese beschränkt.
Beim Aufbau einer TCP-Verbindung kommt der sogenannte Drei-Wege-Handshake zum Einsatz. Der Rechner, der die Verbindung aufbauen will, sendet dem anderen ein SYN-Paket (von engl. synchronize) mit einer Sequenznummer x. Die Sequenznummern sind dabei für die Sicherstellung einer vollständigen Übertragung in der richtigen Reihenfolge und ohne Duplikate wichtig. Es handelt sich also um ein Paket, dessen SYN-Bit im Paketkopf gesetzt ist (siehe TCP-Header). Die Start-Sequenznummer ist eine beliebige Zahl, deren Generierung von der jeweiligen TCP-Implementierung abhängig ist. Sie sollte jedoch möglichst zufällig sein, um Sicherheitsrisiken zu vermeiden. Die Gegenstelle (siehe Skizze) empfängt das Paket und sendet in einem eigenen SYN-Paket im Gegenzug ihre Start-Sequenznummer y (die ebenfalls beliebig und unabhängig von der Start-Sequenznummer der Gegenstelle ist). Zugleich bestätigt sie den Erhalt des ersten SYN-Pakets, indem sie die Sequenznummer x um eins erhöht und im ACK-Teil (von engl. acknowledgment = Bestätigung) des Headers zurückschickt. Der Client bestätigt zuletzt den Erhalt des SYN/ACK-Pakets durch das Senden eines eigenen ACK-Pakets mit der Sequenznummer y+1. Dieser Vorgang wird auch als Forward Acknowledgement bezeichnet. Außerdem sendet der Client den Wert x+1 aus Sicherheitsgründen ebenso zurück. Dieses ACK-Segment erhält der Server, das ACK-Segment ist durch das gesetzte ACK-Flag gekennzeichnet. Die Verbindung ist damit aufgebaut.
Der geregelte Verbindungsabbau erfolgt ähnlich. Statt des SYN-Bits kommt das FIN-Bit (von engl. finish = Ende, Abschluss) zum Einsatz, welches anzeigt, dass keine Daten mehr vom Sender kommen. Der Erhalt des Pakets wird wiederum mittels ACK bestätigt. Der Empfänger des FIN-Pakets sendet zuletzt seinerseits ein FIN-Paket, das ihm ebenfalls bestätigt wird. Obwohl eigentlich vier Wege genutzt werden, handelt es sich beim Verbindungsabbau auch um einen Drei-Wege-Handshake, da die ACK- und FIN-Operationen vom Server zum Client als ein Weg gewertet werden. Zudem ist ein verkürztes Verfahren möglich, bei dem FIN und ACK genau wie beim Verbindungsaufbau im selben Paket untergebracht werden. Die maximum segment lifetime (MSL) ist die maximale Zeit, die ein Segment im Netzwerk verbringen kann, bevor es verworfen wird. Nach dem Senden des letzten ACKs wechselt der Client in einen zwei MSL andauernden Wartezustand (Waitstate), in dem alle verspäteten Segmente verworfen werden. Dadurch wird sichergestellt, dass keine verspäteten Segmente als Teil einer neuen Verbindung fehlinterpretiert werden. Außerdem wird eine korrekte Verbindungsterminierung sichergestellt. Geht ACK y+1 verloren, läuft beim Server der Timer ab, und das LAST_ACK Segment wird erneut übertragen.
Das TCP-Segment besteht immer aus zwei Teilen - dem Header und der Nutzlast (Payload). Die Nutzlast enthält die zu übertragenden Daten, die wiederum Protokollinformationen der Anwendungsschicht wie HTTP oder FTP entsprechen können. Der Header enthält für die Kommunikation erforderliche Daten sowie das Dateiformat beschreibende Information. Die Werte werden in network byte order (big endian) angegeben.
Ein TCP-Segment hat typischerweise eine Größe von 1500 Bytes. Es darf nur so groß sein, dass es in die darunterliegende Übertragungsschicht passt, das Internetprotokoll IP. Das IP-Paket ist theoretisch bis 65535 Bytes (64 Kilobyte) spezifiziert, wird aber selbst meist über Ethernet übertragen, und dort ist die Rahmengröße auf 1500 Bytes festgelegt. TCP und IP Protokoll definieren jeweils einen Header von 20 Bytes Größe. Für die Nutzdaten bleiben in einem TCP/IP-Paket also 1460 Bytes übrig. Da die meisten Internet-Anschlüsse DSL verwenden, gibt es dort noch das Point-to-Point Protocol (PPP) zwischen IP und Ethernet, was nochmal 8 Bytes für den PPP-Rahmen kostet. Dem TCP/IP-Paket verbleiben im Ethernet-Rahmen nur 1492 Bytes MTU, die Nutzdaten reduzieren sich auf insgesamt 1452 Bytes MSS. Dies entspricht einer Auslastung von 96,8 %.
Empfänger und Sender einigen sich vor dem Datenaustausch über das Options-Feld auf die Größe der MSS. Die Anwendung, die Daten versenden möchte, beispielsweise ein Webserver, legt zum Beispiel einen 10 Kilobyte großen Datenblock im Puffer ab. Um so mit einem 1460 Byte großen Nutzdatenfeld 10 Kilobyte Daten zu versenden, teilt man die Daten auf mehrere Pakete auf, fügt einen TCP-Header hinzu und versendet die TCP-Segmente. Dieser Vorgang wird Segmentierung genannt. Im Puffer ist der Datenblock, dieser wird in fünf Segmente aufgeteilt. Jedes Segment erhält durch die TCP-Software einen TCP-Header. Drei TCP-Segmente wurden aktuell abgeschickt. Diese sind nicht notwendigerweise sortiert, da im Internet jedes TCP-Segment einen anderen Weg nehmen und es dadurch zu Verzögerungen kommen kann. Damit die TCP-Software im Empfänger die Segmente wieder sortieren kann, ist jedes Segment nummeriert (die Segmente werden sozusagen durchgezählt). Bei der Zuordnung der Segmente wird die Sequenznummer herangezogen. Der Empfänger muss diejenigen TCP-Segmente bestätigen, die einwandfrei (Prüfsumme ist in Ordnung) angekommen sind.
Da die Anwendung Daten aus dem Puffer liest, ändert sich der Füllstand des Puffers ständig. Deshalb ist es notwendig, den Datenfluss dem Füllstand entsprechend zu steuern. Dies geschieht mit dem Sliding Window und dessen Größe. Die Größe dieser Windows wird ständig angepasst und der Process der Anpassung ist ein nicht zu unterschätzender Overhead in der Kommunikation von Sender und Empfänger.
Zu Beginn einer Datenübertragung dient der Slow-Start-Algorithmus zur Bestimmung des congestion window (wörtlich: Überlast-Zeitfenster), um einer möglichen Überlastsituation vorzubeugen. Man möchte Staus vermeiden, und da die momentane Auslastung des Netzes nicht bekannt ist, wird mit zunächst kleinen Datenmengen begonnen. Der Algorithmus startet mit einem kleinen Zeitfenster von zwei MSS, in dem Datenpakete vom Sender zum Empfänger übertragen werden. Der Empfänger sendet nun eine Bestätigung (Acknowledgement, ACK) an den Sender zurück. Anschließend wird die Größe des congestion window um eine Segmentgröße erhöht. Für jede weitere Bestätigung wird dieses wieder um eine Segmentgröße erhöht, das Limit ist das vom Empfänger festgelegte Empfangsfenster. Das Wachstum des Fensters ist in der Regel exponentiell, also erst langsam, dann schnell; insofern kann der historisch bedingte Name Slow-Start fälschlicherweise ein langsames Wachstum suggerieren.
Gehen bei einer bestimmten Fenstergröße Pakete verloren, kann das festgestellt werden, wenn der Sender innerhalb einer bestimmten Zeit (Timeout) keine Bestätigung (ACK) erhält. Man muss davon ausgehen, dass das Paket aufgrund zu hoher Netzlast von einem Router im Netz verworfen wurde. Das heißt, der Puffer eines Routers ist vollgelaufen; es handelt sich hier sozusagen um einen Stau im Netz. Um diesen aufzulösen, müssen alle beteiligten Sender ihre Netzlast reduzieren. Wird ein Paketverlust festgestellt, so wählt man die Hälfte der noch unbestätigten Daten im Netz als geeignetes Zeitfenster für die Datenübertragung zwischen diesem Sender und diesem Empfänger über den benutzten Kanal. Das verlorene Paket wird erneut übertragen, für jede Bestätigung wird die Sendefenstergröße wieder um eine MSS erhöht wie beim Slow-Start. Fast-Retransmit und Fast-Recovery werden eingesetzt, um nach einem Paketverlust schneller auf die Stau-Situation zu reagieren. Dazu informiert ein Empfänger den Sender, wenn Pakete außer der Reihe ankommen und somit dazwischen ein Paketverlust vorliegt. Hierfür bestätigt der Empfänger das letzte korrekte Paket erneut für jedes weitere ankommende Paket außer der Reihe. Man spricht dabei von Dup-Acks (Duplicate acknowledgements). Der Sender bemerkt die duplizierten Bestätigungen, und nach dem dritten Duplikat sendet er sofort, vor Ablauf des Timers, das verlorene Paket erneut. Weil nicht auf den Ablauf des Timers gewartet werden muss, heißt das Prinzip Fast Retransmit. Die Dup-Acks sind auch Hinweise darauf, dass zwar ein Paketverlust stattfand, aber doch die folgenden Pakete angekommen sind. Deshalb wird das Sendefenster nach dem Fehler nur halbiert und nicht wie beim Timeout wieder mit Slow-Start begonnen. Zusätzlich kann das Sendefenster noch um die Anzahl der Dup-Acks erhöht werden, denn jedes steht für ein weiteres Paket, welches den Empfänger erreicht hat, wenn auch außer der Reihe. Da dadurch nach dem Fehler schneller wieder die volle Sendeleistung erreicht wird, nennt man das Prinzip Fast-Recovery (schnelles Erholen). Bis zum Erkennen des Paketverlustes wurden noch weitere Pakete bis zur Sendefenstergröße übertragen. Der Empfänger konnte diese nicht nutzen, weil ein Paket der Serie verloren ging, aber er kann sie im Puffer halten. Nach der Neuübertragung des verlorenen Pakets durch den Sender bestätigt der Empfänger mittels ACK und einer höheren Sequenznummer die nun vollständige Paketfolge. Das erspart dem Sender, alle nach dem Paketverlust übertragenen Pakete erneut zu übertragen, und er kann sofort mit ganz neuen Paketen fortfahren; man nennt das kumuliertes ACK. Selective ACKs werden genutzt, um noch mehr Kontrollinformationen über den Datenfluss vom Empfänger an den Sender zurückzuschicken. Dabei wird nach einem Paketverlust vom Empfänger im TCP-Optionsfeld ein zusätzlicher Header eingefügt, aus welchem der Sender genau ersehen kann, welche Pakete bereits angekommen sind und welche fehlen (im Gegensatz zu den standardmäßigen kumulativen ACKs von TCP). Als bestätigt gelten die Pakete auch weiterhin erst dann, wenn der Empfänger dem Sender ein ACK für die Pakete übermittelt hat.
Im Gegensatz zum verbindungslosen UDP implementiert TCP einen bidirektionalen, byte-orientierten, zuverlässigen Datenstrom zwischen zwei Endpunkten. Das darunterliegende Protokoll (IP) ist paketorientiert, wobei Datenpakete verloren gehen können, in verkehrter Reihenfolge ankommen dürfen und sogar doppelt empfangen werden können. TCP wurde entwickelt, um mit der Unsicherheit der darunterliegenden Schichten umzugehen. Es prüft daher die Integrität der Daten mittels der Prüfsumme im Paketkopf und stellt die Reihenfolge durch Sequenznummern sicher. Der Sender wiederholt das Senden von Paketen, falls keine Bestätigung innerhalb einer bestimmten Zeitspanne (Timeout) eintrifft. Die Daten der Pakete werden beim Empfänger in einem Puffer in der richtigen Reihenfolge zu einem Datenstrom zusammengefügt und doppelte Pakete verworfen. Der Datentransfer kann selbstverständlich jederzeit nach dem Aufbau einer Verbindung gestört, verzögert oder ganz unterbrochen werden. Das Übertragungssystem läuft dann in einen Timeout. Der vorab getätigte Verbindungsaufbau stellt also keinerlei Gewähr für eine nachfolgende, dauerhaft gesicherte Übertragung dar.
Das User Datagram Protocol (Abk. UDP) ist ein minimales, verbindungsloses Netzprotokoll, das zur Transportschicht der Internetprotokollfamilie gehört. Aufgabe von UDP ist es, Daten, die über das Internet übertragen werden, der richtigen Anwendung zukommen zu lassen. Die Entwicklung von UDP begann 1977, als man für die Übertragung von Sprache ein einfacheres Protokoll benötigte als das bisherige verbindungsorientierte TCP. Es wurde ein Protokoll benötigt, das nur für die Adressierung zuständig war, ohne die Datenübertragung zu sichern, da dies zu Verzögerungen bei der Sprachübertragung führen würde.
Um die Daten, die mit UDP versendet werden, dem richtigen Programm auf dem Zielrechner zukommen zu lassen, werden bei UDP sogenannte Ports verwendet. Dazu wird bei UDP die Portnummer des Dienstes mitgesendet, der die Daten erhalten soll. Diese Erweiterung der Host-zu-Host- auf eine Prozess-zu-Prozess-Übertragung wird als Anwendungsmultiplexen und -demultiplexen bezeichnet.
UDP stellt einen verbindungslosen, potentiell unzuverlässigen Übertragungsdienst bereit. Das bedeutet, dass es keine Garantie gibt, dass ein einmal gesendetes Paket auch ankommt oder dass Pakete in der gleichen Reihenfolge ankommen, in der sie gesendet wurden. Eine Anwendung, die UDP nutzt, muss daher gegenüber verloren gegangenen und umsortierten Paketen unempfindlich sein oder selbst entsprechende Korrekturmaßnahmen beinhalten. Da vor Übertragungsbeginn nicht erst eine Verbindung aufgebaut werden muss, können die Hosts schneller mit dem Datenaustausch beginnen. Dies fällt vor allem bei Anwendungen ins Gewicht, bei denen nur kleine Datenmengen ausgetauscht werden müssen. Einfache Frage-Antwort-Protokolle wie das Domain Name System verwenden UDP, um die Netzwerkbelastung gering zu halten und damit den Datendurchsatz zu erhöhen. Ein Drei-Wege-Handshake wie bei TCP für den Aufbau der Verbindung würde unnötigen Overhead erzeugen. Daneben bietet die ungesicherte Übertragung auch den Vorteil von geringen Übertragungsverzögerungsschwankungen: Geht bei einer TCP-Verbindung ein Paket verloren, so wird es automatisch erneut angefordert. Dies braucht Zeit, die Übertragungsdauer kann daher schwanken, was für Multimediaanwendungen schlecht ist. Bei VoIP z.B. würde es zu plötzlichen Aussetzern kommen bzw. die Wiedergabepuffer müssten größer angelegt werden. Bei verbindungslosen Kommunikationsdiensten bringen verloren gegangene Pakete dagegen nicht die gesamte Übertragung ins Stocken, sondern vermindern lediglich die Qualität. UDP übernimmt die Eigenschaften der darunterliegenden Netzwerkschicht. Im Falle des Internet Protocols IP können Datenpakete maximal 65535 Bytes lang sein, wovon der IP-Header und UDP-Header insgesamt mindestens 28 Bytes belegen. UDP-Datagramme haben daher maximal 65507 Nutzdatenbytes. Solche Pakete werden jedoch von IP fragmentiert übertragen, so dass UDP nur bei Datenpaketgrößen bis zu einigen Kilobytes sinnvoll ist. IP löscht Pakete etwa bei Übertragungsfehlern oder bei Überlast. Datagramme können daher fehlen. Das UDP-Protokoll bietet hierfür keine Erkennungs- oder Korrekturmechanismen wie etwa TCP. Im Falle von mehreren möglichen Routen zum Ziel kann IP bei Bedarf neue Wege wählen. Hierdurch ist es in seltenen Fällen sogar möglich, dass später gesendete Daten früher gesendete überholen.
Ein Channel ist die Verbindung zwischen zwei Punkten (in unserem Fall sind das meistens menschliche Gesprächsteilnehmer). Es gibt folgende Channel-Arten:
Agent
Ein ACD Agent-Channel
CAPI
Ein ISDN-Channel
Console
Ein Linux-Konsolen-Client-Treiber für Soundkarten, die mit OSS oder ALSA angesprochen werden können.
H.323
Ein VoIP-Protokoll
IAX
Ein VoIP-Protokoll
Anmerkung Prinzipiel gibt es zwei Versionen von IAX (1 und 2). Wer heute von IAX spricht, meint eigentlich immer IAX2 (also die Version 2).
Local
Ein Loopback in einen anderen Context
MGCP
Ein VoIP-Protokoll
mISDN
Ein ISDN-Channel
NBS
Network Broadcast Sound
phone
Linux Telephony Channel
SIP
Ein VoIP-Protokoll
Skinny
Ein VoIP-Protokoll
vISDN
Ein ISDN-Channel
VOFR
Voice over frame relay Adtran style
VPB
Verbindung von normalen Telefonanschlüssen mit Voicetronix-Karten
Zap
Verbindung von normalen Telefonanschlüssen mit Digium-Karten. Wird aber auch häufig für Karten anderer Hersteller benutzt.
In den meisten Beispielen in diesem Buch wird immer von SIP-Verbindungen ausgegangen. Der Grund dafür ist einfach: Zurzeit gibt es sehr viel mehr SIP- als z.B. IAX-fähige VoIP-Telefone. In diesem Kapitel werden diese zwei wichtigen Protokolle im Einzelnen beschrieben. Wer will, kann dieses Kapitel aber überspringen und bei konkreten Fragen zu bestimmten Parametern hier nachschlagen.
Die Unterscheidung der Begriffe Peer, User und Friend ist in der Asterisk-Dokumentation nicht immer leicht verständlich dargestellt und wird daher auch teilweise falsch auf manchen Webseiten wiedergegeben. Die folgende Tabelle zeigt die jeweiligen Funktionen:
Asterisk | <= | User |
Asterisk | => | Peer |
Asterisk | <=> | Friend |
Ein Peer kann also nur angerufen werden, ein User nur anrufen und ein Friend kann beides.
Tipp | |
---|---|
In der Praxis wird meistens nur |
Fast jeder Asterisk-Administrator muss sich irgendwann einmal die Frage stellen, ob er eher auf SIP oder eher auf IAX setzen soll. Die kurze Antwort: Wenn IAX möglich ist (also, wenn die Telefone es unterstützen), dann sollte IAX benutzt werden. Ansonsten immer SIP. Mark Spencer (der Erfinder von Asterisk) hat zu diesem Thema auf einer Asterisk-Mailingliste im Jahr 2004 eine ausführlichere Antwort geschrieben (die im Original englische E-Mail finden Sie im Anhang C, IAX vs. SIP):
Date: Mon, 5 Jul 2004 18:59:52 -0500 (CDT) From: Mark Spencer <markster@digium.com> Ich möchte einige Unterschiede zwischen SIP und IAX kurz zusammenfassen. Vielleicht hilft Dir das bei der Entscheidungsfindung. 1) IAX arbeitet während des Gesprächs unabhängig von der Anzahl der Anrufe und des verwendeten Codecs effizienter als RTP. Der Vorteil liegt irgendwo zwischen 2400 Kbit/s für einen Einzelanruf und der dreifachen Anzahl der Anrufe pro Megabit bei G.729, wenn die Messung bei aktiviertem Trunk-Modus auf der MAC-Ebene vorgenommen wird. 2) IAX ist nicht ASCII-, sondern datenelementkodiert. Dies macht Implementierungen wesentlich leichter und zudem robuster gegenüber Pufferüberlaufangriffen, da absolut keine Textanalyse oder -interpretation erforderlich ist. IAX führt den gesamten IP-Stapel, IAX-Stapel, TDM-Schnittstelle, Echokompensation und Erzeugung der Anrufer-ID auf 4k Heap und Stack sowie 64k Flash aus. Dies veranschaulicht ganz klar die Implementierungseffizienz des Entwurfs. Die Größe der IAX-Signalpakete ist drastisch geringer als die bei SIP, was aber in der Regel nur dann erwähnenswert ist, wenn zahlreiche Clients sich häufig registrieren. Allgemein gesprochen ist IAX2 bei der Kodierung, der Dekodierung und der Überprüfung der Daten effizienter. Zudem wäre es für den Autor einer IAX-Implementierung extrem schwierig, eine Inkompatibilität mit einer anderen Implementierung herzustellen, da für eine Interpretation kaum Raum vorhanden ist. 3) IAX weist eine sehr klare Trennung von Schicht 2 und Schicht 3 auf, d.h. sowohl Signalisierung als auch Tondaten haben definierte Zustände, werden robust und in konsistenter Weise übertragen, und wenn ein Endpunkt des Anrufs unvermittelt verschwindet, dann wird der Anruf auch zeitnah beendet und zwar auch dann, wenn keine weiteren Signale und/oder Audiodaten empfangen werden. Einen solchen Mechanismus weist SIP nicht auf; hinzu kommt, dass, was die Signalisierung angeht, die Zuverlässigkeit sehr niedrig und schwerfällig ist, weswegen zusätzlich zum Kernstandard RF3261 weitere Standards benötigt werden. 4) Die einheitlichen Signalisierungs- und Audiopfade von IAX gestatten die transparente Navigation von NATs, und der Firewall-Administrator muss lediglich einen einzigen Port öffnen, um den Einsatz von IAX zu gestatten. Der IAX-Client muss für einen korrekten Betrieb überhaupt nichts über das Netzwerk wissen, in dem er sich befindet. Anders gesagt: Es kann niemals eine durch eine Firewall bedingte Situation auftreten, in der IAX einen Anruf aufbauen und dann keine Audiodaten übertragen kann (natürlich vorausgesetzt, es ist genügend Bandbreite vorhanden). 5) Das authentifizierte Übertragungssystem von IAX gestattet die Übertragung von Audio- und Rufsteuerdaten über einen zwischengeschalteten Server auf eine robuste Weise: Wenn zwei Endpunkte einander aus irgendeinem Grund nicht erkennen können, wird der Ruf über den Zentralserver gehalten. 6) IAX trennt die Caller-ID vom Authentifizierungsmechanismus des Benutzers. SIP verfügt hierzu über keine eindeutige Methode, sofern nicht Remote-Party-IDs verwendet werden. 7) SIP ist ein IETF-Standard. Zwar gibt es eine neue Dokumentation von Frank Miller, aber IAX ist gegenwärtig noch kein veröffentlichter Standard. 8) IAX ermöglicht es einem Endpunkt, die Gültigkeit einer Telefonnummer zu überprüfen, damit er weiß, ob die Nummer vollständig ist, vollständig sein könnte oder aber zwar vollständig ist, aber länger sein könnte. SIP bietet hierfür keine vollständige Unterstützung. 9) IAX sendet DTMF stets außerbandig, d.h. es kann keine Verwirrung bezüglich der Frage entstehen, welche Methode verwendet wird. 10) IAX unterstützt die Übertragung von Sprache und Context, was in einer Asterisk-Umgebung durchaus sinnvoll ist. Mehr fällt mir jetzt im Moment nicht ein. Mark PS: Ich nehme mal an, dass SIP trotzdem ein paar Vorteile aufweisen muss (andernfalls wären seine Entwickler ja Dummköpfe). Es bleibt also zu fragen, wie IAX die folgenden Aspekte verwaltet: 1) Bandbreitenanzeige 2) Neue Codecs 3) Erweiterbarkeit 4) Parken von Verbindungen und andere komplexe Szenarien 5) Videotelephonie Ich habe den Eindruck, dass dies alles in SIP besser geregelt ist.
Nachtrag zu dieser E-Mail: IAX ist mittlerweile ein offenes und gut dokumentiertes Protokoll.
SIP hat sich de facto zum Standardprotokoll im VoIP-Umfeld etabliert. Warum?[77]
Wahrscheinlich liegt es an folgenden Punkten:
Es ist ein offenes Protokoll.
Die Spezifikation war von Anfang an als RFC 3261 für jeden Entwickler kostenlos einsehbar.
Vom rein technischen Standpunkt ist das IAX-Protokoll dem SIP-Protokoll in einzelnen Aspekten (siehe E-Mail von Mark Spencer) mindestens leicht überlegen. Bei vielen Installationen würde man mit IAX sogar sehr viel weniger Probleme haben, als mit SIP. Ein Grund hierfür ist das NAT-Problem bei SIP, das bei IAX in dieser Form nicht auftritt und das bei der Verwendung von SIP und einer Firewall dazu führt, dass bei der Firewall sehr viele UDP-Ports freigeschaltet werden müssen. Weiterhin können über einen IAX-Channel mehrere Gespräche gleichzeitig geführt werden. Bei SIP muss für jedes Gespräch ein eigener Channel aufgebaut werden (großer Verwaltungsoverhead).
Anmerkung | |
---|---|
Das IP-Protokoll unterscheidet zwei wesentliche Transportmöglichkeiten: TCP und UDP. TCP unterstützt eine sichere Übertragung von Daten, da nach der Übertragung durch Checksummen überprüft wird, ob evtl. ein Paket fehlt. Dieses kann dann noch mal angefordert werden. TCP wird zum Beispiel beim Abruf von Webseiten benutzt. Bei den meisten Übertragungen von Ton- und Bildinformation benötigt man diesen Overhead allerdings nicht. Falls bei einer Videoübertragung ein Bild ausfällt, dann kann man dieses Bild nicht ein paar Sekunden später einfügen. Es wird also einfach weggelassen - Vergleichbares passiert bei Audiostreams. Für die Übertragung von Multimediadaten wird in der Regel UDP verwendet. Es garantiert zwar keine lückenlose Übertragung der Daten, besitzt dafür aber einen geringeren Verwaltungsoverhead und ist in dieser Hinsicht schneller" als TCP. |
Die wenigsten Büro- und Privat-PCs haben eine eigene feste IP-Adresse aus dem öffentlichen Adressbereich des Internets. Diese wäre mit dem jetzigen IPv4-Standard wahrscheinlich auch nicht für jedes TCP/IP-taugliche Gerät verfügbar, da der IPv4-Adressraum zu klein ist für alle bereits vorhandenen Geräte.
Anmerkung | |
---|---|
Der IPv4-Adressraum verfügt über insgesamt 2 hoch 32 einzelne Adressen und man kann wahrscheinlich nicht herausfinden, ob es wirklich noch möglich wäre, jedem IP-fähigen, aktuell vorhandenen Gerät eine feste IP-Adresse aus dem öffentlichen Adressraum zu geben. Das Problem ist auch, dass die Adressen nicht wahllos vergeben werden können, sondern nur innerhalb sinnvoller Broadcastdomains und bereits ganze Class-A-Bereiche (ca. 17 Mio Adressen) in den Anfängen des Internets großzügig auch einzelnen Firmen zugeteilt wurden. |
Eine Lösung dieses Problems ist es Rechner, bzw. gesamte Rechnernetze, über ein so genanntes NAT-Gateway mit dem Internet zu verbinden. NAT ist das Akronym für "Network Address Translation". Mithilfe von NAT teilt ein einzelner Rechner (NAT-Gateway) seine feste offizielle IP-Adresse mit allen verbundenen Rechnern, die in der Regel über eine IP-Adresse aus dem privaten, im Internet nicht gerouteten Bereich[78], verfügen. Ein NAT-Gateway nimmt alle Anfragen von Rechnern aus dem privaten Netz (meist Intranet genannt) an und leitet diese dann mit der eigenen offiziellen IP-Adresse ins Internet weiter. Kommen die angeforderten Daten aus dem Internet zurück, leitet das NAT-Gateway die Daten entsprechend ins Intranet[79]. TCP/IP-Datenpakete bestehen in der Regel aus einem Envelope (Umschlag) und dem Content/Payload (Inhalt/Nutzlast). Im Envelope stehen Informationen über Ursprung und Ziel des Contents, also auch die IP-Adresse des Rechners, von dem die Kommunikation gestartet wurde. Diese Daten werden vom NAT-Gateway umgeschrieben. Es merkt sich die ursprüngliche IP-Adresse (für die Rückantwort) und schreibt für den öffentlichen Bereich des Internets seine eigene offizielle IP-Adresse in den Envelope. Kommen die angeforderten Daten zurück, schreibt das NAT-Gateway wieder die ursprüngliche IP-Adresse in den Envelope und leitet die Daten entsprechend an den Rechner zurück, der eigentlich die Kommunikaton gestartet hatte. Dies klappt bei den meisten Protokollen sehr gut. Allerdings benutzt SIP nicht den Umschlag, sondern schreibt die für das Protokoll benötigte IP-Adresse in den Inhalt des Paketes. Normale NAT-Gateways können nur mit IP-Adressen im Envelope umgehen, nicht aber im Content. Der gängige Fehler ist nun folgender: Der Zielrechner verfügt über eine offizielle IP-Adresse und der Quellrechner über eine private Adresse. Der anfordernde Rechner adressiert die Pakete mit der offiziellen IP-Adresse und schreibt seine Absenderadresse direkt in den Content und nicht in den Envelope. Die Pakete werden korrekt geroutet und landen beim Zielrechner. Da die Quell-IP nicht im Envelope gesetzt war, konnte das NAT-Gateway die private nicht in eine offizielle IP-Adresse umschreiben. Daher versucht der Zielrechner, die Daten an die in den Paketen angegebene IP-Adresse zu senden. IP-Adressen aus dem privaten Adressbereich werden jedoch nicht geroutet und der Quellrechner erhält keine Daten vom Zielrechner. In der Regel besitzen die Rechner im Intranet eines Unternehmens IP-Adressen aus dem privaten Adressbereich und müssen für die Kommunikation mit Rechnern im Internet auf die Dienste eines NAT-Gateways zurückgreifen.[80] Für Telefone im Intranet ist diese Adressproblematik ohne Belang, da ja im Intranet alle IP-Adressen geroutet und IP-Pakete korrekt verteilt werden. Verbindungen ins Internet sind jedoch mit SIP standardmäßig über ein NAT-Gateway nicht möglich. Eine genaue Beschreibung des NAT-Problems, das auch für einige andere Anwendungen relevant ist, findet man in der Wikipedia unter http://de.wikipedia.org/wiki/Network_Address_Translation.
Anmerkung | |
---|---|
Auf welchen Ports Asterisk nach eingehenden RTP-Verbindungen
lauscht, kann in der |
In der extensions.conf
werden Kanäle zu
SIP-Geräten in der Form
SIP/
angegeben. Um einen
beliebigen SIP-User über das Internet zu erreichen, verwendet man
Gerätename
SIP/
,
für einen User auf einem Proxy gibt man
user
@domain
SIP/
oder
proxy
/user
SIP/
an, wobei der Proxy als Abschnitt definiert sein muss (siehe „Channel-Einstellungen“).user
@proxy
Nützliche CLI-Befehle:
sip show peers
- Listet alle SIP peers auf (auch friends)
sip show users
- Listet alle SIP users auf (auch friends)
sip show registry
- Zeigt den Status der Hosts, bei denen wir uns anmelden
sip debug
bzw.sip set debug
- Zeigt SIP-Debug-Meldungen.
Diese Einstellungen werden in der sip.conf im Abschnitt
[general]
vorgenommen. Hier sollen aber nur die wichtigsten
und gebräuchlichsten Parameter beschrieben werden, weitere Erklärungen zu
exotischen Parameter finden sich in der
sip.conf
.
I.d.R. ist es möglich, diese Einstellungen auch für einzelne User/Peers vorzunehmen.
allowtransfer = [yes|no]
Transfer von Verbindungen erlauben. Default: yes
allowtransfer=yes
realm = Hostname
Der Systemname des Asterisk-Servers zur Authentifizierung.
Default: asterisk
oder ein ggf. in
asterisk.conf
eingestellter Systemname. Verwenden
Sie hier den Host- oder Domain-Namen Ihres Servers.
realm=ast1.beispiel.de
bindport = Portnummer
Der UDP-Port, auf dem SIP-Verbindungen entgegengenommen werden sollen. Default: 5060.
bindport=5060
bindaddr = IP-Adresse
Die IP-Adresse, auf der SIP-Verbindungen entgegengenommen werden sollen. Default: 0.0.0.0 für alle Adressen des Rechners.
bindaddr=0.0.0.0
Für SIP können 3 TOS[81]-Parameter angegeben werden, um SIP-Paketen im Netzwerk
eine andere Priorität als z.B. Datenübertragungen zu geben. Eine
genauere Beschreibung steht unter „tos
“. I.d.R. solle man diese Werte angeben
(per Default nicht gesetzt):
tos_sip=cs3 ; für SIP-Pakete (Kommunikationsaufbau) tos_audio=ef ; für RTP-Audio-Pakete tos_video=af41 ; für RTP-Video-Pakete
Mit allow
und disallow
können bestimmte
Sprachcodecs erlaubt oder nicht erlaubt werden. Außer den bekannten
Codecs gibt es all
für alle. Dabei ist die Reihenfolge
wichtig.
; Beispiel: alle Codecs ausser ilbc erlauben: allow=all disallow=ilbc ; Beispiel: nur die Codecs gsm und ulaw erlauben: disallow=all allow=gsm allow=ulaw
dtmfmode = Modus
Verfahren, wie DTMF-Töne gesendet werden. Mögliche Werte:
rfc2833
- (default) Informationsnachrichten nach RFC 2833 senden.
info
- Als SIP INFO Nachrichten senden.
inband
- DTMF-Töne „inband“ als Audio senden.
auto
- Verwendet
rfc2833
wenn möglich, sonstinband
.
dtmfmode=rfc2833
videosupport = [yes|no]
Schaltet die generelle Unterstützung von Video-Übertragungen ein (nicht getestet). Video-Unterstützung kann in den einzelnen Kanälen ausgeschaltet werden, kann aber dort nicht aktivierten werden ohne diese globale Einstellung.
videosupport=yes
maxcallbitrate = Übertragungsrate
Bestimmt die maximale Übertragungsrate für Video-Telefonate in
Kilobits pro Sekunde. Default: 384
(für 384 kb/s).
maxcallbitrate=384
g726nonstandard = [yes|no]
Stellt ein, dass, wenn ein Peer G726-32 Audio aushandelt, AAL2
packing statt RFC3551 packing verwendet wird (siehe
doc/rtp-packetization.txt
, ab Asterisk 1.4). Dies
sollte nur eingestellt werden, wenn Sie Probleme mit z.B. Grandstream-
oder Sipura-Telefonen haben, die fälschlicherweise G726-32 aushandeln,
obwohl sie AAL2-G726-32 meinen.
g726nonstandard=no
rtpkeepalive = Intervall
Sendet im in Sekunden angegebenen Intervall Keep-Alive-Pakete im RTP-Stream, um NAT[82]-Routen offenzuhalten.
rtpkeepalive=5 ; alle 5 Sekunden Keep-Alive-Pakete senden
t38pt_udptl = [yes|no]
Erlaubt das Durchschleifen von T.38-Fax-Übertragungen von SIP- zu
SIP-Kanälen. Default: no
. Kann pro Kanal deaktiviert, aber
nicht ohne diese Einstellung aktiviert werden.
t38pt_udptl=yes
register =>user
[:passwort
[:authuser
]]@host
[:port
][/extension
]
Damit kann sich Asterisk als SIP-User bei einem anderen SIP-Proxy (z.B. einem externen Provider) registrieren.
Der Host ist entweder ein normaler Hostname, der per DNS aufgelöst werden kann, oder der Name eines Abschnitts, der weiter unten definiert ist.
Die Extension muss in der extensions.conf definiert sein, damit
Anrufe von diesem Proxy empfangen werden können. Ohne Angabe der
Extension gilt s
.
; eingehende Anrufe von sip-provider.de an die Extension 999 leiten:
register => 123456:passwort@sip-provider.de/999
; eingehende Anrufe von sip-provider an die Extension 999 leiten:
register => 123456:passwort@sip-provider/999
[sip-provider]
...
externip = IP-Adresse
Diese Einstellungen kann wichtig sein, wenn sich Asterisk hinter einem NAT-Router befindet. Die angegebene IP-Adresse wird in ausgehenden SIP-Nachrichten verwendet, damit die Empfänger unsere korrekte öffentliche Adresse wissen (statt unserer Adresse aus dem privaten Netz).
externip=123.45.67.89
externhost = Hostname
Wie „externip
“, nur dass stattdessen
der eigene öffentliche Hostname angegeben wird (der natürlich per DNS
auflösbar sein muss).
externhost=hanspeter.dyndns.net
localnet = Adressraum
Gibt die lokalen, privaten Netzwerke an. Meist kann man folgendes verwenden (nach RFC 1918 und Zeroconf):
localnet=192.168.0.0/255.255.0.0 localnet=10.0.0.0/255.0.0.0 localnet=172.16.0.0/12 localnet=169.254.0.0/255.255.0.0
canreinvite = [yes|nonat|update|update,nonat]
Normalerweise versucht Asterisk den optimalsten „audio path“ zu wählen, d.h. bei 2 hergestellten Channels die beiden Gesprächsteilnehmer direkt zu verbinden ohne Asterisk als Mittelsmann. Das funktioniert aber nicht, wenn sich ein User in einem NAT befindet.
- yes
(default) Normale Einstellung. Asterisk versucht, den kürzesten Audio-Pfad zu verwenden.
- nonat
Nur umleiten, wenn sich die Teilnehmer nicht hinter einem NAT befinden (sofern das für Asterisk erkennbar ist).
- update
Statt
INVITE
-UPDATE
-Pakete zum Umleiten verwenden. Kann mitnonat
alsupdate,nonat
kombiniert werden.
canreinvite=nonat
jbenable = [yes|no]
Schaltet den „Jitter-Buffer“ für eingehendes Audio
ein wenn nötig. Dadurch können unterschiedliche Latenzen von IP-Paketen
ausgeglichen werden (siehe Jitter). Default:
no
jbenable=yes
jbforce = [yes|no]
Schaltet den Jitter-Buffer immer ein. (Natürlich muss auch
jbenable
aktiviert sein.) Default: no
jbforce=no
jbmaxsize = Länge
Maximale Größe des Jitter-Buffers in Millisekunden. Default: 200.
jbmaxsize=200
jbresyncthreshold = Länge
Resynchronisations-Rahmen des Jitter-Buffers. Default: 1000.
jbresyncthreshold=500
jbimpl = [fixed|adaptive]
Bestimmt, welcher Jitter-Buffer-Algorithmus verwendet wird. Bisher sind zwei Algorithmen implementiert:
fixed
- (default) Der klassiche Jitter-Buffer mit fester Größe
(immer
jbmaxsize
). adaptive
- Der neue Algorithmus mit variabler Größe (das ist auch der Jitter-Buffer von IAX2).
jbimpl=adaptive
Nach den allgemeinen Einstellungen können Kanäle zu anderen Geräten in Abschnitten definiert werden. Das sind entweder users, peers oder friends (friend ist die Kombination aus user und peer).
I.d.R. können hier auch die in „Globale Einstellungen“ beschriebenen Parameter verwendet und so für einzelne Kanäle abgeändert werden.
Ein Abschnitt könnte z.B. so aussehen:
[sip-provider-in] ; für Anrufe, die über unseren SIP-Provider eingehen ; Wir kennen die CallerID der eingehenden Anrufe noch nicht, daher ; wird type=peer und der Abgleich per Hostname verwendet type=peer host=sip.provider.de context=from-provider
oder so:
[sip-provider-out] type=peer ; da nur ausgehende Anrufe secret=geheim username=apfelmus ; unser User fromuser=apfelmus ; brauchen viele SIP-Provider host=sip.provider.de ; Host des Providers port=5060 ; Port auf dem Host des Providers call-limit=5 ; max. 5 gleichzeitige ausgehende Anrufe zulassen
Bitte beachten Sie auch, dass je nach type
des
Kanals (user
| peer
) nicht alle Parameter
sinnvoll sind. In der sip.conf
finden sich Beispiele
zu exotischen Parametern.
type = [user|peer|friend]
Die Art des Geräts
user
- Ein Gerät, das sich zum Anrufen mit uns verbindet (z.B. ein lokales Telefon)
peer
- Ein Gerät, mit dem wir uns verbinden, oder ein Gerät, das sich mit uns verbindet, und das wir anhand des Host-Namens zuordnen
friend
user
undpeer
in einem Abschnitt
type=peer
secret = Passwort
Unser Passwort, mit dem wir uns authentifizieren, bzw. das Passwort des anderen Geräts, um sich bei uns zu authentifizieren.
secret=geheim
username = Benutzername
Unser Benutzername / Account auf dem anderen Rechner.
username=apfelmus
host = [Hostname
|dynamic]
Hostname (oder Adresse) des anderen Rechners. dynamic
wird angegeben, wenn der Hostname des Geräts nicht bekannt ist, da er
dynamisch vergeben wird (oft zusammen mit defaultip
gebraucht).
host=siphost.provider.de
defaultip = IP-Adresse
Unter der angegebenen Adresse wird ein Host
(host=dynamic
) zu erreichen versucht, der sich noch nicht
mit uns registriert hat.
defaultip=192.168.0.33
call-limit = Anzahl
Limitiert die Anzahl der gleichzeitigen Telefonate mit diesem
Gerät. (Nicht für Realtime-Peers!) Bei type=friend
wäre
call-limit=1
ein Anruf für den peer
und einer
für den user
.
call-limit=1
callerid =Vorname
Nachname
<Nummer
>
Überschreibt die CallerID, die vom Gerät gesendet wird (und damit oft nicht vertrauenswürdig ist).
callerid=Hans Meier <1234>
nat = [yes|no]
Gibt Asterisk einen Hinweis, ob sich zwischen Server und dem Gerät ein NAT-Router befindet.
host=192.168.0.42 nat=no
mailbox =Nummer
[@Context
][,Nummer
[@Context
][,...
]]
Ordnet dem User eine Mailbox im angegebenen Voicemail-Context
(oder default
) zu. Dadurch werden die entsprechenden
MWI[83]-Nachrichten an das Gerät geschickt - z.B. für ein
Blinklicht bei neuen Nachrichten. Es können auch mehrere Mailboxen
angegeben werden.
mailbox=1234@default
subscribemwi = [yes|no]
Schickt MWI-Nachrichten (siehe „mailbox
“) nur dann, wenn das Gerät danach
fragt.
subscribemwi=yes
vmexten = Extension
Übergibt die Dialplan-Extension, unter der die Mailbox zu
erreichen ist. Default: asterisk
(so auch in einigen
Endgeräten, z.B. snom, voreingestellt).
vmexten=asterisk
Mit allow
und disallow
können bestimmte
Sprachcodecs erlaubt oder nicht erlaubt werden. Siehe „Sprach-Codecs (allow
, disallow
)“.
regexten = Extension
Erzeugt dynamisch eine Extension, wenn sich das Gerät anmeldet.
regexten=1234
qualify = [yes|no|Wartezeit
]
Schickt dem anderen Gerät regelmäßig Pings; wenn das Gerät
innerhalb der angegebenen Wartezeit (oder der Default-Zeit bei
yes
) nicht mit einem Pong antwortet, gilt es als nicht
erreichbar.
qualify=5000
callgroup = Gruppen
Setzt für das Gerät die angegebene Call-Group. Es können auch
mehrere Gruppen durch Komma getrennt oder eine Reihe von Gruppen mit
-
(Bindestrich) angegeben werden. Gruppennummern gehen von
0 bis 63.
callgroup=2,4-7 ; setzt die Gruppen 2,4,5,6,7
pickupgroup = Gruppen
Bestimmt die Pickup-Groups für das Gerät, also für welche der
durch callgroup
angegebene Gruppen Pickup (Heranholen von
Gesprächen) erlaubt ist.
pickupgroup=2,4-6 ; Pickup für die Gruppen 2,4,5,6 erlauben
Mit permit
und deny
können
IP-Adressräume, aus denen sich das Gerät bei uns registrieren kann,
erlaubt oder verboten werden (nicht zu verwechseln mit
allow
/ disallow
!). Dabei ist die Reihenfolge
wichtig.
; Verbinden nur von 192.168.0.* erlauben geht so: deny=0.0.0.0/0.0.0.0 ; alle verbieten permit=192.168.0.0/255.255.255.0 ; 192.168.0.* erlauben
setvar =Variablenname
=Wert
Setzt eine Channel-Variable für alle Anrufe von diesem Gerät.
setvar=KUNDENNR=1234
IAX[84] ist das Inter-Asterisk-eXchange-Protokoll, also das Asterisk-eigene VoIP-Protokoll, das bevorzugt verwendet werden soll.
Braucht die Welt eigentlich noch ein VoIP-Protokoll, wo es doch schon SIP, H.323 etc. und eine Reihe proprietärer Protokolle gibt? Darüber lässt sich natürlich streiten. IAX hat aber einige Vorteile, hier die wichtigsten, neben weiteren technischen Details:
- Geringer Overhead. Im Vergleich zu beispielsweise SIP (und dem darin verwendeten RTP) hat IAX als reines UDP-Protokoll ein deutlich besseres Nutzdaten:Overhead-Verhältnis.
- NAT-/Firewall-tauglich. Trotz solcher Hürden kann IAX problemlos Anrufe initiieren und entgegennehmen etc. Es muss nur ein einziger Firewall-Port freigegeben werden (bei SIP mindestens 3).
- Einfaches Protokoll. Es müssen keinerlei Strings geparst werden, was IAX kaum anfällig für Speicherüberläufe macht.
- Gesprächs-Transfers. Gespräche können sowohl über einen zentralen Server laufen als auch direkt zwischen zwei Teilnehmern.
Trunking. Dadurch kann über die gleiche Datenleitung eine viel höhere Anzahl von simultanen Gesprächen geführt werden (siehe Abschnitt 6, „Bandbreite und Trunking“).
Am Anfang der iax.conf
steht immer der
Eintrag [general]
. Ähnlich wie bei der
sip.conf
werden im [general]
-Abschnitt
allgemeine Parameter übergeben. Darunter kommt dann die Definition der
einzelnen Channels.
Als Beispiel für die Möglichkeiten des IAX-Protokolls verbinden wir zwei voneinander unabhängige Telefonanlagen mit dem IAX-Protokoll. So können Gespräche von der einen zur anderen Anlage geführt werden und müssen nicht über das Festnetz geroutet werden.
Es gibt zwei Anlagen mit jeweils zwei Telefonen (1000 und
1001). Die Anlagen heißen ast1
und ast2
. Jede
Anlage soll in der Lage sein, Gespräche an die andere Anlage mit dem
IAX-Protokoll zu übermitteln. Dazu wird eine Vorwahl benutzt. Die
Vorwahl 0901
verbindet zur Anlage ast1
und
0902
zur Anlage ast2
. Die Anlage
ast1
besitzt in diesem Beispiel die IP-Adresse
192.168.0.101
und die Anlage ast2
die
IP-Adresse 192.168.0.102
.
Die iax.conf
enthält folgende Konfiguration:
[ast2] type = friend host = 192.168.0.102 secret = 1234 context = test-telefone permit = 0.0.0.0/0.0.0.0
Die
extensions.conf
enthält folgende Konfiguration:
[via-asterisk2] exten => 09021000,1,Dial(IAX2/ast2/1000) exten => 09021001,1,Dial(IAX2/ast2/1001) ; ^ ^ ^ ^ ; | | | | ; virt.Vorwahl ext Verbindung ext
Die iax.conf
enthält folgende Konfiguration:
[ast1] type = friend host = 192.168.0.101 secret = 1234 context = test-telefone permit = 0.0.0.0/0.0.0.0
Die
extensions.conf
enthält folgende Konfiguration:
[via-asterisk1] exten => 09011000,1,Dial(IAX2/ast1/1000) exten => 09011001,1,Dial(IAX2/ast1/1001)
Die folgenden Parameter können nur im [general]
-Teil
definiert werden, sind also gültig für alle Channels. Sie können hier
außerdem auch einige der in „Channel-Einstellungen“
beschriebenen Einstellungen verwenden.
bandwidth = [low|medium|high]
Dient als Gruppierung verschiedener Soundcodecs. Auf diese
Weise kann man einfacher bestimmte Situationen definieren. Das ist eine
komfortable Alternative zu allow
und disallow
(„allow
“).
high
- Erlaubt alle Codecs: G.723.1, GSM, ulaw (G.711), alaw, G.726, ADPCM, slinear, LPC10, G.729, Speex, iLBC. Sollte nur bei Verbindungen ab 10 Mb/s verwendet werden.
medium
- Verbietet die Codecs slinear, ulaw und alaw.
low
- Verbietet zusätzlich die Codecs G.726 und ADPCM.
Beispiel:
bandwidth = low disallow = lpc10 ; hat schlechte Qualität
allow = [all|Name des Codecs]
Bestimmte Soundcodecs können gezielt erlaubt
(allow
) oder verboten (disallow
) werden.
Default ist allow=all
. Die möglichen Codecs sind:
g723.1
, gsm
, ulaw
,
alaw
, g726
, slinear
,
plc10
, adpcm
, g729
,
speex
, ilbc
, h261
,
h263
und der Platzhalter all
. Siehe auch
bandwidth
(„bandwidth
“)
für eine komfortable Einstellung. allow
und
disallow
können mehrmals verwendet werden und sind damit
eine Ausnahme.
Beispiel:
disallow = all allow = ulaw allow = gsm
codecpriority = [caller|host|disabled|reqonly]
Definiert, welcher Teilnehmer einer eingehenden Verbindung die
höhere Priorität bei der Verhandlung des Soundcodecs hat. Default:
host.
caller
- Der Anrufer hat Vorrang vor dem Host.
host
- Der Host hat Vorrang vor dem Anrufer.
disabled
- Codec-Präferenzen werden nicht berücksichtigt.
reqonly
- Codec-Präferenzen werden ignoriert und der Anruf nur dann akzeptiert, wenn der angeforderte Codec verfügbar ist.
Beispiel:
codecpriority = caller
authdebug = [yes|no]
Standardmäßig ist ein minimales Debugging bei der Autorisierung
von IAX-Verbindungen eingestellt. Dies kann mit
authdebug=no
deaktiviert werden.
Beispiel:
authdebug = no
autokill = [yes|Timeout in Millisekunden]
Falls autokill
nicht gesetzt ist, versucht
Asterisk einen nicht erreichbaren Host sehr lange zu erreichen. Dies
kann bei vielen gleichzeitigen Versuchen (auf mehreren Channels) zu
Performanceproblemen führen. Mit autokill=yes
wird die
Verbindung nach 2000 Millisekunden abgebrochen. Alternativ kann man auch
die Anzahl der Millisekunden angeben.
Beispiel:
autokill = 3500
amaflags = [default|omit|billing|documentation]
AMA ist die Abkürzung für „Automatic Message Accounting“ und spezifiziert u.a. Standardmechanismen zur Erzeugung und Übermittlung von Anrufprotokollen (Call Data Records / Call Detail Records / CDRs, auf Deutsch auch Kommunikationsdatensatz / KDS).
Mit omit
werden keine Aufzeichnungen
gemacht.
Beispiel:
amaflags = billing
bindaddr = [IP-Adresse]
Definiert die IP-Adresse, auf der Verbindungsanfragen
beantwortet werden. Default: 0.0.0.0
für alle
Adressen.
Beispiel:
bindaddr = 0.0.0.0
bindport = [Port-Nummer]
Definiert den Netzwerkport, auf dem Verbindungsanfragen beantwortet werden. Der Default-Port für IAX (IAX2!) ist 4569 (IAX Version 1: 5036).
Wichtig | |
---|---|
Diese Einstellung muss immer vor dem
|
Beispiel:
bindport = 4569
delayreject = [yes|no]
Diese Einstellung kann auf yes
gesetzt werden, um
evtl. Brute-Force-Attacken (zum Passwortknacken) abzuschwächen. Dann
wird nach jedem falschen Einlogversuch 1000 Millisekunden (also 1
Sekunde) gewartet, bis der nächste Versuch akzeptiert wird. Default:
no
Beispiel:
delayreject = yes
language = [en|de|...]
Konfiguriert die Sprache für den entsprechenden Channel. Gobale
Standardsprache ist Englisch. Die Sprache, die gesetzt ist, wird vom
Kanal als Informationselement gesendet. Diese Einstellung wird auch von
Anwendungen wie SayNumber()
gelesen, die für verschiedene
Sprachen unterschiedliche Sprachbausteine verwenden.
Beispiel:
language = de
mailboxdetail = [yes|no]
Wenn mailboxdetail
auf yes
gesetzt
ist, wird dem Apparat des Mailboxbenutzers die Anzahl der neuen (und die
der alten) Nachrichten übermittelt (zur Anzeige auf dem Display o.ä.).
Ansonsten wird nur signalisiert, dass es neue Nachrichten gibt, ohne die
Anzahl zu nennen.
Diese Einstellung ist bei neueren Asterisk-Versionen nicht mehr
verfügbar. Mittlerweile verhält sich Asterisk immer (standardkonform)
wie mailboxdetail=yes.
Beispiel:
mailboxdetail = yes
tos = [...]
ToS steht für „Type of Service“; das sind Flags im
IP-Header, die von manchen Routern ausgelesen und befolgt werden. Damit
kann das Routingverhalten optimiert werden. Die Empfehlung dieser
Einstellung für IAX ist tos=ef
. EF steht für Expedited
Forwarding, also etwa Express-Übertragung, was nach geringer Latenz,
geringer Verlustrate und wenig Jitter verlangt. Default ist
none
(wegen Rückwärtskompatibilität).
Die Vielzahl der möglichen Werte soll hier nicht weiter
beschrieben werden, Interessierte seien auf die Spezifizierung von
Differentiated Services in RFC 2474 und die IANA-DSCP[85] verwiesen. Hier nur ein ins Deutsche übersetzter Auszug
aus der Asterisk beiliegenden Datei doc/README.tos
(1.2) / doc/ip-tos.txt
(1.4):
Die zulässigen Werte für die tos*-Einstellungen sind:
Außerdem kann man auch deren numerische Pendants angeben
(z.B. Die Werte =========================================== Konfig.- Parameter Empfohlene Datei Einstellung ------------------------------------------- sip.conf tos_sip cs3 sip.conf tos_audio ef sip.conf tos_video af41 ------------------------------------------- iax.conf tos ef ------------------------------------------- iaxprov.conf tos ef =========================================== Für den größtmöglichen Nutzen müssen Sie sicherstellen, dass Ihre Netzwerk-Hardware ToS unterstützt (ggf. aktivieren). Für Cisco-Geräte siehe „Enterprise QoS Solution Reference Network Design Guide“[86] , für Linux-Systeme siehe „Linux Advanced Routing & Traffic Control HowTo“[87]. | ||
--doc/ip-tos.txt |
Beispiel:
tos = ef
adsi = [yes|no]
ADSI (Analog Display Services Interface)[88] sind verschiedene Datendienste für analoge Telefone mit einem Display, z.B. blinkende LED/Anzeige im Display bei wartenden Nachrichten etc.
Falls Sie kompatible Telefone haben, können Sie diesen Dienst aktivieren.
Beispiel:
adsi = yes
register => username[:password]@remote-host
Ist unser Asterisk-Server nur über eine dynamische IP-Adresse
erreichbar (also kein DNS, sondern nur eine IP-Adresse), so muss er sich
bei jedem IP-Adresswechsel bei seiner Gegenstelle neu registrieren,
sonst weiß die Gegenstelle nicht, an welche IP-Adresse sie Gespräche
durchstellen soll. Dazu wird register =>
verwendet.
Beachten Sie, dass register
-Angaben nur benutzt
werden, wenn das entfernte Ende Sie als Peer und
host=dynamic
eingestellt hat.
Das grundlegende Format einer Registerangabe sieht wie folgt aus:
register =>
username[:password]@remote-host
Alternativ können Sie durch die Einbettung des Namens eines
geeigneten RSA-Schlüssels[89] in eckige Klammern ([]
) einen RSA-Schlüssel
spezifizieren:[90]
register =>
username:[rsa-key-name]@remote-host
Standardmäßig werden Registeranfragen über Port 4569 gesendet.
Sie können aber durch Anhängen von
:
(also z.B.
Portnummer
:4444
) an den Hostnamen explizit einen anderen
angeben.
Die folgenden Parameter können für die einzelnen Channel
definiert werden. Einige können aber auch im Abschnitt
[general]
verwendet werden.
type = [user|peer|friend]
Legt fest, ob es sich um eine Verbindung zu einem
user
(z.B. Benutzer-Endgerät, verbindet sich mit uns) oder
peer
(z.B. Gateway in ein anderes Asterisk-Netzwerk, zu dem
wir die Verbindung herstellen) handelt. friend
ist eine
Kurzschreibweise, um einen user
und einen peer
mit den gleichen Angaben zu definieren.
Beispiel:
type = peer
Warnung | |
---|---|
Wenn Sie nicht für alle User-Einträge
( Beispiel: [guest] type=user callerid="IAX-Gast-Benutzer" |
accountcode = [Abrechnungsnummer]
Der angegebene String wird als Dateiname für die
Abrechnungsdateien im Verzeichnis
/var/log/asterisk/cdr-csv/
benutzt. Verwenden Sie
daher nur Kleinbuchstaben, Ziffern, Bindestrich, Unterstrich.
Beispiel:
accountcode = iax-hausmeister
bandwidth = [low|medium|high]
bandwidth
dient als Gruppierung verschiedener
Soundcodecs. Auf diese Weise kann man einfacher bestimmte Situationen
definieren (siehe „bandwidth
“).
Beispiel:
bandwidth = low
allow = [all|Name des Codecs]
Bestimmte Soundcodecs können gezielt erlaubt
(allow
) oder verboten (disallow
) werden (siehe
„allow
“). Dabei ist zu beachten, das
evtl. im [general]
-Bereich erlaubte Codecs erst durch ein
disallow=all
wieder verboten werden müssen.
Diese Parameter sind nicht zu verwechseln mit
permit
und deny
(siehe „permit
“).
Beispiel:
disallow = all allow = ulaw allow = gsm
codecpriority = [caller|host|disabled|reqonly]
Definiert, welcher Teilnehmer der Verbindung die höhere
Priorität bei der Verhandlung des Soundcodecs hat (siehe „codecpriority
“).
Beispiel:
codecpriority = caller
amaflags = [default|omit|billing|documentation]
AMA ist die Abkürzung für „Automatic Message
Accounting“ und spezifiziert u.a. Standardmechanismen zur
Erzeugung und Übermittlung von Anrufprotokollen (CDRs) (siehe „amaflags
“).
Beispiel:
amaflags = documentation
callerid = [Name[ <Nummer>]]
Mit callerid
können Sie die angezeigte Caller-ID
für einen Nutzer oder ein Peer setzen. Wenn Sie ein Caller-ID-Feld für
einen Benutzer definieren, werden alle Anrufe, die auf diesem Kanal
eingehen, mit dieser Caller-ID verknüpft, unabhängig davon, was Ihnen
das andere Ende sendet. Das ist aus Sicherheitsgründen zu empfehlen
(außer, Sie vertrauen dem anderen Ende), da es sehr leicht möglich ist,
seine Caller-ID zu fälschen.
Beispiel:
callerid = "Mark Spencer" <(256) 428
6000>
host=[Host|dynamic]
Als host
wird entweder der Hostname oder die
IP-Adresse des anderen Rechners angegeben. Bei Hosts mit dynamisch
vergebenen (also wechselnden) IP-Adressen verwenden Sie den Sonderfall
host=dynamic
, vorzugsweise in Kombination mit der
Einstellung defaultip
(„defaultip
“).
Beispiele:
host = 192.168.0.201
host = dynamic
defaultip = [IP-Adresse]
Die defaultip
-Einstellung ergänzt
host=dynamic
(siehe „host
“). Ist ein Host noch nicht bei Ihrem
Server angemeldet, versucht Asterisk, Nachrichten an die hier definierte
Standard-IP-Adresse zu schicken.
Beispiel:
defaultip = 192.168.0.201
permit = IP-Adresse[/Netzmaske]
permit
und deny
erlauben und
beschränken die IP-Adressen, von denen Verbindungen zum entsprechenden
Eintrag möglich sind. Üblicherweise wird zuerst ein
deny=0.0.0.0/0.0.0.0
(alle verbieten) vorangestellt und
dann mit permit
die erlaubte IP-Adresse oder ein Bereich
von Adressen freigegeben. Die Reihenfolge von deny
und
permit
ist entscheidend, und beide können für mehrere
Hosts/Bereiche auch mehrfach auftreten. Wenn genau ein Host gemeint ist,
können Sie die Netzmaske (wäre 255.255.255.255
)
weglassen.
Dieses Beispiel erlaubt nur Verbindungen aus dem Bereich
192.168.0.*
(Netzmaske 24 Bits, Klasse
C-Netzwerk):
deny = 0.0.0.0/0.0.0.0 ; alle verbieten permit = 192.168.0.102/255.255.255.0 ; 192.168.0.* erlauben permit = 192.168.5.5 ; 192.168.5.5 erlauben
Alle erlauben bis auf 192.168.*.*
:
permit = 0.0.0.0/0.0.0.0 ; alle erlauben deny = 192.168.0.0/255.255.0.0 ; 192.168.*.* verbieten
Das nächste Beispiel ist nicht sinnvoll, da zuerst
192.168.0.0
- 192.168.0.127
verboten, dann
aber wieder alle erlaubt werden, was die erste
Regel überschreibt. So wird also nichts verboten:
deny = 192.168.0.0/255.255.255.127 permit = 0.0.0.0/0.0.0.0 ; alle erlauben
auth = [plaintext|md5|rsa]
Zum Identifizieren des anderen Peers/Users stehen 3 Methoden
zur Auswahl: plaintext
, md5
und
rsa
.
plaintext
- Sehr unsicher, da das Passwort im Klartext übertragen
wird. Sollte daher nicht verwendet werden. Das Passwort wird mit
secret
(„secret
“) angegeben. md5
- In diesem Challenge/Response-Verfahren wird eine
MD5-Prüfsumme übertragen. Das Passwort wird mit
secret
(„secret
“) angegeben. rsa
- Das sicherste Verfahren durch öffentliche und private
Schlüssel. Diese Schlüssel werden bei
inkeys
(„inkeys
“) undoutkeys
(„outkey
“) angegeben.
Mit auth
legen Sie eine durch Komma getrennte
Liste von erlaubten Authentifizierungsmethoden fest.
Beispiel:
auth = rsa,md5
Wenn Sie weder auth
noch secret
angeben, bedeutet das, dass keine Authentifizierung notwendig
ist.
secret = [Passwort]
Legt das Passwort für die Authentifizierungsmethoden
plaintext
oder md5
fest (siehe „auth
“).
Beispiel:
secret = meinpasswort
inkeys = [rsa-key:rsa-key:...]
Legt für die Authentifizierungsmethode rsa
(siehe
„auth
“) den öffentlichen RSA-Schlüssel
des zu authentifizierenden Systems fest. Um mehr als einen RSA-Schlüssel
mit einer Benutzer-Kanaldefinition zu verknüpfen, trennen Sie die
Schlüsselnamen mit einem Doppelpunkt (:
). Jeder dieser
Schlüssel wird dann eine Verbindung für gültig erklären
können.
Diese Schlüssel müssen als Dateien so benannt sein:
/var/lib/asterisk/keys/
schluesselname
.pub
Beispiel:
inkeys = server-koblenz:server-bonn
outkey = [rsa-key]
Sie können die outkey
-Option verwenden, um sich
bei einem Peer mit Hilfe eines RSA-Schlüssels zu authentifizieren. Für
ausgehende Authentifizierung kann nur ein RSA-Schlüssel verwendet
werden. Der outkey
wird nicht verteilt, er ist Ihr privater
Schlüssel und sollte 3DES-verschlüsselt sein.
Diese Schlüssel müssen als Dateien so benannt sein:
/var/lib/asterisk/keys/
schluesselname
.key
Beispiel:
outkey = privater-schluessel
mailbox = [Mailboxname[@Mailbox-Context]]
Wenn Sie in einer Kanaldefinition einen Peer mit einer Mailbox
verknüpfen, wird Voicemail eine MWI (Message Waiting
Indication)-Nachricht an die Knoten am Ende dieses Kanals schicken.
Befindet sich die Mailboxnummer in einem anderen Voicemail-Context als
default
, können Sie sie als
angeben. Um
mehrere Mailboxen mit einem einzigen Peer zu verknüpfen, müssen Sie den
mailbox@context
mailbox
-Befehl mehrmals verwenden.
Beispiel:
mailbox = 1000
language = [en|de|...]
Konfiguriert die Sprache für den entsprechenden Channel. Die
Standardsprache ist Englisch. Diese Einstellung wird von verschiedenen
Anwendungen wie z.B. der Voicemailbox oder auch der Applikation
SayNumber()
verwendet, um unterschiedliche Sprachbausteine
zu benutzen.
Beispiel:
language = de
context = [Context]
Der Context dem Benutzer dieser Verbindung zugeordnet werden.
Beispiel:
context = default
regcontext = [Context]
Sie können einen Context definieren, der automatisch beim
ersten Registrieren eines Peers ausgeführt wird. Ist mit
regexten
keine Extension angegeben, so wird als
auszuführende Extension der Name des Peers benutzt. Dabei ist zu
beachten, dass Asterisk als Erstes automatisch ein NoOp
mit
der Priorität 1 ausführt. Als erste Priorität danach ist also die 2 zu
benutzen. Mehrere Contexte können nacheinander aufgeführt werden; als
Trennungszeichen wird ein &
verwendet.
Beispiel:
regcontext = from-iax
regexten = [Nummer]
Wird in Verbindung mit regcontext
verwendet, um
die Extension zu spezifizieren, die in dem konfigurierten Context
ausgeführt werden soll. Falls regexten
nicht explizit
konfiguriert ist, wird der Name des Peers als Extension
verwendet.
Beispiel:
regexten = 3000
jitterbuffer = [yes|no]
Schaltet den Jitter-Buffer an oder aus (dies gilt bei Verbindungen, bei denen Asterisk als Endgerät fungiert). Der Jitter-Buffer gleicht unterschiedliche Laufzeiten der IP-Pakete aus.
Der Jitter-Buffer hat evtl. Probleme bei eingeschaltetem
trunk
(siehe „trunk
“).
Beispiel:
jitterbuffer = yes
forcejitterbuffer = [yes|no]
Normalerweise ist es Aufgabe der Endgeräte einen Jitter-Buffer [91] zu realisieren. Sollte dies aus irgendeinem Grund nicht oder nur schlecht funktionieren (manche Geräte haben einen schlechten Jitter-Buffer), kann man diesen Buffer auch auf Asterisk als VoIP-Brücke aktivieren.
Beispiel:
forcejitterbuffer = yes
maxjitterbuffer = [Laenge in Millisekunden]
Mit diesem Parameter wird die maximale Größe des Jitter-Buffers eingestellt. Sie sollten diesen Wert i.d.R. nicht höher als 500 einstellen, sonst kann es zu Tonaussetzern kommen.
Beispiel:
maxjitterbuffer = 400
resyncthreshold=[Wert in Millisekunden]
Der Resynchronisierungs-Grenzwert wird benutzt, um den
Jitter-Buffer, im Falle der Erkennung einer signifikanten Änderung über
wenige Frames, neu zu takten/neu abzustimmen unter der Annahme, dass der
Veränderung eine Verwechslung von Zeitstempeln zugrunde liegt. Der
Resynchronisierungs-Grenzwert ist definiert als die gemessene Schwankung
plus dem Wert von resyncthreshold
, der in Millisekunden
angegeben wird.
Beispiel:
resyncthreshold = 800
trunk = [yes|no]
Asterisk kann bei IAX-Verbindungen zu einer bestimmten IP-Adresse (z.B. beim Verbinden von zwei Asterisk-Servern) alle Channels über einen Trunk versehen. Dadurch wird der Overhead von mehreren Verbindungen zu einer Adresse reduziert. Der Trunk-Modus funktioniert nur mit geeigneter Hardware (Digium Zaptel) oder entsprechender Emulationssoftware für timing-Zwecke.[92].
Bei der Version 1.2.x arbeitet der Jitter-Buffer (siehe „jitterbuffer
“) nicht gut bei eingeschaltetem
Trunk-Modus.
Beispiel:
trunk = yes
trunkfreq = [Wiederholrate in Millisekunden]
Mit trunkfreq
wird in Millisekunden angegeben, wie
oft Trunk-Nachrichten gesendet werden. Gilt nur, wenn
trunk=yes
gesetzt wurde.
Beispiel:
trunkfreq = 20
qualify = [yes|no|Zeit in Millisekunden]
Mit qualify=yes
werden in festen Zeitabständen
Ping-Nachrichten an die entfernten Peers gesendet, um herauszufinden, ob
sie verfügbar sind und welche Latenz zwischen den Antworten liegt. Die
Peers antworten mit Pong-Nachrichten. Ein Peer wird als nicht erreichbar
angesehen, wenn innerhalb von 2000 ms noch keine Antwort vorliegt (um
diese Voreinstellung zu ändern, setzen Sie qualify
auf die
entsprechende Anzahl an Millisekunden, die auf eine Anwort gewartet
werden soll). Einige Endgeräte (/Software) kommen nicht mit diesen
Nachrichten zurecht.
Beispiel:
qualify = yes
[76] Siehe http://de.wikipedia.org/wiki/Transmission_Control_Protocol und http://de.wikipedia.org/wiki/User_Datagram_Protocol
[77] Das fragen sich viele! ;-)
[78] IP-Adressen aus dem privaten Bereich beginnen beispielsweise mit 10. oder mit 192.168., also zum Beispiel 10.128.1.16 oder 192.168.1.3.
[79] Es gibt mittlerweile viele unterschiedliche Formen von NAT-Gateways, mit zum Teil sehr spezieller Funktionsweise. Hier wird lediglich das grundlegende Funktionsprinzip eines NAT-Gateways und die damit verbundenen Auswirkungen beschrieben.
[80] In seltenen Fällen nutzen Firmen trotz der Verwendung von offiziellen IP-Adressen auch für interne Rechner ein NAT-Gateway. Oft, weil sie zum Beispiel die Größe des Netzes nach außen maskieren möchten und sich generell gewisse Sicherheitsvorteile davon erhoffen.
[82] Network Address Translation, wird häufig von Routern verwendet, die zwischen einem privaten Netz und dem öffentlichen Internet vermitteln
[83] Message Waiting Indicator
[84] Hier ist immer IAX2, also IAX Version 2 gemeint.
[86] http://www.cisco.com/application/pdf/en/us/guest/netsol/ns432/c649/ccmigration_09186a008049b062.pdf
[88] Wird per FSK (Frequency Shift Keying, dt.: Frequenzumtastung) übertragen.
[89] Asterisk-RSA-Schlüssel finden sich normalerweise in
/var/lib/asterisk/keys/
. Sie können mittels des
astkey-Skripts eigene Schlüssel
generieren.
[90] Die eckigen Klammern sind hier Pflicht und nicht wie im Rest des Buches als Optionsangabe zu lesen.
[91] Jitter bezieht sich auf die variierende Latenz zwischen den Datenpaketen. Bei zu großen Schwankungen kann es zu Tonausfällen kommen.
[92] Zum Beispiel das bei Asterisk enthaltene Kernel-Modul
ztdummy
oder zaprtc
von Junghanns (http://www.junghanns.net/downloads/).
Version 1.2, November 2002
Neue Version verfügbar
Sie betrachten gerade die alte Version des Buches (Version 1.0). Wir empfehlen Ihnen für Asterisk 1.4 und 1.6 die neue Version des Buches.
Asterisk-Tag 2008
Lernen Sie Mark Spencer (den Erfinder von Asterisk) kennen! Viele Vorträge, Case-Studies und Workshops rund um das Thema VoIP. Asterisk-Tag.org