Class: 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,
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 4-bit #data_offset,
-
a 3-bit #reserved field,
-
a 9-bit #flags field,
-
-
a #window field (
BinStruct::Int16
type), -
a #checksum field (
BinStruct::Int16
type), -
a urgent pointer (#urg_pointer,
BinStruct::Int16
type), -
and a #body (
BinStruct::String
type).
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 ⇒ BinStruct::String, Headerable
TCP body.
-
#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 ⇒ Integer
1-bit ACK flag.
-
#flag_cwr ⇒ Integer
1-bit CWR flag.
-
#flag_ece ⇒ Integer
1-bit ECE flag.
-
#flag_fin ⇒ Integer
1-bit FIN flag.
-
#flag_ns ⇒ Integer
1-bit NS flag.
-
#flag_psh ⇒ Integer
1-bit PSH flag.
-
#flag_rst ⇒ Integer
1-bit RST flag.
-
#flag_syn ⇒ Integer
1-bit SYN flag.
-
#flag_urg ⇒ Integer
1-bit URG flag.
-
#flags ⇒ Integer
Get all flags value 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
checksum
field. -
#calc_length ⇒ Integer
Compute header length and set
data_offset
field. -
#initialize(options = {}) ⇒ TCP
constructor
Call {Base#initialize), then handle specific options to set
u16
by part: *:data_offset
*:hlen
*:reserved
*:flags
. - #inspect ⇒ String
-
#reply! ⇒ self
Invert source and destination port numbers.
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
192 193 194 195 196 |
# File 'lib/packetgen/header/tcp.rb', line 192 def initialize(={}) opts = { data_offset: 5 }.merge!() super(opts) self.flags = opts[:flags] if opts.key?(:flags) end |
Instance Attribute Details
#acknum ⇒ Integer Also known as: acknowledgement_number
32-bit TCP acknowledgement number
112 |
# File 'lib/packetgen/header/tcp.rb', line 112 define_attr :acknum, BinStruct::Int32 |
#body ⇒ BinStruct::String, Headerable
TCP body
162 |
# File 'lib/packetgen/header/tcp.rb', line 162 define_attr :body, BinStruct::String |
#checksum ⇒ Integer
16-bit TCP checksum
150 |
# File 'lib/packetgen/header/tcp.rb', line 150 define_attr :checksum, BinStruct::Int16 |
#data_offset ⇒ Integer Also known as: hlen
Returns 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 |
#dport ⇒ Integer Also known as: destination_port
16-bit TCP destination port
104 |
# File 'lib/packetgen/header/tcp.rb', line 104 define_attr :dport, BinStruct::Int16 |
#flag_ack ⇒ Integer
Returns 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_cwr ⇒ Integer
Returns 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_ece ⇒ Integer
Returns 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_fin ⇒ Integer
Returns 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_ns ⇒ Integer
Returns 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_psh ⇒ Integer
Returns 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_rst ⇒ Integer
Returns 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_syn ⇒ Integer
Returns 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_urg ⇒ Integer
Returns 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 |
#flags ⇒ Integer
Get all flags value 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 |
#options ⇒ Options
TCP options
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 }) } |
#reserved ⇒ Integer
Returns 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 |
#seqnum ⇒ Integer Also known as: sequence_number
32-bit TCP sequence number
108 |
# File 'lib/packetgen/header/tcp.rb', line 108 define_attr :seqnum, BinStruct::Int32, default: ->(_) { rand(2**32) } |
#sport ⇒ Integer Also known as: source_port
16-bit TCP source port
100 |
# File 'lib/packetgen/header/tcp.rb', line 100 define_attr :sport, BinStruct::Int16 |
#u16 ⇒ Integer
Returns 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_pointer ⇒ Integer
16-bit TCP urgent data pointer
154 |
# File 'lib/packetgen/header/tcp.rb', line 154 define_attr :urg_pointer, BinStruct::Int16 |
#window ⇒ Integer Also known as: wsize
16-bit TCP window size
146 |
# File 'lib/packetgen/header/tcp.rb', line 146 define_attr :window, BinStruct::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 |
# 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
245 246 247 248 |
# File 'lib/packetgen/header/tcp.rb', line 245 def reply! self[:sport], self[:dport] = self[:dport], self[:sport] self end |