2014-06-24 22 views
5

Belirli bir ağ kartını dinliyorum ve jPcap kütüphanesini kullanarak TCP (sadece TCP) paketlerini yakalarım. Ancak, tek tek paketler değil, tüm TCP oturumlarına sahip olmam gerekiyor.Gerçek Zamanlı TCP oturum yeniden yapılandırmayı kullanarak jPcap'ı kullanarak jpegap

Wireshark'da "tcp akışını takip et" seçeneğini seçebilirim, böylece tüm sohbeti başından sonuna kadar alabilirim. Ben tam olarak bunu Java’da yapmak istiyorum. Bu paketleri gerçek zamanlı olarak nasıl yeniden yapılandırabilirim? Ağ kartını dinlerken ve yeni paketler yakalarken TCP oturumlarını yeniden oluşturmak istiyorum. Bunu nasıl başarabilirim? - ama HashMap<String,TCPPacket> kullanmak

jpcap.NetworkInterface[] devices = JpcapCaptor.getDeviceList(); 
      JpcapCaptor captor = JpcapCaptor.openDevice(devices[1], 65535, true, 1000); 
      JpcapWriter writer = JpcapWriter.openDumpFile(captor, "myNetworkDump"); 
      captor.loopPacket(-1, new PacketPrinter(writer)); 

class PacketPrinter implements PacketReceiver { 

    private HashMap<Long, ArrayList<Packet>> sessions; 
    private BufferedWriter out; 
    private JpcapWriter writer; 

    Map<Long, TCPBodyData> bodies = new HashMap<Long, TCPBodyData>(); 

    public PacketPrinter(JpcapWriter writer) { 
     this.writer = writer; 
     this.sessions = new HashMap<Long, ArrayList<Packet>>(); 
    } 

    public void receivePacket(Packet packet) { 
     System.out.println(packet); 
     if (packet instanceof TCPPacket) { 
      TCPPacket tcppacl = (TCPPacket) packet; 
      byte[] body = addBodyData(tcppacl); 
      // System.out.println(new String(body)); 
     } 
} 
} 

cevap

1

Ben jPcap hakkında fazla bir şey bilmiyorum (Bunun yerine jNetPcap kullanmalıdır here ve ben okuduğumu hatırlıyorum): İşte paketleri yakalamak için benim kodudur tcp sohbeti, konuşmayı saklamak için, String anahtarı örneğin String.join('.',remotehost_tcp_address,remote_host_tcp_port) olmakta, daha sonra bir RST veya FIN-FIN + ACK-ACK dizisini çıkarmak için beklemektedir.

Sisteminiz yoğun bir ağ yükü yaşıyorsa ve zaman aşımına uğramış görüşmeleri izlemek isteyip istemediğinizi pahalı bir işlem olabileceğini unutmayın.

+0

Farklı kalitede jPcap adı verilen en az üç farklı proje vardır. – EJP

1

pcap-reconst projesi, pcap dosyalarından TCP akışını yeniden oluşturmak için bir çerçeve sağlar. İşi yapmak için TcpReassembler sınıfının public void reassemblePacket(TcpPacket tcpPacket) yöntemini kullanabilirsiniz.

/* 
* The main function of the class receives a tcp packet and reconstructs the stream 
*/ 
public void reassemblePacket(TcpPacket tcpPacket) throws Exception { 
    .... 
} 
/* 
*Get the TCP stream 
*/ 
public OutputStream getOutputStream() { 
    return outputStream; 
} 

/* 
* Reconstructs the tcp session 
* @param sequence Sequence number of the tcp packet 
* @param length The size of the original packet data 
* @param data The captured data 
* @param data_length The length of the captured data 
* @param synflag 
* @param net_src The source ip address 
* @param net_dst The destination ip address 
* @param srcport The source port 
* @param dstport The destination port 
*/ 
private void reassembleTcp(long sequence, long ack_num, long length, byte[] data, 
          int dataLength, boolean synflag, 
          TcpConnection tcpConnection) throws Exception { 
     .... 
} 
+0

OP'nin istediği gibi görünmüyor. – EJP

+0

OP, "Bu paketleri gerçek zamanlı olarak nasıl yeniden oluşturabilirim? Ağ kartını dinlerken ve yeni paketler yakalarken TCP oturumlarını yeniden oluşturmak istiyorum." Buna cevap veriyorum. Sağladığı kod sadece bir deneme. –

+0

Cevabınız * paketlerin yeniden yapılandırılması ile ilgilidir. * Yeniden oturum * oturumları hakkında soru soruyor. * – EJP

1

Kaynak konak, kaynak portu, hedef konak, hedef portu tarafından grup paketleri denemek ve sıra numaralarını inşaası başladı. Bir oturumun ne zaman başladığını bilmek için, SYN ile 1 olarak ayarlanmış paketleri kontrol edebilirsiniz, şu anda ISN (Başlangıç ​​Dizisi Numarası) ve daha sonraki tüm ISN + 1 paketlerini yakalayabilirsiniz. EntN + n aynı tcp akışında olacaktır. Bir oturumun ne zaman bittiğini bilmek için bir FIN paketini kontrol etmeniz gerekir. Wikipedia'nın bağlantısı kötü değil http://en.m.wikipedia.org/wiki/Transmission_Control_Protocol fakat daha iyi ve derin bir okuma için "TCP/IP Resimli vol.1" 'i öneririm.

+1

yüzgeci paketleri kesinlikle doğru olan konuşmaları sonlandıracaktır. Ama ne dersin? – Alpay

+0

Ben hala doğru tcp akışına ilişkilendirmek için RST paketinden ACK sıra numarasını kullanabilirsiniz düşünüyorum ama emin değilim. –

İlgili konular