-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcp_state.go
102 lines (91 loc) · 2.26 KB
/
tcp_state.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package packemon
type TCPState int
const (
TCP_STATE_INIT TCPState = iota
TCP_STATE_3WAY_HANDSHAKE_SEND_SYN
TCP_STATE_3WAY_HANDSHAKE_PASSIVE_SYNACK
TCP_STATE_3WAY_HANDSHAKE_SEND_ACK // = established tcp connection
TCP_STATE_PASSIVE_PSHACK // = データ受信
TCP_STATE_SEND_FINACK // = tcp connection を終えたい
TCP_STATE_PASSIVE_FINACK
TCP_STATE_SEND_ACK
)
type TCPConnection struct {
currentState TCPState
SrcPort uint16
DstPort uint16
established bool
}
func NewTCPConnection(SrcPort uint16, DstPort uint16) *TCPConnection {
return &TCPConnection{
currentState: TCP_STATE_INIT,
SrcPort: SrcPort,
DstPort: DstPort,
}
}
func (conn *TCPConnection) SetState(state TCPState) {
conn.currentState = state
}
func (conn *TCPConnection) IsPassiveSynAckForHandshake(tcp *TCP) bool {
if conn.established {
return false
}
if conn.currentState != TCP_STATE_3WAY_HANDSHAKE_SEND_SYN {
return false
}
if tcp.DstPort != conn.SrcPort {
return false
}
if tcp.Flags == TCP_FLAGS_SYN_ACK {
conn.currentState = TCP_STATE_3WAY_HANDSHAKE_PASSIVE_SYNACK
return true
}
return false
}
func (conn *TCPConnection) EstablishedConnection() {
conn.currentState = TCP_STATE_3WAY_HANDSHAKE_SEND_ACK
conn.established = true
}
func (conn *TCPConnection) Close() {
conn.established = false
}
func (conn *TCPConnection) IsPassiveAck(tcp *TCP) bool {
if !conn.established {
return false
}
if tcp.DstPort != conn.SrcPort {
return false
}
if tcp.Flags == TCP_FLAGS_ACK {
// TODO: ここでACK送りましたstateセットしても意味がある?
// state セットするの意味あるのは初めと終わりの時のハンドシェイクくらい?
return true
}
return false
}
func (conn *TCPConnection) IsPassivePshAck(tcp *TCP) bool {
if !conn.established {
return false
}
if tcp.DstPort != conn.SrcPort {
return false
}
if tcp.Flags == TCP_FLAGS_PSH_ACK {
conn.currentState = TCP_STATE_PASSIVE_PSHACK
return true
}
return false
}
func (conn *TCPConnection) IsPassiveFinAck(tcp *TCP) bool {
if !conn.established {
return false
}
if tcp.DstPort != conn.SrcPort {
return false
}
if tcp.Flags == TCP_FLAGS_FIN_ACK {
conn.currentState = TCP_STATE_PASSIVE_FINACK
return true
}
return false
}