Закончено разделение на стримы

This commit is contained in:
serega6531
2019-04-29 03:31:20 +03:00
parent bbe4eaf56e
commit 2b33f7aef4

View File

@@ -47,8 +47,8 @@ public class PcapWorker {
private final Map<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>> unfinishedStreams = new HashMap<>(); private final Map<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>> unfinishedStreams = new HashMap<>();
// в следующих мапах в листах srcIp соответствующего пакета // в следующих мапах в листах srcIp соответствующего пакета
private final Map<UnfinishedStream, List<String>> fins = new HashMap<>(); private final Map<UnfinishedStream, Set<String>> fins = new HashMap<>();
private final Map<UnfinishedStream, List<String>> acks = new HashMap<>(); private final Map<UnfinishedStream, Set<String>> acks = new HashMap<>();
@Autowired @Autowired
public PcapWorker(ServicesService servicesService, public PcapWorker(ServicesService servicesService,
@@ -115,6 +115,7 @@ public class PcapWorker {
Protocol protocol = null; Protocol protocol = null;
boolean ack = false; boolean ack = false;
boolean fin = false; boolean fin = false;
boolean rst = false;
if(rawPacket.contains(IpV4Packet.class)){ if(rawPacket.contains(IpV4Packet.class)){
final IpV4Packet.IpV4Header header = rawPacket.get(IpV4Packet.class).getHeader(); final IpV4Packet.IpV4Header header = rawPacket.get(IpV4Packet.class).getHeader();
@@ -131,6 +132,7 @@ public class PcapWorker {
destPort = header.getDstPort().valueAsInt(); destPort = header.getDstPort().valueAsInt();
ack = header.getAck(); ack = header.getAck();
fin = header.getFin(); fin = header.getFin();
rst = header.getRst();
content = packet.getRawData(); content = packet.getRawData();
protocol = Protocol.TCP; protocol = Protocol.TCP;
} else if(rawPacket.contains(UdpPacket.class)) { } else if(rawPacket.contains(UdpPacket.class)) {
@@ -152,6 +154,9 @@ public class PcapWorker {
} }
if(serviceOptional.isPresent()) { if(serviceOptional.isPresent()) {
String sourceIpAndPort = sourceIpString + ":" + sourcePort;
String destIpAndPort = destIpString + ":" + destPort;
UnfinishedStream stream = new UnfinishedStream(sourceIp, destIp, sourcePort, destPort, protocol); UnfinishedStream stream = new UnfinishedStream(sourceIp, destIp, sourcePort, destPort, protocol);
ru.serega6531.packmate.model.Packet packet = ru.serega6531.packmate.model.Packet.builder() ru.serega6531.packmate.model.Packet packet = ru.serega6531.packmate.model.Packet.builder()
@@ -168,27 +173,35 @@ public class PcapWorker {
unfinishedStreams.put(stream, packets); unfinishedStreams.put(stream, packets);
} }
log.info("{} {} {}:{} -> {}:{}, номер пакета {}",
packet.getTempId(), serviceOptional.get(), sourceIpString, sourcePort, destIpString, destPort,
unfinishedStreams.get(stream).size());
if(protocol == Protocol.TCP) { if(protocol == Protocol.TCP) {
if(!fins.containsKey(stream)) { if(!fins.containsKey(stream)) {
fins.put(stream, new ArrayList<>()); fins.put(stream, new HashSet<>());
} }
if(!acks.containsKey(stream)) { if(!acks.containsKey(stream)) {
acks.put(stream, new ArrayList<>()); acks.put(stream, new HashSet<>());
} }
if(ack && fins.get(stream).contains(destIpString)) { // проверяем destIp, потому что ищем ответ на его fin final Set<String> finsForStream = fins.get(stream);
//TODO final Set<String> acksForStream = acks.get(stream);
if(fin) {
finsForStream.add(sourceIpAndPort);
} }
if(fin && acks.get(stream).contains(destIpString)) { if(ack && finsForStream.contains(destIpAndPort)) { // проверяем destIp, потому что ищем ответ на его fin
acksForStream.add(sourceIpAndPort);
}
if(rst || (acksForStream.contains(sourceIpAndPort) && acksForStream.contains(destIpAndPort))) {
log.info("Конец стрима");
//TODO //TODO
} }
} }
log.info("{} {}:{} -> {}:{}, stream size {}, {} {}",
serviceOptional.get(), sourceIpString, sourcePort, destIpString, destPort,
unfinishedStreams.get(stream).size(), ack ? "ask" : "", fin ? "fin" : "");
} }
} }
} }