# Java Netzwerkprogrammierung



## Kerpal (24. Oktober 2010)

Ich grüße alle die diesen Beitrag lesen.

Zu meiner Frage : 

Muss man beim senden von einem Paket die MTU unter Java beachten ? 
Oder regelt Java es schon im Hintergrund.

Es geht hier um ein Netzwerk Analyse Tool das momentan in den Kinderschuhen steckt.
Das Programm hat die Aufgabe die Pakete an einen selbst geschriebenen Server zu senden, im Internet.

Dabei soll ermittelt werden, wielang das Paket gebraucht hat um zum Server zu gelangen (Kbyte/sekunde).
Und es soll eine Art Mittelwert gebildet werden, der eine optimala Übertragung liefern würde.
Das ganze wird über TCP mittels Sockets realisiert.

Zugriff auf das Netzwerkinterface liefert Java per Enumeration. Dies ist jedoch nur lokal auf die eigenen Einstellungen der Netzwerkkarte bezogen.
Kurz das Programm sollte die beste Bandbreite zwichen Client und Server über das Internet ermitteln.

Die zweite Frage die sich mir stellt lautet : 

Muss ich dabei eine gewisse Verzögerung / deelay einbeziehen da ja Router und andere Server im Internet das Paket weiterleiten. Und diese eine andere MTU haben könnten.


----------



## SPiKEe (24. Oktober 2010)

JAVA und MTU ... ich glaub den gedanken solltest du ganz schnell wieder vergessen ...

da java selbst nur TCP und UDP - Sockets bereitstellt ist es dir ohne weiteres sowieso nicht möglich ICMP-packet / -sockets zu bilden *ja .. mit JNI und sow ...*
java delegiert es dann nach einem native-aufruf an seine eigenen DLL's einfach an das host-system ... das muss sich um alles kümmern ... java erhält dann nur irgendwann die info : socket erfolgreich erstellt oder eben nich ...

was die bandbreiten-messung angeht ...

sowas is nich so einfach da viele faktoren zu berücksichtigen sind ...
z.B. netz-auslastung
pc- und server-auslastung
entfernung zwischen beiden ...
ping-zeiten ... TTL und hop-counts ...
das sind alles dinge die du mit java nur schwer rausbekommen kannst ...
sicher ist es möglich aber es wäre ein ziemlich großer aufwand und nur alleine mit java sicher nicht lösbar *alleine die ICMP-implementation musst du selbst über JNI realisieren*

dazu kommt auch noch das du nicht immer die maximale bandbreite erreichen kannst *OVERHEAD , auslastung .. etc*
auch muss sichergestellt werden das der host am anderen ende die nötige power hat und muss *theoretisch zumindest* über mehr zugesicherte bandbreite verfügen als der zu testende anschluss ...
was bei den heutigen geschwindigkeiten nur noch schwer mit EINEM server machbar ist
*kla sagen dir die anbieter : anschluss 100MBit/s / 1GBit/s ... aber das ist dann nur der nächste hub/switch/router/backbone-hop ... die geschwindigkeit befindet sich bei solchen einzel-servern meist in den unteren 50% dessen was der anbieter angibt ...
wenn du wirklich solche großen bandbreiten erreichen willst bräuchtest du schon einen cluster der seine zugesicherte bandbreite hat*

ich denke das du ohne weiteres fachwissen und die erprobungsmöglichkeiten hier nicht weit kommen wirst

grade was so große firmen-netze angeht ...
meistens sind diese mit einer 8GBit/s oder sogar 10,3GBit/s backbone angeschlossen ...
wenn du jetzt nur 1 oder 2 server im verbund hast die du als zeil nimmst haben diese zusammen vllt 30MBit/s bis max 80MBit/s bandbreite ... und das auch nur wenn du gutes timing hast und n zeitpunkt erwischst wo die server fast ihre max bandbreite haben ...
dazu kommt die netz-interne geschwindigkeit ...
kann sein das du fast dierekt durchkommst ... dann schaffst du meistens nur die üblichen 70MBit/s die ein normaler rechner mit 100MBit/s netzwerkkarte schafft ...


um das thema hier also mal abzuschließen : um ein solches tool zu entwickeln brauchst du vorallem fachwissen ... ein paar gute leute die mit dem wissen umgehen können und ausreichende test-möglichkeiten ...
als kleines projekt im hinterkämmerchen wirst du ... falls das ganze laufen sollte ... mit sicherheit nur verfälschte ergebnisse bekommen ...
für den produktiven einsatz braucht es schon etwas mehr als nur ein paar zeilen java-code


----------



## Kerpal (24. Oktober 2010)

Mir ist bewusst das Java Probleme in dem Gebiet Paketanalyse bereit stellt.
Und ich habe mich mit mehreren Dingen in dem Bereich schon belesen.

zb. Path-MTU ect.

Jedoch möchte ich mit dem Programm mein anderes Projekt unterstützen.
In dem ich Video und Audio übermittel und damit eine Konferenz per Internet, wie im Beispiel Skype, ermögliche.

Aus diesem Grund muss ich eine die Bandbreite ermitteln.
In C++ wer das kein so großes Problem, da mir dort der Inhalt von diversen Pakten zur Verfügung steht.

Kannst du mir einige Bücher oder Links empfehlen, wo man sich mit der Materie weiter auseinandersetzen kann.


----------



## SPiKEe (25. Oktober 2010)

ahh ... streaming und buffering ...
oder wie ?

ich gehe davon aus das du den benötigten codec für die verfügbare bandbreite ermitteln willst oder sowas
natürlich ist dann sowas durchaus von nöten ...
aber ich denke das es da grade im bereich von streaming-playern genug source-files im netz geben wird
vieles wird dir dabei im flash sektor begegnen auf grund der tatsache das viele streaming-player in flash gebaut sind *siehe alleine youtube und konsorten*
sowas wird sich sicherlich schon mal jeamand in java zusammen gebastelt haben ...
natürlich wirst du da auch sehr viel im C/C++/C# sektor finden ...
gutes beispiel hierfür wäre VLC da dieser OpenSource ist ...
da wirst du sicher routinen finden die dies machen *da ja VLC auch streaming-inhalte verarbeiten kann ... *soweit ich weis sogar in soweit das VLC mit dem server nach einer kurzen test-phase mit dem server über den passenden codec verhandelt sofern der server dies unterstütz**

also : einfach mal googlen und andere source-files von solchen projekten durchstöbern

persönlich anmerkung : wenn du sagst das es in C++ kein problem wäre ... warum implementierst du dann kein pseudo-code in C++ und portierst diesen nach java ? ... sollte doch kein problem darstellen

was allerdings die MTU angeht ...
da solltest du noch mal auf wiki nachlesen was genau das eigentlich ist
http://de.wikipedia.org/wiki/Maximum_Transmission_Unit
ich denke kaum das die MTU etwas mit der bandbreite zu tun hat ...
von daher nochmal die frage : WAS WILLST DU MIT DER MTU ? ... die ist für soetwas komplett ohne bedeutung da du mindestens auf Layer 4 arbeitest ... alleine weil java dir keine möglichkeit gibt weiter runterzugehen *zumindest nicht ohne JNI* da TCP / UDP erst auf Layer 4 verfügbar sind ...
alles was darunter liegt kannst du mit java ohne JNI nicht machen ... und dann könntest du es gleich in C *oder eben seinen varianten* oder vergleichbaren sprachen programmieren ...
dafür solltest du java nicht als weitere instanz noch zusätzlich dazwischen quetschen ... alleine vom OVERHEAD mal abgesehen ...


----------



## Thomas Darimont (25. Oktober 2010)

Hallo,

schau dir mal jcap:
http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/download.html
bzw. Wireshark an:
http://gpbsblogon.blogspot.com/2010/02/wireshark-and-java-api-for-packet.html

Gruß Tom


----------



## Kerpal (26. Oktober 2010)

Danke für die Tips und JNI btw. c++ ist mir nicht unbekannt.
Habe mich jetzt ein wenig gebildet und baue grade in c++ ein paar DLL Dateien und binde sie in mein Java Programm ein.

Macht weiter so was das helfen betrifft. 

mfg: Kerpal


----------

