Frage

Hat da draußen jemand die Arbeit des Sitzens auf eine Paketerfassung Schnittstelle (wie jpcap) mit einer Implementierung von UDPSocket (für UDP-Datagramme) und InputStream getan (für TCP-Streams)?

Ich glaube, es wäre nicht allzu schwer sein, die Callback-API in jpcap zu tun gegeben, aber jeder hat da draußen es bereits getan? Gibt es Probleme mit diesem zu tun (muß ich herausfinden, wie ein TCP-Stream selbst wieder zusammenzusetzen, zum Beispiel?)

War es hilfreich?

Lösung

Ich habe nicht diese besondere Sache getan, aber ich habe mit Parsing erfassten Paketen in C / C eine Menge Arbeit tun ++. Ich weiß nicht, ob es für jede dieser Java-Bibliotheken vorhanden sind.

Im Wesentlichen müssen Sie Ihren Weg, um den Protokoll-Stack bis arbeiten, mit IP zu starten. Die pcap Daten beginnt mit dem Link-Level-Header, aber ich glaube nicht, dass es viel drin, dass Sie besorgt sind, andere als Pakete nicht-IP ignoriert.

Die heikelste Sache mit IP ist Zusammenbauen fragmentierte Datagramme. Dies geschieht mit Hilfe der More Fragments Bit im Flags-Feld und das Feld Fragment Offset, mit dem Identifikationsfeld kombiniert Fragmente aus verschiedenen Datagrammen unterscheiden Dann verwenden Sie das Feld Protokoll TCP und UDP-Pakete zu identifizieren und die Header-Länge Feld das finden Start des entsprechenden Header.

Der nächste Schritt, sowohl für TCP und UDP, ist Demultiplexen, um die verschiedenen Verbindungen in dem erfassten Paketstrom abscheidet. Beide Protokolle identifizieren Verbindungen (na ja, nicht UDP keine Verbindungen per se, aber ich habe kein besseres Wort zur Hand haben) durch das 4-Tupel der Quell- und Ziel-IP-Adresse und die Quell- und Ziel-Port, so dass eine Verbindung würde eine Folge von Paketen, die auf allen vier dieser Werte entspricht.

Sobald das erledigt ist, für UDP, du bist nur etwa abgeschlossen, wenn Sie die Prüfsumme überprüfen möchten. Das Längenfeld in den UDP-Header gibt an, wie lange das Paket; subtrahieren 8 Byte für den Header und es gibt Ihre Daten.

TCP ist etwas komplizierter, da man in der Tat den Strom wieder zusammenzusetzen haben, ist dies die Sequenznummer im Header erfolgt unter Verwendung der Länge kombiniert. Die Summe dieser beiden teilt Ihnen die nächste Sequenznummer in dem Stream. Denken Sie daran, dass Sie in zwei Richtungen Spur des Verkehrs zu halten sind.

(Dies ist viel einfacher als eine tatsächliche TCP-Implementierung zu schreiben, wie dann müssen Sie den Nagle-Algorithmus und andere Minutien implementieren.)

Es gibt eine Menge von Informationen im Netz über die Header-Formate; google "IP-Header" für den Anfang. Ein Netzwerkanalysator wie Wireshark ist unverzichtbar für diese Arbeit, wie es Ihnen zeigen, wie Sie Ihre erfassten Daten aussehen soll. Tatsächlich ist, wie Wireshark Open Source ist, können Sie wahrscheinlich eine Menge, indem man herausfinden, wie es tut Dinge

Andere Tipps

Tcp Zusammenbauen kann mit JNetPcap erfolgen. Hier ist ein komplettes Beispiel:

final String SOME_PORT = 8888;

StringBuilder errbuf = new StringBuilder();
Pcap pcap = Pcap.openOffline("/dir/someFile.pcap", errbuf); //Can be replace with .openLive(...)

if (pcap == null) {
    System.err.printf("Error: "+errbuf.toString());
    return;
}

//Handler that receive Tcp Event one by one
AnalyzerListener<TcpStreamEvent> handler = new AnalyzerListener<TcpStreamEvent>() {

    @Override
    public void processAnalyzerEvent(TcpStreamEvent evt) {
        JPacket packet = evt.getPacket();

        Tcp tcp = new Tcp();
        if (packet.hasHeader(tcp)) {

              //Limiting the analysis to a specific protocol
              if (tcp.destination() == SOME_PORT || tcp.source() == SOME_PORT) {
                    String data = new String(tcp.getPayload());
                    System.out.println("Capture data:{"+data+"}");
              }
        }
    }
};

TcpAnalyzer tcpAnalyzer = JRegistry.getAnalyzer(TcpAnalyzer.class);
tcpAnalyzer.addTcpStreamListener(handler, null);

//Starting the capture
pcap.loop(Pcap.LOOP_INFINATE,  JRegistry.getAnalyzer(JController.class), null);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top