IT
OmnvertImage • Document • Network

PCAP → Flows CSV

Upload a PCAP/PCAPNG, optionally add a Wireshark display filter, and export flows as CSV.

Preview

CSV preview will appear here after export.
Server-sideProcessed server-side

This tool uses a server-side service for processing; uploaded files or requests are not kept for long-term storage.

About

This tool collapses a packet capture into flows and hands you a CSV. Upload a PCAP or PCAPNG, optionally narrow it with a Wireshark display filter, and you get a sorted table of conversations with byte and packet totals — the view you want when the question is “what is actually using this link?” rather than “what is in packet 4,812?”

A flow here is the classic 5-tuple: source IP, destination IP, source port, destination port and transport protocol. Every packet sharing those five values folds into one row. A 200 MB capture of a file transfer collapses to a handful of rows; a browsing session might reduce 40,000 packets to 300 flows. That compression ratio is information in itself — a capture that barely collapses is full of short-lived connections, and short-lived connections at scale is what scanning and beaconing look like.

The reason to use this instead of opening Wireshark is the output. Statistics → Conversations gives you the same aggregation, but getting it out cleanly, sorting it the way you want and pasting it into a ticket is fiddly, and the GUI struggles on multi-gigabyte files. A CSV drops straight into a spreadsheet or a pivot table, and you can produce one from a browser on a machine where installing a packet analyser is not an option — a jump host, a customer’s laptop, a locked-down build agent.

The filter box takes Wireshark display filter syntax, not BPF capture filter syntax, and mixing them up is the single most common mistake. tcp.port == 443 works; port 443 does not. Useful starting points: ip.addr == 10.0.0.5 for everything to and from one host; !(ip.addr == 10.0.0.0/8) to drop internal chatter and see what left the network; tcp.flags.syn == 1 && tcp.flags.ack == 0 to isolate connection attempts; dns to look only at name resolution; and a frame.time range to window an incident down to the minutes that matter.

Sort by bytes to find bulk movement — backups, image pulls, a database replicating, or data going somewhere it shouldn’t. Sort by packets to find behaviour. A port scan produces thousands of tiny packets spread across destination ports; a command-and-control beacon produces a small, regular flow that repeats on an interval; a broken retransmission loop produces enormous packet counts carrying almost no data. The derived number worth eyeballing is bytes per packet: anything close to the MTU is bulk payload, anything near 60 bytes is control traffic, handshakes, or scanning.

Turning on DNS names maps addresses back to hostnames using the DNS responses contained in the same capture. That is deliberate — it shows what the host on the wire actually believed at the time, rather than what the address resolves to today, which is what you want when investigating something historical. The consequence is that flows to hard-coded addresses, or connections reusing an answer cached before the capture started, stay numeric. A numeric row is not suspicious by itself, but a numeric row to an external address on an odd port is worth a second look.

A few edges change how you read the results. UDP has no connection, so a QUIC or DNS “flow” is a time-bounded grouping rather than a session, and long-lived QUIC traffic may appear as one row where TCP would have given you several. A capture taken outside the NAT boundary shows translated addresses, so the internal host that generated the traffic is invisible. A small snaplen gives accurate packet counts but understated byte totals, because payloads were clipped at capture time. And if the capture came from a switch port without a SPAN or mirror configured, you are only seeing broadcast traffic and your own — the top-talker list will be confidently wrong.

This is a summarisation tool and stops where the summary stops. It will not reassemble TCP streams, decode application payloads, decrypt TLS, or tell you what was inside a transfer; once a flow looks interesting, open the capture in Wireshark and follow the stream. Uploads are processed to produce the CSV and are not retained. Treat any capture as sensitive regardless of where it is analysed — cleartext protocols in an old capture routinely contain credentials, session tokens and internal hostnames.

How it works

  1. 1Open PCAP → Flows CSV and choose your file or enter the required input.
  2. 2Check the settings and start the process.
  3. 3The tool creates the result with temporary server-side processing.
  4. 4Download the output or copy the result when it is ready.

FAQ

What counts as a flow here?
A 5-tuple: source and destination IP, source and destination port, and transport protocol. All packets matching those five values are aggregated into one row with total bytes and packets.
Why are there far fewer rows than packets?
That is the point of the aggregation. A single TCP connection can carry tens of thousands of packets and still be one flow row. The ratio between packets and flows tells you whether the capture is a few long transfers or many short connections.
Which filter syntax should I use?
Wireshark display filter syntax, the same as the filter bar in the Wireshark GUI. tcp.port == 443 and ip.addr == 10.0.0.5 are valid; BPF-style capture filters like port 443 or host 10.0.0.5 are not.
Should I sort by bytes or packets?
Bytes for bulk transfers — backups, downloads, exfiltration. Packets for behavioural patterns — scans, beacons, retransmission storms. Looking at both, and at the bytes-per-packet ratio, is faster than guessing.
Does it support PCAPNG as well as PCAP?
Yes. Both classic PCAP and PCAPNG are accepted, including captures written by tcpdump, Wireshark, dumpcap and most network appliances.
What does DNS enrichment resolve against?
The DNS responses inside the capture itself, so names reflect what was resolved during that capture window. Addresses that were never looked up in the capture stay numeric — including hard-coded IPs and connections using previously cached answers.
Why is my internal server missing from the results?
Most likely the capture was taken outside the NAT boundary, so every internal host appears as the public address of the gateway. Capture on the inside interface if you need to identify individual hosts.
The byte totals look too low — why?
Check the snaplen used when capturing. tcpdump with -s 96, for example, records only the first 96 bytes of each packet, so packet counts stay correct while byte totals are truncated. Capture with -s 0 for full frames.
Can I see what was actually transferred?
No. Flows are counters, not content. Once you have identified the conversation, open the capture in Wireshark and use Follow TCP Stream to inspect the payload — assuming it isn’t encrypted.
How large a capture can I upload?
The tool is aimed at captures you can practically triage from a browser. For very large files, pre-filter with tshark or editcap first and upload the reduced capture — it is faster and gives a cleaner result.
Is my capture stored?
No. The file is processed to produce the CSV and is not retained. Captures often contain credentials from cleartext protocols, so handle them carefully wherever they are analysed.