Class: ReassembleTcp::PacketStream

Inherits:
Object
  • Object
show all
Defined in:
lib/reassemble_tcp/packet_stream.rb

Overview

packet stream for the same direction and sequence(or acknowledge) number

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(direction, pkt) ⇒ PacketStream

Returns a new instance of PacketStream.

Parameters:



9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/reassemble_tcp/packet_stream.rb', line 9

def initialize(direction, pkt)
  case direction
  when :send
    @seq_ack_num = pkt.tcp_seq.to_i
  when :recv
    @seq_ack_num = pkt.tcp_ack.to_i
  else
    raise ArgumentError, "direction should be :send or :recv"
  end
  @direction = direction
  @range = pkt.timestamp..pkt.timestamp
  @pkts = [pkt]
end

Instance Attribute Details

#directionObject (readonly)

Returns the value of attribute direction.



5
6
7
# File 'lib/reassemble_tcp/packet_stream.rb', line 5

def direction
  @direction
end

#pktsObject (readonly)

Returns the value of attribute pkts.



5
6
7
# File 'lib/reassemble_tcp/packet_stream.rb', line 5

def pkts
  @pkts
end

#rangeObject (readonly)

Returns the value of attribute range.



5
6
7
# File 'lib/reassemble_tcp/packet_stream.rb', line 5

def range
  @range
end

#seq_ack_numObject (readonly)

Returns the value of attribute seq_ack_num.



5
6
7
# File 'lib/reassemble_tcp/packet_stream.rb', line 5

def seq_ack_num
  @seq_ack_num
end

Instance Method Details

#append(direction, pkt) ⇒ Array<PacketFu::Packet> Also known as: <<

Parameters:

Returns:

Raises:

  • (ArgumentError)


26
27
28
29
30
31
# File 'lib/reassemble_tcp/packet_stream.rb', line 26

def append(direction, pkt)
  raise ArgumentError unless match?(direction, pkt)
  @pkts << pkt
  @range = Range.new(*[@range.begin, @range.end, pkt.timestamp].minmax)
  @pkts
end

#dataString

reassemble tcp stream data

Returns:

  • (String)

    reassembled data



49
50
51
52
# File 'lib/reassemble_tcp/packet_stream.rb', line 49

def data
  pkts = @pkts.sort_by!{|pk| pk.timestamp }
  pkts.map{|pkt| pkt.payload }.select{|pay| pay !~ /\A\0+\Z/}.compact.join
end

#last_timestampFloat

Returns unix time value.

Returns:

  • (Float)

    unix time value



35
36
37
# File 'lib/reassemble_tcp/packet_stream.rb', line 35

def last_timestamp
  @range.last
end

#match?(direction, pkt) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


42
43
44
45
# File 'lib/reassemble_tcp/packet_stream.rb', line 42

def match?(direction, pkt)
  num = (direction == :send) ?  pkt.tcp_seq.to_i : pkt.tcp_ack.to_i
  @direction == direction && @seq_ack_num == num
end