Class: PacketGen::Header::TCP
- Extended by:
- HeaderClassMethods
- Includes:
- HeaderMethods, StructFu
- 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:
-
a source port (#sport, StructFu::Int16 type),
-
a destination port (#dport,
Int16type), -
a sequence number (#seqnum, StructFu::Int32 type),
-
an acknownledge number (#acknum,
Int32type), -
a 16-bit field (#u16,
Int16type) composed of:-
a 4-bit #data_offset value,
-
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 (StructFu::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)
Another way is to use Options#add:
tcph..add 'MSS', 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: #acknowledgment_number)
Getter for acknum attribuute.
-
#body ⇒ Object
Returns the value of attribute body.
-
#checksum ⇒ Integer
Getter for checksum attribuute.
-
#data_offset ⇒ Integer
(also: #hlen)
4-bit data offset from #u16.
-
#dport ⇒ Integer
(also: #destination_port)
Getter for 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 ⇒ Object
Returns the value of attribute options.
-
#reserved ⇒ Integer
3-bit reserved from #u16.
-
#seqnum ⇒ Integer
(also: #sequence_number)
Getter for seqnum attribuute.
-
#sport ⇒ Integer
(also: #source_port)
Getter for source port.
-
#u16 ⇒ Object
Returns the value of attribute u16.
-
#urg_pointer ⇒ Integer
Getter for urg_pointer attribuute.
-
#window ⇒ Integer
(also: #wsize)
Getter for window attribuute.
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
A new instance of TCP.
- #inspect ⇒ String
-
#read(str) ⇒ self
Read a TCP header from a string.
Methods included from HeaderClassMethods
bind_header, define_bit_fields_on, known_headers
Methods included from HeaderMethods
#header_id, #ip_header, #packet, #packet=, #protocol_name
Methods included from StructFu
#clone, #set_endianness, #sz, #to_s, #typecast
Methods inherited from Struct
Constructor Details
#initialize(options = {}) ⇒ TCP
Returns a new instance of TCP.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/packetgen/header/tcp.rb', line 80 def initialize(={}) super Int16.new([:sport]), Int16.new([:dport]), Int32.new([:seqnum] || rand(2**32)), Int32.new([:acknum]), Int16.new, Int16.new([:window] || [:wsize]), Int16.new([:checksum]), Int16.new([:urg_pointer]), Options.new, StructFu::String.new.read([:body]) doff = [:data_offset] || [:hlen] || 5 rsv = [:reserved] || 0 flgs = [:flags] || 0 self.u16.read (((doff << 3) | rsv) << 9) | flgs end |
Instance Attribute Details
#acknum ⇒ Integer Also known as: acknowledgment_number
Getter for acknum attribuute
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def acknum @acknum end |
#body ⇒ Object
Returns the value of attribute body
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def body @body end |
#checksum ⇒ Integer
Getter for checksum attribuute
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def checksum @checksum end |
#data_offset ⇒ Integer Also known as: hlen
Returns 4-bit data offset from #u16.
104 |
# File 'lib/packetgen/header/tcp.rb', line 104 define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9 |
#dport ⇒ Integer Also known as: destination_port
Getter for destination port
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def dport @dport end |
#flag_ack ⇒ Boolean
Returns 1-bit ACK flag.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
126 127 |
# File 'lib/packetgen/header/tcp.rb', line 126 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.
104 |
# File 'lib/packetgen/header/tcp.rb', line 104 define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9 |
#options ⇒ Object
Returns the value of attribute options
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def @options end |
#reserved ⇒ Integer
Returns 3-bit reserved from #u16.
104 |
# File 'lib/packetgen/header/tcp.rb', line 104 define_bit_fields_on :u16, :data_offset, 4, :reserved, 3, :flags, 9 |
#seqnum ⇒ Integer Also known as: sequence_number
Getter for seqnum attribuute
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def seqnum @seqnum end |
#sport ⇒ Integer Also known as: source_port
Getter for source port
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def sport @sport end |
#u16 ⇒ Object
Returns the value of attribute u16
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def u16 @u16 end |
#urg_pointer ⇒ Integer
Getter for urg_pointer attribuute
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def urg_pointer @urg_pointer end |
#window ⇒ Integer Also known as: wsize
Getter for window attribuute
49 50 51 |
# File 'lib/packetgen/header/tcp.rb', line 49 def window @window end |
Instance Method Details
#calc_checksum ⇒ Integer
Compute checksum and set checksum field
149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/packetgen/header/tcp.rb', line 149 def calc_checksum sum = ip_header(self).pseudo_header_checksum sum += IP_PROTOCOL sum += self.sz str = self.to_s str << "\x00" if str.length % 2 == 1 sum += str.unpack('n*').reduce(:+) while sum > 0xffff do sum = (sum & 0xffff) + (sum >> 16) end sum = ~sum & 0xffff self[:checksum].value = (sum == 0) ? 0xffff : sum end |
#calc_length ⇒ Integer
Compute header length and set data_offset field
166 167 168 |
# File 'lib/packetgen/header/tcp.rb', line 166 def calc_length self[:data_offset] = 5 + self[:options].sz / 4 end |
#inspect ⇒ String
275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
# File 'lib/packetgen/header/tcp.rb', line 275 def inspect str = Inspect.dashed_line(self.class, 2) shift = Inspect.shift_level(2) to_h.each do |attr, value| next if attr == :body str << Inspect.inspect_attribute(attr, value, 2) if attr == :u16 doff = Inspect.int_dec_hex(data_offset, 1) str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'data_offset', doff] str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'reserved', reserved] flags = '' %w(ns cwr ece urg ack psh rst syn fin).each do |fl| flags << (send("flag_#{fl}?") ? fl[0].upcase : '.') end str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'flags', flags] end end str end |
#read(str) ⇒ self
Read a TCP header from a string
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/packetgen/header/tcp.rb', line 131 def read(str) return self if str.nil? raise ParseError, 'string too short for TCP' if str.size < self.sz 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] end |