Рефакторинг
This commit is contained in:
@@ -29,6 +29,7 @@ dependencies {
|
|||||||
compile group: 'commons-io', name: 'commons-io', version: '2.6'
|
compile group: 'commons-io', name: 'commons-io', version: '2.6'
|
||||||
compile 'org.pcap4j:pcap4j-core:1.+'
|
compile 'org.pcap4j:pcap4j-core:1.+'
|
||||||
compile 'org.pcap4j:pcap4j-packetfactory-static:1.+'
|
compile 'org.pcap4j:pcap4j-packetfactory-static:1.+'
|
||||||
|
compile group: 'com.google.guava', name: 'guava', version: '28.2-jre'
|
||||||
compileOnly 'org.projectlombok:lombok'
|
compileOnly 'org.projectlombok:lombok'
|
||||||
runtimeOnly 'org.springframework.boot:spring-boot-devtools'
|
runtimeOnly 'org.springframework.boot:spring-boot-devtools'
|
||||||
runtimeOnly 'org.postgresql:postgresql'
|
runtimeOnly 'org.postgresql:postgresql'
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package ru.serega6531.packmate;
|
package ru.serega6531.packmate;
|
||||||
|
|
||||||
|
import com.google.common.collect.*;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
||||||
@@ -41,11 +42,11 @@ public class PcapWorker implements PacketListener {
|
|||||||
|
|
||||||
private long packetIdCounter = 0; // оно однопоточное, так что пусть будет без atomic
|
private long packetIdCounter = 0; // оно однопоточное, так что пусть будет без atomic
|
||||||
|
|
||||||
private final Map<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>> unfinishedStreams = new HashMap<>();
|
private final ListMultimap<UnfinishedStream, ru.serega6531.packmate.model.Packet> unfinishedStreams = ArrayListMultimap.create();
|
||||||
|
|
||||||
// в следующих мапах в Set находится srcIp соответствующего пакета
|
// в следующих мапах в Set находится srcIp соответствующего пакета
|
||||||
private final Map<UnfinishedStream, Set<ImmutablePair<Inet4Address, Integer>>> fins = new HashMap<>();
|
private final SetMultimap<UnfinishedStream, ImmutablePair<Inet4Address, Integer>> fins = HashMultimap.create();
|
||||||
private final Map<UnfinishedStream, Set<ImmutablePair<Inet4Address, Integer>>> acks = new HashMap<>();
|
private final SetMultimap<UnfinishedStream, ImmutablePair<Inet4Address, Integer>> acks = HashMultimap.create();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public PcapWorker(ServicesService servicesService,
|
public PcapWorker(ServicesService servicesService,
|
||||||
@@ -176,44 +177,40 @@ public class PcapWorker implements PacketListener {
|
|||||||
.content(content)
|
.content(content)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
if (unfinishedStreams.containsKey(stream)) {
|
if (!unfinishedStreams.containsKey(stream)) {
|
||||||
unfinishedStreams.get(stream).add(packet);
|
|
||||||
} else {
|
|
||||||
log.debug("Начат новый стрим");
|
log.debug("Начат новый стрим");
|
||||||
List<ru.serega6531.packmate.model.Packet> packets = new ArrayList<>();
|
|
||||||
packets.add(packet);
|
|
||||||
unfinishedStreams.put(stream, packets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unfinishedStreams.put(stream, packet);
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkTcpTermination(boolean ack, boolean fin, boolean rst,
|
private void checkTcpTermination(boolean ack, boolean fin, boolean rst,
|
||||||
ImmutablePair<Inet4Address, Integer> sourceIpAndPort, ImmutablePair<Inet4Address, Integer> destIpAndPort,
|
ImmutablePair<Inet4Address, Integer> sourceIpAndPort, ImmutablePair<Inet4Address, Integer> destIpAndPort,
|
||||||
UnfinishedStream stream) {
|
UnfinishedStream stream) {
|
||||||
final Set<ImmutablePair<Inet4Address, Integer>> finsForStream = fins.computeIfAbsent(stream, k -> new HashSet<>());
|
|
||||||
final Set<ImmutablePair<Inet4Address, Integer>> acksForStream = acks.computeIfAbsent(stream, k -> new HashSet<>());
|
|
||||||
|
|
||||||
if (fin) {
|
if (fin) {
|
||||||
finsForStream.add(sourceIpAndPort);
|
fins.put(stream, sourceIpAndPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ack && finsForStream.contains(destIpAndPort)) { // проверяем destIp, потому что ищем ответ на его fin
|
if (ack && fins.containsEntry(stream, destIpAndPort)) { // проверяем destIp, потому что ищем ответ на его fin
|
||||||
acksForStream.add(sourceIpAndPort);
|
acks.put(stream, sourceIpAndPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
// если соединение разорвано с помощью rst или закрыто с помощью fin-ack-fin-ack
|
// если соединение разорвано с помощью rst или закрыто с помощью fin-ack-fin-ack
|
||||||
if (rst || (acksForStream.contains(sourceIpAndPort) && acksForStream.contains(destIpAndPort))) {
|
if (rst || (acks.containsEntry(stream, sourceIpAndPort) && acks.containsEntry(stream, destIpAndPort))) {
|
||||||
streamService.saveNewStream(stream, unfinishedStreams.get(stream));
|
streamService.saveNewStream(stream, unfinishedStreams.get(stream));
|
||||||
|
|
||||||
unfinishedStreams.remove(stream);
|
unfinishedStreams.removeAll(stream);
|
||||||
fins.remove(stream);
|
fins.removeAll(stream);
|
||||||
acks.remove(stream);
|
acks.removeAll(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int closeTimeoutStreams(Protocol protocol, long timeoutMillis) {
|
int closeTimeoutStreams(Protocol protocol, long timeoutMillis) {
|
||||||
int streamsClosed = 0;
|
int streamsClosed = 0;
|
||||||
final Iterator<Map.Entry<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>>> iterator = unfinishedStreams.entrySet().iterator();
|
final Iterator<Map.Entry<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>>> iterator =
|
||||||
|
Multimaps.asMap(unfinishedStreams).entrySet().iterator();
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
final Map.Entry<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>> entry = iterator.next();
|
final Map.Entry<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>> entry = iterator.next();
|
||||||
@@ -229,8 +226,8 @@ public class PcapWorker implements PacketListener {
|
|||||||
iterator.remove();
|
iterator.remove();
|
||||||
|
|
||||||
if (protocol == Protocol.TCP) {
|
if (protocol == Protocol.TCP) {
|
||||||
fins.remove(stream);
|
fins.removeAll(stream);
|
||||||
acks.remove(stream);
|
acks.removeAll(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user