Class: PacketGen::Header::TCP

Inherits:
Base
  • Object
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

TCP header (RFC 793)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

A TCP header consists of:

  • a source port (#sport, BinStruct::Int16 type),

  • a destination port (#dport, BinStruct::Int16 type),

  • a sequence number (#seqnum, BinStruct::Int32 type),

  • an acknownledge number (#acknum, BinStruct::Int32 type),

  • a 16-bit field (#u16, BinStruct::Int16 type) composed of:

  • a #window field (BinStruct::Int16 type),

  • a #checksum field (BinStruct::Int16 type),

  • a urgent pointer (#urg_pointer, BinStruct::Int16 type),

  • an optional #options field (Options type),

  • and a #body (BinStruct::String type).

Examples:

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.class   # => PacketGen::Header::TCP

TCP attributes

tcph = PacketGen::Header::TCP.new
tcph.sport = 4500
tcph.dport = 80
tcph.seqnum = 43
tcph.acknum = 0x45678925
tcph.wsize = 0x240
tcph.urg_pointer = 0x40
tcph.body = 'this is a body'

TCP Flags

tcph = PacketGen::Header::TCP.new
# TCP flags may be accesed as a 9-bit integer:
tcph.flags = 0x1002
# Each flag may be accessed independently:
tcph.flag_syn?    # => true
tcph.flag_rst = true

TCP Options

tcph = PacketGen::Header::TCP.new
# options TCP attribute is a PacketGen::Header::TCP::Options.
# PacketGen::Header::TCP::Option may added to it:
tcph.options << PacketGen::Header::TCP::MSS.new(value: 1250)
# or
tcph.options << { kind: 'MSS', value: 1250 }
tcph.options.last.class #=> PacketGen::Header::TCP::MSS

Author:

  • Sylvain Daubert

  • LemonTree55

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

Instance Method Summary collapse

Methods inherited from Base

bind, calculate_and_set_length, #header_id, inherited, #ip_header, #ll_header

Methods included from PacketGen::Headerable

#added_to_packet, included, #method_name, #packet, #packet=, #parse?, #protocol_name, #read, #to_s

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, Headerable)


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

def initialize(options={})
  opts = { data_offset: 5 }.merge!(options)
  super(opts)
  self.flags = opts[:flags] if opts.key?(:flags)
end

Instance Attribute Details

#acknumInteger Also known as: acknowledgement_number

32-bit TCP acknowledgement number

Returns:

  • (Integer)


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

define_attr :acknum, BinStruct::Int32

#bodyBinStruct::String, Headerable

TCP body

Returns:



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

define_attr :body, BinStruct::String

#checksumInteger

16-bit TCP checksum

Returns:

  • (Integer)


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

define_attr :checksum, BinStruct::Int16

#data_offsetInteger Also known as: hlen

Returns 4-bit data offset from #u16.

Returns:

  • (Integer)

    4-bit data offset from #u16



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#dportInteger Also known as: destination_port

16-bit TCP destination port

Returns:

  • (Integer)


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

define_attr :dport, BinStruct::Int16

#flag_ackInteger

Returns 1-bit ACK flag.

Returns:

  • (Integer)

    1-bit ACK flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_cwrInteger

Returns 1-bit CWR flag.

Returns:

  • (Integer)

    1-bit CWR flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_eceInteger

Returns 1-bit ECE flag.

Returns:

  • (Integer)

    1-bit ECE flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_finInteger

Returns 1-bit FIN flag.

Returns:

  • (Integer)

    1-bit FIN flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_nsInteger

Returns 1-bit NS flag.

Returns:

  • (Integer)

    1-bit NS flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_pshInteger

Returns 1-bit PSH flag.

Returns:

  • (Integer)

    1-bit PSH flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_rstInteger

Returns 1-bit RST flag.

Returns:

  • (Integer)

    1-bit RST flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_synInteger

Returns 1-bit SYN flag.

Returns:

  • (Integer)

    1-bit SYN flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flag_urgInteger

Returns 1-bit URG flag.

Returns:

  • (Integer)

    1-bit URG flag



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#flagsInteger

Get all flags value from [#u16]

Returns:

  • (Integer)


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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#optionsOptions

TCP options

Returns:



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

define_attr :options, TCP::Options, builder: ->(h, t) { t.new(length_from: -> { h.data_offset > 5 ? (h.data_offset - 5) * 4 : 0 }) }

#reservedInteger

Returns 3-bit reserved from #u16.

Returns:

  • (Integer)

    3-bit reserved from #u16



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#seqnumInteger Also known as: sequence_number

32-bit TCP sequence number

Returns:

  • (Integer)


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

define_attr :seqnum, BinStruct::Int32, default: ->(_) { rand(2**32) }

#sportInteger Also known as: source_port

16-bit TCP source port

Returns:

  • (Integer)


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

define_attr :sport, BinStruct::Int16

#u16Integer

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

Returns:

  • (Integer)

    16-bit word used by flags and bit fields



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

define_bit_attr :u16, data_offset: 4, reserved: 3, flag_ns: 1, flag_cwr: 1, flag_ece: 1, flag_urg: 1, flag_ack: 1, flag_psh: 1,
flag_rst: 1, flag_syn: 1, flag_fin: 1

#urg_pointerInteger

16-bit TCP urgent data pointer

Returns:

  • (Integer)


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

define_attr :urg_pointer, BinStruct::Int16

#windowInteger Also known as: wsize

16-bit TCP window size

Returns:

  • (Integer)


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

define_attr :window, BinStruct::Int16

Instance Method Details

#calc_checksumInteger

Compute checksum and set checksum field

Returns:

  • (Integer)


214
215
216
217
218
219
220
# File 'lib/packetgen/header/tcp.rb', line 214

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)


224
225
226
# File 'lib/packetgen/header/tcp.rb', line 224

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

#inspectString

Returns:

  • (String)


229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/packetgen/header/tcp.rb', line 229

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]
    str << shift << Inspect::FMT_ATTR % ['', 'flags', flags2string]
  end
end

#reply!self

Invert source and destination port numbers

Returns:

  • (self)

Since:

  • 2.7.0



245
246
247
248
# File 'lib/packetgen/header/tcp.rb', line 245

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