Flow Tracing¶
Note
This was implemented at the demand of my mate @gousaiyang. It is a approximate functionality of Follow TCP Streams in Wireshark.
pcapkit.foundation.traceflow implements flow tracing functions
for pcapkit package.
See also
For more information on customisation and extension, please refer to Customisation & Extensions.
All flow tracing classes are implemented as TraceFlowBase
subclasses, which are responsible for processing extracted packets and
follow the flow and/or stream to provide more insights. Below is a brief
diagram of the class hierarchy of pcapkit.foundation.traceflow:
flowchart LR
A{{TraceFlowMeta}} -.->|metaclass| B(TraceFlowBase)
B --> TCP
B --> C(TraceFlow)
C --> D([user customisation ...])
click A "/pcapkit/foundation/traceflow/traceflow.html#pcapkit.foundation.traceflow.traceflow.TraceFlowMeta"
click B "/pcapkit/foundation/traceflow/traceflow.html#pcapkit.foundation.traceflow.traceflow.TraceFlowBase"
click C "/pcapkit/foundation/traceflow/traceflow.html#pcapkit.foundation.traceflow.traceflow.TraceFlow"
click D "/ext.html#reassembly-and-flow-tracing"
click TCP "/pcapkit/foundation/traceflow/tcp.html#pcapkit.foundation.traceflow.tcp.TCP"
Auxiliary Data¶
- class pcapkit.foundation.traceflow.TraceFlowManager(*args: VT, **kwargs: VT)[source]¶
Bases:
InfoTraceFlow Manager.
- class pcapkit.foundation.traceflow.data.data.TraceFlowData(*args: VT, **kwargs: VT)[source]¶
Bases:
InfoData storage for flow tracing.
- class pcapkit.foundation.traceflow.data.data.Deferred(reassembly)[source]¶
Bases:
objectA postponed reassembly of a traced flow’s application layer.
A traced flow’s
packetis the application-layer payload of the conversation, one datagram per direction. Producing it means reassembling the stream, which is neither free nor wanted by most callers of a tracer – so the flow keeps the reassembler it was fed and this holds it until somebody readsIndex.packet.Note
Deliberately not
pcapkit.foundation.reassembly.data.data.Deferred, and not shared with it. That one postpones a singleanalyze()call over bytes already in hand; this postpones a submit over a reassembler’s buffers. The two subpackages are siblings and neither should depend on the other, so the twenty lines are written twice rather than one importing the other – the same reason the twodata/data.pymodules mirror each other instead of merging.- Parameters:
reassembly (
TCP) – The flow’s ownTCPreassembler, fed the segments of this conversation as they were traced.
- __call__()[source]¶
Run the postponed reassembly.
- Return type:
- Returns:
One reassembled datagram per direction of the conversation. Each carries its own postponed analysis in
Datagram.packet, so parsing the payload as an application-layer protocol is still not paid for until that is read in turn.
- class pcapkit.foundation.traceflow.data.data.DeferredPacket[source]¶
Bases:
objectResolves a
Deferredpacketfield on first read.The reading half of the arrangement above, and the counterpart of
pcapkit.foundation.reassembly.data.data.DeferredPacket.A subclass has to list
packetin its__additional__. That is what makes the field lazy at all:Infostores a field named there under a mangled key and maps it back on the way out, sopacketnever lands in__dict__itself – which routes reading it through__getattr__(), where the deferred reassembly can run, whiledict(index),to_dict()and iteration still report the field under its own name.