View Full Version : [java] simulazione di pacchetti ICMP - tracerouting , come ricondursi a java
Devo preparare un mini progettino non sto chiedendo la pappa pronta :D ...che senso avrebbe.
Mi sono scontrato con un problema...sembrerebbe che java non supporti nativamente la possibilità di programmare in rete così a basso livello. Confermate?
Ho visto che alcuni risolvono con JMA (che dovrei studiarmi), ma temo sia solo per windows e io vorrei stare in ambiente unix. Altri usano Jcap.
Il tutto, penso, verrebbe più comodo con phyton. Però non lo conosco. Appena ho tempo me lo studio, ma temo sarebbe una cosa molto lunga..e soprattutto non so se sia il caso di sapere poco di tanti linguaggi invece di sviscerarne uno e conoscerne quante più librerie possibili.
Ad ora ho studiato C approfondendone più che altro le strutture dati. Java sempre strutture dati + swing + socket (sto seguendo il corso ora).
Pareri? Consigli? Mi affido a voi che avete una visione più ampia
edit: lavorando a "basso" livello, forse verrebbe comodo il C? Non ho mai studiato il networking in C, ma posso farlo visto che non devo partire da 0
mi sto informando per fare progetti relativi al networking, non ho quindi esperienza ma ho sbattuto il naso contro questa pagina http://download.oracle.com/javase/tutorial/networking/overview/networking.html
che recita
When you write Java programs that communicate over the network, you are programming at the application layer.
quindi la risposta è secca, almeno secondo il contenuto di quella pagina ufficiale, ma molto, in java, dipende anche da quali classi usi ( aka librerie ), perché Sun/Oracle ti dice sempre quello che vale in casa sua non in tutto il mondo della programmazione.
magnifico :(
Quindi con il java "di base" non concludo nulla perchè sono troppo alto. Era meglio studiarsi il phyton :D.
Visto che non voglio studiare phyton con l'acqua alla gola, devo riuscire ad adattarmi al java. Per ora ho importato Jpcap (che permette di lavorare anche a più basso livello) ... adesso dovrò studiarmi la documentazione e darmi da fare.
magnifico :(
Quindi con il java "di base" non concludo nulla perchè sono troppo alto. Era meglio studiarsi il phyton :D.
Visto che non voglio studiare phyton con l'acqua alla gola, devo riuscire ad adattarmi al java. Per ora ho importato Jpcap (che permette di lavorare anche a più basso livello) ... adesso dovrò studiarmi la documentazione e darmi da fare.
ma ti conviene lavorare a basso livello? controllare pacchetti? controllare header? controllare tutto il controllabile?
ma ti conviene lavorare a basso livello? controllare pacchetti? controllare header? controllare tutto il controllabile?
devo..
quello che ho in mente è un'implementazione in java del classico tracerouting...quindi mi è utile poter creare dei pacchetti ICMP...
banryu79
03-10-2011, 09:18
Devo preparare un mini progettino [B]non sto
Mi sono scontrato con un problema...sembrerebbe che java non supporti nativamente la possibilità di programmare in rete così a basso livello. Confermate?
*snip*
Premetto che le mie limitate conoscenze sono praticamente rivolte al solo lato desktop, quindi so poco o niente di programmazione internet (a parte le nozioni generali). Incuriosito da questo thread sono andato a vedere cosa si intende per traceroute e ho cercato l'home page di questa Jpcacp.
In meno di cinque minuti ho trovato un sorgente di esempio di ruimentale traceroute fatto in Java usando le Jpcap.
Consiglio all'autore del thread di andare nella home page di Jpcap e informarsi, in particolare una visita nella sezione Samples (http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/samples.html) potrebbe essere proficua.
@EDIT: tra l'altro dando un'occhio ai javadoc è facile rendersi conto che Jpcap non deve essere un'API che richieda troppo tempo per essere assimilita: a livello quantitativo è composta da due package per un totale di un pugno di classi.
Non credo proprio che un traceroute si possa fare da J2SE liscio. Considera che devi forgiare dei pacchetti a mano, incrementando il time-to-live per ogni hop (traceroute funziona così: mandi pacchetti sempre allo stesso endpoint ma inizi con TTL = 1, poi 2, 3, 4, etc... e vedi chi ti risponde).
La via più facile è usare libpcap o un suo binding (come jpcap appunto).
banryu79
03-10-2011, 09:50
La via più facile è usare libpcap o un suo binding (come jpcap appunto).
Ah, ecco, mi era sfuggito il fatto che jpcacp fosse un *binding* in Java di una libreria C. L'ho già detto che sono ignorante in materia? :D
Jpcap è davvero molto utile. Dopo aver perso fin troppo tempo per compilarlo per il mio ubuntu 64bit, sto implementando il tracerouting ... e non è neppure difficile, devo dire.
ps. Ho dato un occhiata alla pagina con gli esempi...assurdo..ci sono pure i codici di cui ho bisogno :eek: , però non li guarderò altrimenti non imparo nulla
edit: ne approfitto per chiedere una cosa sui pacchetti...sono novizio di queste cose:
ICMP è incapsulato in IP, ma per inviare il pacchetto non dovrei "scegliere" un protocollo di livello4 tra TCP e UDP?
Mi spiego meglio: se non usassi jpcap , dovrei manualmente aprire una socket (tcp o udp) e inviare pacchetti (penso)...invece con jpcap posso direttamente creare un pacchetto ICMP, settare i vari campi e mandare in non so che modo tramite un suo metodo. La classe ICMP non è legata in nessun modo a quella TCP o UDP.
Non capisco bene la questione dell'incapsulamento dei vari livelli. Ogni pacchetto che invio devo sempre incapsularlo fino ad arrivare a livello 4?
edit2: continuando a studiarmi queste cose , trovo spesso scritto che ICMP è incapsulato in ip e che quindi non è garantita la consegna. Rendo allora più chiara la domanda del mio primo edit: come è possibile inviare un pacchetto , senza passare attraverso un protocollo di livello 4?
O jpcap con il suo send.(pacchetto); in realtà sta automatizzando il passaggio a livello 4, oppure non capisco come sia possibile inviare un pacchetto ICMP
edit3: e poi basta :D . Ho capito che ICMP è un protocollo "speciale" e non è legato ad UDP o TCP perchè a tutti gli effetti non è usato per il trasporto dati. Viene instradato "a parte" proprio da livello3. Quindi non devo preoccuparmi di incapsularlo in TCP o UDP (neppure potrei), perchè in quanto pacchetto ICMP, sarà inviato per conto proprio. Confermate?
creo un nuovo messaggio, non per uppare, ma per non pasticciare ulteriormente quello sopra.
Mi sono ritrovato di fronte ad un problema concettuale che non riesco a risolvere:
una volta creato il pacchetto ICMP con i campi di mio interesse e i campi dedicati al protocollo IP, devo specificare il datalink. Ed è qui che mi ritrovo a non capire. So che il datalink è di livello inferiore (2) e ne comprendo la funzione, ma non capisco fino a che punto devo essere io a specificare i vari livelli.
Ovvero, mettendo di dover mandare un pacchetto dati:
scelgo ad esempio TCP (livello 4), al suo interno imposto i campi IP (livello 3) altrimenti a chi manda il pacchetto.. , nei vari codici vedo poi che anche il livello 2 viene specificato: si ottiene il MAC della propria macchina e il MAC del gateway e si mette tutto in un campo datalink.
Ma allora fino a che punto devo incapsulare protocolli? Ogni volta devo arrivare a livello2?
Forse dipende dal tipo di linguaggio/libreria che sto usando? Ad esempio lavorando con le socket di java dovrei solo preoccuparmi del livello 4 (scegliendo la socket TCP o UDP)?
E' proprio una lacuna concettuale che non riesco a risolvere...e se qualcuno avesse la pazienza di spiegarmi cosa sto sbagliando mi farebbe un grande favore...perchè se non capisco bene le basi non potrò fare applicazioni complesse (ma neppure semplici..)
Grazie
edit: forse ho trovato conferme: "If this JpcapSender instance was created by openRawSocket(), you can only send IP packets, but you may not need to set the Datalink layer's header of the IP packets you want to send.
Note: the implementation and behavior of a raw socket may vary in different OS. For example, in Windows 2000/XP, you need to manually set the datalink/IP headers of a packet. "
quindi dipende proprio dal sistema + linguaggio + metodi ... o no?
edit2: riedito solo per far sapere che Jpcap ha una documentazione che fa schifo. Non c'è scritto praticamente nulla e si deve andare a tentativi. Oltre a questo , l'intero funzionamento delle librerie è molto dubbio visto che certi parametri vengono ignorati senza troppi complimenti nel momento di creazione del pacchetto.
starfred
09-10-2011, 12:45
ciao, il discorso è abbastanza semplice e si parte dal presupposto che tu hai OBBLIGATORIAMENTE bisogno dell'indirizzo mac mittente e dell'indirizzo mac del next-hop. Detto questo la documentazione che hai incollato spiega che in alcuni OS l'assegnamento dei vari mac address è automatica, in altri no.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.