Class: PacketGen::Header::TCP
- Inherits:
-
Base
- Object
- Types::Fields
- Base
- PacketGen::Header::TCP
- 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, Types::Int16 type),
-
a destination port (#dport,
Int16type), -
a sequence number (#seqnum, Types::Int32 type),
-
an acknownledge number (#acknum,
Int32type), -
a 16-bit field (#u16,
Int16type) composed of:-
a 4-bit #data_offset self,
-
a 3-bit #reserved field,
-
a 9-bit #flags field,
-
-
a #window field (
Int16type), -
a #checksum field (
Int16type), -
a urgent pointer (#urg_pointer,
Int16type), -
and a #body (Types::String type).
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. << PacketGen::Header::TCP::MSS.new(1250)
or:
tcph. << { opt: 'MSS', self[attr]: 1250 }
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
-
#acknum ⇒ Integer
(also: #acknowledgement_number)
32-bit TCP acknowledgement number.
- #body ⇒ Types::String, Header::Base
-
#checksum ⇒ Integer
16-bit TCP checksum.
-
#data_offset ⇒ Integer
(also: #hlen)
4-bit data offset from #u16.
-
#dport ⇒ Integer
(also: #destination_port)
16-bit TCP destination port.
-
#flag_ack ⇒ Boolean
1-bit ACK flag.
-
#flag_cwr ⇒ Boolean
1-bit CWR flag.
-
#flag_ece ⇒ Boolean
1-bit ECE flag.
-
#flag_fin ⇒ Boolean
1-bit FIN flag.
-
#flag_ns ⇒ Boolean
1-bit NS flag.
-
#flag_psh ⇒ Boolean
1-bit PSH flag.
-
#flag_rst ⇒ Boolean
1-bit RST flag.
-
#flag_syn ⇒ Boolean
1-bit SYN flag.
-
#flag_urg ⇒ Boolean
1-bit URG flag.
-
#flags ⇒ Integer
9-bit flags from #u16.
-
#options ⇒ Options
TCP options.
-
#reserved ⇒ Integer
3-bit reserved from #u16.
-
#seqnum ⇒ Integer
(also: #sequence_number)
32-bit TCP sequence number.
-
#sport ⇒ Integer
(also: #source_port)
16-bit TCP source port.
-
#u16 ⇒ Integer
16-bit word used by flags and bit fields.
-
#urg_pointer ⇒ Integer
16-bit TCP urgent data pointer.
-
#window ⇒ Integer
(also: #wsize)
16-bit TCP window size.
Instance Method Summary collapse
-
#calc_checksum ⇒ Integer
Compute checksum and set
checksumfield. -
#calc_length ⇒ Integer
Compute header length and set
data_offsetfield. -
#initialize(options = {}) ⇒ TCP
constructor
Call {Base#initialize), then handle specific options to set
u16by part: *:data_offset*:hlen*:reserved*:flags. - #inspect ⇒ String
-
#read(str) ⇒ self
Read a TCP header from a string.
-
#reply! ⇒ self
Invert source and destination port numbers.
Methods inherited from Base
bind, calculate_and_set_length, #header_id, inherited, #ip_header, known_headers, #ll_header
Methods included from PacketGen::Headerable
#added_to_packet, included, #method_name, #packet, #packet=, #parse?, #protocol_name
Methods inherited from Types::Fields
#[], #[]=, #bits_on, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, fields, inherited, #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
157 158 159 160 |
# File 'lib/packetgen/header/tcp.rb', line 157 def initialize(={}) opts = { data_offset: 5 }.merge!() super(opts) end |
Instance Attribute Details
#acknum ⇒ Integer Also known as: acknowledgement_number
32-bit TCP acknowledgement number
105 |
# File 'lib/packetgen/header/tcp.rb', line 105 define_field :acknum, Types::Int32 |
#body ⇒ Types::String, Header::Base
127 |
# File 'lib/packetgen/header/tcp.rb', line 127 define_field :body, Types::String |
#checksum ⇒ Integer
16-bit TCP checksum
116 |
# File 'lib/packetgen/header/tcp.rb', line 116 define_field :checksum, Types::Int16 |
#data_offset ⇒ Integer Also known as: hlen
Returns 4-bit data offset from #u16.
168 |
# File 'lib/packetgen/header/tcp.rb', line 168 define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9 |
#dport ⇒ Integer Also known as: destination_port
16-bit TCP destination port
97 |
# File 'lib/packetgen/header/tcp.rb', line 97 define_field :dport, Types::Int16 |
#flag_ack ⇒ Boolean
Returns 1-bit ACK flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_cwr ⇒ Boolean
Returns 1-bit CWR flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_ece ⇒ Boolean
Returns 1-bit ECE flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_fin ⇒ Boolean
Returns 1-bit FIN flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_ns ⇒ Boolean
Returns 1-bit NS flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_psh ⇒ Boolean
Returns 1-bit PSH flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_rst ⇒ Boolean
Returns 1-bit RST flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_syn ⇒ Boolean
Returns 1-bit SYN flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 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_urg ⇒ Boolean
Returns 1-bit URG flag.
190 191 |
# File 'lib/packetgen/header/tcp.rb', line 190 define_bit_fields_on :u16, :_, 7, :flag_ns, :flag_cwr, :flag_ece, :flag_urg, :flag_ack, :flag_psh, :flag_rst, :flag_syn, :flag_fin |
#flags ⇒ Integer
Returns 9-bit flags from #u16.
168 |
# File 'lib/packetgen/header/tcp.rb', line 168 define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9 |
#options ⇒ Options
TCP options
124 |
# File 'lib/packetgen/header/tcp.rb', line 124 define_field :options, TCP::Options |
#reserved ⇒ Integer
Returns 3-bit reserved from #u16.
168 |
# File 'lib/packetgen/header/tcp.rb', line 168 define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9 |
#seqnum ⇒ Integer Also known as: sequence_number
32-bit TCP sequence number
101 |
# File 'lib/packetgen/header/tcp.rb', line 101 define_field :seqnum, Types::Int32, default: ->(_) { rand(2**32) } |
#sport ⇒ Integer Also known as: source_port
16-bit TCP source port
93 |
# File 'lib/packetgen/header/tcp.rb', line 93 define_field :sport, Types::Int16 |
#u16 ⇒ Integer
Returns 16-bit word used by flags and bit fields.
108 |
# File 'lib/packetgen/header/tcp.rb', line 108 define_field :u16, Types::Int16 |
#urg_pointer ⇒ Integer
16-bit TCP urgent data pointer
120 |
# File 'lib/packetgen/header/tcp.rb', line 120 define_field :urg_pointer, Types::Int16 |
#window ⇒ Integer Also known as: wsize
16-bit TCP window size
112 |
# File 'lib/packetgen/header/tcp.rb', line 112 define_field :window, Types::Int16 |
Instance Method Details
#calc_checksum ⇒ Integer
Compute checksum and set checksum field
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_length ⇒ Integer
Compute header length and set data_offset field
224 225 226 |
# File 'lib/packetgen/header/tcp.rb', line 224 def calc_length self[:data_offset] = 5 + self[:options].sz / 4 end |
#inspect ⇒ String
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
# 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] 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
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/packetgen/header/tcp.rb', line 195 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
249 250 251 252 |
# File 'lib/packetgen/header/tcp.rb', line 249 def reply! self[:sport], self[:dport] = self[:dport], self[:sport] self end |