من الممكن الجلوس على الشبكة واستقبال DTCP Stream / UDP Datagrams؟

StackOverflow https://stackoverflow.com/questions/1836749

سؤال

هل قام أي شخص بإجراء عمل يجلس على رأس واجهة التقاط حزمة (مثل JPCAP) مع تنفيذ UDPSocket (بالنسبة لمخطط بيانات UDP) و InputStream (لتدفقات TCP)؟

أفترض أنه لن يكون من الصعب للغاية القيام ب API رد الاتصال في JPCAP، ولكن هل حدث أي شخص آخر بالفعل؟ هل هناك أي مشاكل للقيام بذلك (هل يجب علي معرفة كيفية إعادة تجميع برامج TCP نفسي، على سبيل المثال؟)

هل كانت مفيدة؟

المحلول

لم أفعل هذا الشيء بالذات، لكنني أفعل الكثير من العمل مع تحليل حزم التقاط في C / C ++. لا أعرف إذا كانت هناك مكتبات جافا لأي من هذا.

أساسا، تحتاج إلى العمل في طريقك إلى كومة البروتوكول، بدءا من IP. تبدأ بيانات PCAP برأس مستوى الارتباط، لكنني لا أعتقد أن هناك كثيرا في الأمر الذي تشعر بالقلق إزاء تجاهل حزم غير الملكية الفكرية.

يخدع الشيء مع IP يعيد تجميع مخططات البيانات المجزأة. يتم ذلك باستخدام المزيد من الأجزاء في حقل الأعلام وحقل إزاحة الشظية، بالإضافة إلى حقل التعريف لتمييز الأجزاء من مخططات مخططات مخططات مختلفة، يمكنك استخدام حقل البروتوكول لتحديد حزم TCP و UDP، وحقل طول الرأس للعثور على بدء رأس المقابلة.

الخطوة التالية، لكل من TCP و UDP، هي demultiplexing، تفصل بين الاتصالات المختلفة في دفق الحزمة الملتقطة. تحدد كلا البروتوكولين الاتصالات (حسنا، لا يحتوي UDP على اتصالات في حد ذاته، لكن ليس لدي كلمة أفضل مفيدة) من خلال عنوان IP المصدر والوجهة وميناء المصدر والوجهة، لذلك سيتم الاتصال كن سلسلة من الحزم التي تتطابق على جميع هذه القيم 4.

بمجرد الانتهاء من ذلك، بالنسبة إلى UDP، فأنت فقط من الانتهاء، إلا إذا كنت ترغب في التحقق من المجموع الاختباري. يخبرك حقل الطول في رأس UDP إلى متى تكون هذه الحزمة؛ طرح 8 بايت للرأس وهناك بياناتك.

TCP أكثر تعقيدا إلى حد ما، كما تفعل في الواقع لإعادة تجميع الدفق، يتم ذلك باستخدام رقم التسلسل في الرأس، جنبا إلى جنب مع الطول. يخبرك مجموع هذين رقم التسلسل التالي في الدفق. تذكر أنك تتبع حركة المرور في اتجاهين.

(هذا أسهل بكثير من كتابة تطبيق TCP الفعلي، كما يجب عليك تطبيق خوارزمية Nagle وغيرها من Minutiae.)

هناك الكثير من المعلومات على الشبكة حول تنسيقات الرأس؛ جوجل "رأس IP" للمبتدئين. لا غنى عن محلل الشبكة مثل Wireshark لهذا العمل، حيث سيوضح لك كيف من المفترض أن تبدو بياناتك الملتقطة. في الواقع، لأن Wireshark مفتوح المصدر، فمن المحتمل أن تكتشف الكثير من خلال النظر في كيفية قيام الأشياء

نصائح أخرى

TCP إعادة التجميع يمكن القيام به مع jnetpcap.. وبعد هنا مثال كامل:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top