Class: PacketGen::Header::TCP

Inherits:
Base show all
Defined in:
lib/packetgen/header/tcp.rb,
lib/packetgen/header/tcp.rb,
lib/packetgen/header/tcp/option.rb,
lib/packetgen/header/tcp/options.rb

Overview

A TCP header consists of:

Create a TCP header

# standalone
tcph = PacketGen::Header::TCP.new
# in a IP packet
pkt = PacketGen.gen('IP').add('TCP')
# access to TCP header
pkt.tcp   # => PacketGen::Header::TCP

TCP attributes

tcph.sport = 4500
tcph.dport = 80
tcph.seqnum = 43
tcph.acknum = 0x45678925
tcph.wsize = 0x240
tcph.urg_pointer = 0x40
tcph.body.read 'this is a body'

Flags

TCP flags may be accesed as a 9-bit integer:

tcph.flags = 0x1002

Each flag may be accessed independently:

tcph.flag_syn?    # => Boolean
tcph.flag_rst = true

Options

#options TCP attribute is a Options. Option may added to it:

tcph.options << PacketGen::Header::TCP::MSS.new(1250)

or:

tcph.options << { opt: 'MSS', self[attr]: 1250 }

Author:

  • Sylvain Daubert

Defined Under Namespace

Classes: ECHO, ECHOREPLY, EOL, MSS, NOP, Option, Options, SACK, SACKOK, TS, WS

Constant Summary collapse

IP_PROTOCOL =

IP protocol number for TCP

6

Instance Attribute Summary collapse

Attributes inherited from Base

#packet

Instance Method Summary collapse

Methods inherited from Base

#added_to_packet, bind, bind_header, calculate_and_set_length, #header_id, inherited, #ip_header, known_headers, #ll_header, #method_name, #parse?, #protocol_name, protocol_name

Methods inherited from Types::Fields

#[], #[]=, #bits_on, define_bit_fields_on, define_field, define_field_after, define_field_before, delete_field, fields, #fields, #force_binary, inherited, #is_optional?, #is_present?, #offset_of, #optional?, #optional_fields, #present?, remove_bit_fields_on, remove_field, #sz, #to_h, #to_s, update_field

Constructor Details

#initialize(options = {}) ⇒ TCP

Call {Base#initialize), then handle specific options to set u16 by part:

  • :data_offset

  • :hlen

  • :reserved

  • :flags

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :sport (Integer)
  • :dport (Integer)
  • :seqnum (Integer)
  • :acknum (Integer)
  • :data_offset (Integer)
  • :reserved (Integer)
  • :flags (Integer)
  • :window (Integer)
  • :checksum (Integer)
  • :urg_pointer (Integer)
  • :body (String)


137
138
139
140
# File 'lib/packetgen/header/tcp.rb', line 137

def initialize(options={})
  opts = { data_offset: 5 }.merge!(options)
  super(opts)
end

Instance Attribute Details

#acknumInteger Also known as: acknowledgement_number

32-bit TCP acknowledgement number

Returns:

  • (Integer)


85
# File 'lib/packetgen/header/tcp.rb', line 85

define_field :acknum, Types::Int32

#bodyTypes::String, Header::Base



107
# File 'lib/packetgen/header/tcp.rb', line 107

define_field :body, Types::String

#checksumInteger

16-bit TCP checksum

Returns:

  • (Integer)


96
# File 'lib/packetgen/header/tcp.rb', line 96

define_field :checksum, Types::Int16

#data_offsetInteger Also known as: hlen

Returns 4-bit data offset from #u16.

Returns:

  • (Integer)

    4-bit data offset from #u16



148
# File 'lib/packetgen/header/tcp.rb', line 148

define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9

#dportInteger Also known as: destination_port

16-bit TCP destination port

Returns:

  • (Integer)


77
# File 'lib/packetgen/header/tcp.rb', line 77

define_field :dport, Types::Int16

#flag_ackBoolean

Returns 1-bit ACK flag.

Returns:

  • (Boolean)

    1-bit ACK flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_cwrBoolean

Returns 1-bit CWR flag.

Returns:

  • (Boolean)

    1-bit CWR flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_eceBoolean

Returns 1-bit ECE flag.

Returns:

  • (Boolean)

    1-bit ECE flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_finBoolean

Returns 1-bit FIN flag.

Returns:

  • (Boolean)

    1-bit FIN flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_nsBoolean

Returns 1-bit NS flag.

Returns:

  • (Boolean)

    1-bit NS flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_pshBoolean

Returns 1-bit PSH flag.

Returns:

  • (Boolean)

    1-bit PSH flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_rstBoolean

Returns 1-bit RST flag.

Returns:

  • (Boolean)

    1-bit RST flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_synBoolean

Returns 1-bit SYN flag.

Returns:

  • (Boolean)

    1-bit SYN flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flag_urgBoolean

Returns 1-bit URG flag.

Returns:

  • (Boolean)

    1-bit URG flag



170
171
# File 'lib/packetgen/header/tcp.rb', line 170

define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg,
:flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin

#flagsInteger

Returns 9-bit flags from #u16.

Returns:

  • (Integer)

    9-bit flags from #u16



148
# File 'lib/packetgen/header/tcp.rb', line 148

define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9

#optionsOptions

TCP options

Returns:



104
# File 'lib/packetgen/header/tcp.rb', line 104

define_field :options, TCP::Options

#reservedInteger

Returns 3-bit reserved from #u16.

Returns:

  • (Integer)

    3-bit reserved from #u16



148
# File 'lib/packetgen/header/tcp.rb', line 148

define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9

#seqnumInteger Also known as: sequence_number

32-bit TCP sequence number

Returns:

  • (Integer)


81
# File 'lib/packetgen/header/tcp.rb', line 81

define_field :seqnum, Types::Int32, default: ->(h) { rand(2**32) }

#sportInteger Also known as: source_port

16-bit TCP source port

Returns:

  • (Integer)


73
# File 'lib/packetgen/header/tcp.rb', line 73

define_field :sport, Types::Int16

#u16Integer

Returns 16-bit word used by flags and bit fields.

Returns:

  • (Integer)

    16-bit word used by flags and bit fields



88
# File 'lib/packetgen/header/tcp.rb', line 88

define_field :u16, Types::Int16

#urg_pointerInteger

16-bit TCP urgent data pointer

Returns:

  • (Integer)


100
# File 'lib/packetgen/header/tcp.rb', line 100

define_field :urg_pointer, Types::Int16

#windowInteger Also known as: wsize

16-bit TCP window size

Returns:

  • (Integer)


92
# File 'lib/packetgen/header/tcp.rb', line 92

define_field :window, Types::Int16

Instance Method Details

#calc_checksumInteger

Compute checksum and set checksum field

Returns:

  • (Integer)


193
194
195
196
197
198
199
# File 'lib/packetgen/header/tcp.rb', line 193

def calc_checksum
  sum = ip_header(self).pseudo_header_checksum
  sum += IP_PROTOCOL
  sum += self.sz
  sum += IP.sum16(self)
  self.checksum = IP.reduce_checksum(sum)
end

#calc_lengthInteger

Compute header length and set data_offset field

Returns:

  • (Integer)


203
204
205
# File 'lib/packetgen/header/tcp.rb', line 203

def calc_length
  self[:data_offset] = 5 + self[:options].sz / 4
end

#inspectString

Returns:

  • (String)


208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/packetgen/header/tcp.rb', line 208

def inspect
  super do |attr|
    next unless attr == :u16

    shift = Inspect.shift_level
    str = Inspect.inspect_attribute(attr, self[attr])
    doff = Inspect.int_dec_hex(data_offset, 1)
    str<< shift << Inspect::FMT_ATTR % ['', 'data_offset', doff]
    str << shift << Inspect::FMT_ATTR % ['', 'reserved', reserved]
    flags = ''.dup
    %w[ns cwr ece urg ack psh rst syn fin].each do |fl|
      flags << (send("flag_#{fl}?") ? fl[0].upcase : '.')
    end
    str << shift << Inspect::FMT_ATTR % ['', 'flags', flags]
  end
end

#read(str) ⇒ self

Read a TCP header from a string

Parameters:

  • str (String)

    binary string

Returns:

  • (self)


175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/packetgen/header/tcp.rb', line 175

def read(str)
  return self if str.nil?
  force_binary str
  self[:sport].read str[0, 2]
  self[:dport].read str[2, 2]
  self[:seqnum].read str[4, 4]
  self[:acknum].read str[8, 4]
  self[:u16].read str[12, 2]
  self[:window].read str[14, 2]
  self[:checksum].read str[16, 2]
  self[:urg_pointer].read str[18, 2]
  self[:options].read str[20, (self.data_offset - 5) * 4] if self.data_offset > 5
  self[:body].read str[self.data_offset * 4..-1]
  self
end

#reply!self

Invert source and destination port numbers

Returns:

  • (self)

Since:

  • 2.7.0



228
229
230
231
# File 'lib/packetgen/header/tcp.rb', line 228

def reply!
  self[:sport], self[:dport] = self[:dport], self[:sport]
  self
end