hallo Leute,
auch wenn dieses Thread schon etwas älter ist möchte ich diese frage einmal abschließend klären. Es sie hier angemerkt das obwohl ich ausgebildeter Fachinformatiker bin und sehr tief in der Materie drinstecke ich mich auch irren kann. Es wäre eine komplette Studie des Netzwerkstacks des verwendeten Betriebssystems nötig um meine Aussage mit 100%tiger Sicherheit zu bestätigen. Dies ist allerdings nur möglich (oder in einem Menschenleben schaffbar) wenn einen der Quellcode des jeweiligen Betriebssystems vorliegen würde... Aber nun genug vom Präambel;
der Kollege fffcmad meinte schon am Anfang das dies nicht möglich sei allerdings hat er diese Meinung in kleinster weise begründet. Ich muss auch sagen das es generell möglich wäre allerdings mir kein Betriebssystem bekannt ist welches solch einen "multi connection tcp/ip stack" bietet.
da weder eimic noch JaFre angegeben haben welches Betriebssystem sie verwenden gehe ich einmal davon aus das es hier um MSWindows geht. Allerdings ist der Fall hier bei den 3 größten Betriebssystemen[1] das selbe[2].
Um auf das Problem und den Grund der nicht Lösbarkeit des selben zurückzukommen muss als erstes geklärt werden wie ein Netzwerkstack (auch TCP/IP Stack genannt) grundlegend funktioniert. Ein Netzwerkstack ist in allen Netzwerkfähigen Betriebssystemen verbaut. Er stellt eine Schnittstelle da welche es der auf dem Betriebssystem laufenden Software (unter anderem[3]) ermöglicht TCP Sockets zu öffnen und zu verwenden oder im Fall von UDP Datagramme zu versenden und zu empfangen. Um die Übertragung der Daten kümmert sich dann das Betriebssystem[5]. Die Entscheidung über welche Netzwerkhardware die hieraus entstehenden Frames versandt werden sollen geschieht also viel später. Aus diesem grund ist es nicht möglich für das Userlandprogramm zu entscheiden über welche Netzwerkkarte die Kommunikation ablaufen soll. Durch die Routingfähigkeit welche in jeden Netzwerkbetriebssystem eingebaut ist besteht die Möglichkeit an unterschiedlichen Netzwerinterfaces unterschiedliche logische Subnetze zuzuordnen und somit hierüber die Versandroute festzulegen. Hierzu ein Beispiel:
Rechner 001
+---------------+
| |
| Interface 01 |
| IP: |
| 192.168.3.11 |
| Netzmaske: |
| 192.168.3.0/24|
| |
| |
| + |
+-|-------------+
|
| EthernetSwitch 01
| +-----------------+
| | +-+ +-+ +-+ +-+ |
+------++ +++ +++ +-+ |
+------|---|------+
| +------------+
+----------+ |
| |
Rechner 002 | |
+------------------+ | +---|------+
| | | | + |R
| | | | IF01 |e
| | | | |c
| IF01 IF02 | | | |h
| + +-------+ | |n
| | | | HTTP- |e
+--|---------------+ | Server |r
| | |
| EthernetSwitch 02 | |0
| +-----------------+ | |0
| | +-+ +-+ +-+ +-+ | | IF02 |4
+-----++ +++ +++ +-+ | | + |
+------|---|------+ +---|------+
| +------------+
+---------+
|
Rechner 003 |
+-----------------+ |
| | |
| | |
| +---+
+-----------------+
Konfiguration Rechner 001
Interface 01:
IP: 192.168.3.11
Netzmaske: 192.168.3.0/24
Konfiguration Rechner 002
Interface 01:
IP: 192.168.3.12
Netzmaske: 192.168.3.0/24
Interface 02:
IP: 192.168.4.12
Netzmaske: 192.168.4.0/24
Konfiguration Rechner 003
Interface 01:
IP: 192.168.4.13
Netzmaske: 192.168.4.0/24
Konfiguration Rechner 004
Interface 01:
IP: 192.168.3.10
Netzmaske: 192.168.3.0/24
Interface 02:
IP: 192.168.4.10
Netzmaske: 192.168.4.0/24
Wenn wir nun am Rechner 002 sitzen würden und auf Rechner 004 ein HTTPServer laufen würde könnten wir uns entscheiden welche der beiden verfügbaren Routen wir zu unseren Ziel nehmen würden. Wenn wir in den Browser die IP 192.168.3.10 eingeben würden würden wir den Rechner über switch 01 kontaktieren, würden wir allerdings die IP 192.168.4.10 eingeben würden wir den Rechner über Switch 02 kontaktieren. Unabhängig davon welche der beiden Adressen wir eingeben würden würden wir die selbe Seite im Browser des Rechners 002 sehen[6]. Somit haben wir vom Userland aus die Möglichkeit auf die Entscheidung im Netzwehrstack einzugehen. Wenn wir jetzt in beiden verfügbaren Subnetzen eine Standard Route (Default Gateway) eintragen würden welche uns zum Internet führen würde und jetzt eine Globale IP Adresse in unseren Browser eingeben würden hätten wir keine Wahl mehr. Nehmen wir an das dies der Fall ist und tippen wir in unseren Browser die IP-Adresse 37.187.46.197 meines Servers ein. Wir landen nun nach einer 302 Weiterleitung auf meiner Startseite. Die Entscheidung welche der beiden verfügbaren Routen verwendet wird fällt unser Betriebssystem Quasi willkürlich[7]. Es ist somit nicht möglich für 2 ziele eine andere route zu verwenden wenn sich diese beiden ziele im Internet befinden. Eine Möglichkeit das Interface anzugeben wenn der Kernel um einen Socket bittet ist nur in der listening mode[8] vorgesehen also in unseren Fall nicht mit drin.
Und die Moral von der Geschichte: es geht nicht.
Es gäbe allerdings noch eine Möglichkeit nämlich die Virtualisierung. Somit können wir auf unseren Rechner 002 eine Virtuelle Maschinerie (VM) aufsetzen welche über die Briding funktion des Hypervisors mit einer der Netzwerkkarten verbunden ist. Somit würde uns der Hypervisor einen virtuellen Switch zu verfügung stellen und wir hätten auf unseren Computer nun ein zweites Betriebssystem mit eigenen Netzwerkstack am laufen. Wenn wir nun die Standartgateway in unserem HostBetriebssystem für das Interface 02 austragen würden (oder das IF02 komplett deaktivieren würden) und uns nun mit der vm an das IF02 heranbridgen würden könnten wir auf der VM einen browser installieren und somit bewust entscheiden welche der beiden Routen wir verwenden wollen. Also schaut mal auf virtualbox.org damit ist das ganz einfach zu realisieren.
Die andere Möglichkeit währe ein Neues Betreibssystem zu designen (dann ohne POSIX Kompatibilität) welches eine solche wahlmöglichkeit bietet.
So das wars von meiner Erklärung, bei weiteren Fragen kontaktiert mich gerne schaut dazu einfach mal auf meine Website (
http://treaki.tk/ oder die oben erwähnte IP-Adresse) unter Kontakt.
Gruß treaki
Fußnoten:
1. MSWindows, AppleMacOSX und auf einer GNU/Linux Zusammenstellung basierende Systeme
2. wahrscheinlich ist das einzige System was es möglicherweise könnte Free/NetBSD da die ja noch ein besseren Netzwerkstack als GNU/Linux basierte Systeme haben. Allerdings kenne ich mich mit der BSD Familie nicht aus nicht aus
3. Der Netzwerkstack umfasst noch einige weitere mögliche schnittstellen, beispielsweise das senden und empfangen von ICMP Paketen z.B. beim pingen Stichwort: ICMP ECHO REQUEST. Allerdings sind TCP und UDP sozusagen die wichtigsten Hauptkomponenten eines Netzwerkfähigen Betriebssystem. Die anderen Schnittstellen werden als unpreviligierter Standerdnutzer eher nicht verwendet und sind auch größtenteils nur den Systemadministratur zugänglich[4].
4. Unter GNU/Linux basierten Systemen muss man solche Befehle z.B. mit dem Kommando sudo als root Benutzer ausführen.
5. Unter GNU/Linux kümmert sich der monolitische Kernel um die Übertragung. Unter anderen Unix artigen Systemen welche einen Microkernel verwenden funktioniert das eventuell anders und in welcher Schicht des Windows NT Kernel diese Vorgänge ablaufen fragt ihr ambesten jemand der sich mit dem design von NT auskennt (nicht mich). Basiert WinNT auf einem monolitischen Kernel, einen Hybrid-Kernel oder gar auf einen Micro-kernel?? ich Weiß es nicht...
6. Außer wir haben eine Ausnahme welche sich in einer weiteren Entscheidung in einer anderen Ebene abspielen kann. In unseren Beispiel wäre es möglich das der Webserver mit Virtual Hosts konfiguriert ist und dem Client je nachdem über welche Adresse er aufgerufen wird eine andere Seite liefert. Andere Möglichkeit: 2 http Server laufen auf dem Rechner 004 und lauschen explizit nur auf jeweils eine Netzwerkkarte.
7. Der Vorgang läuft in etwa so ab:
1. Das Betriebssystem bekommt das Kommando eine Verbindung zur IP Adresse 37.187.46.197 aufzubauen.
2. Der Kernel schaut im Routingche nach ob schon eine funktionierende Route zum ziel bekannt ist
3. Es ist keine Route im Cache gespeichert und da wir 2 Routen haben und keine davon priorisiert ist wird das Betriebssystem versuchen eine Verbindung über beide verfügbaren passenden Routen aufzubauen dies geschieht entweder Parallele oder nacheinander.
4. Beim ersten Versuch (egal welche der beiden Gateways ausgewählt wurde) ist der Rechner erfolgreich und trägt die Route in den Cache ein.
5. In Zukunft werden die Schritte 3 und 4 übersprungen bis über einen längeren Zeitraum keine Kommunikation zu diesen ziel stattgefunden hat und somit
8. Diese mode wird verwendet wenn wir einen server betreiben ist allerdings bei uns nur auf Rechner 004 der Fall.