-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandshake.go
176 lines (155 loc) · 4.2 KB
/
handshake.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package main
import (
"fmt"
"net"
"os"
"sync"
"time"
"github.com/songgao/water"
"github.com/theodesp/blockingQueues"
)
type clientHandShake struct {
sync.Mutex
tun *water.Interface
timeout time.Duration
recvPkt *FBuffer
getSynAck bool
clt *client
}
func newClientHandshak(timeout time.Duration, tun *water.Interface, clt *client) *clientHandShake {
chs := new(clientHandShake)
chs.timeout = timeout
chs.tun = tun
chs.recvPkt = &FBuffer{}
chs.recvPkt.data = make([]byte, 40)
chs.clt = clt
chs.recvPkt.len = 0 //用0表示没有内容
return chs
}
//连不上的时候要不断的发送是为了等底层的网络重播完成之后拿到了新的ip了,要把一路上的nat打通
func (chs *clientHandShake) sendSYN() {
chs.Lock()
defer chs.Unlock()
srcIP := net.ParseIP(mConfig.TunSrcIP).To4()
dstIP := net.ParseIP(mConfig.ClientTunToIP).To4()
fPacket := FPacket{}
fPacket.srcIP = srcIP
fPacket.dstIP = dstIP
fPacket.srcPort = uint16(mConfig.TunSrcPort)
fPacket.dstPort = uint16(mConfig.ClientTunToPort)
fPacket.syn = true
fPacket.ack = false
fPacket.seqNum = 1024 //初始化seq
fPacket.ackNum = 0
fPacket.payload = nil
chs.recvPkt.len = 40
craftPacket(chs.recvPkt.data, &fPacket)
_, err := chs.tun.Write(chs.recvPkt.data[:chs.recvPkt.len])
fmt.Printf("client sending SYN... %s %d \n", dstIP, mConfig.ClientTunToPort)
checkError(err)
chs.recvPkt.len = 0 //表示还没收到内容
}
func (chs *clientHandShake) startListen() {
//等待syn+ack 或者超时
go func() {
readLen, err := chs.tun.Read(chs.recvPkt.data)
chs.Lock()
defer chs.Unlock()
chs.recvPkt.len = readLen
checkError(err)
packet := chs.recvPkt.data[:chs.recvPkt.len]
unpacket(packet, chs.clt.lastRecvPkt)
chs.getSynAck = true
fmt.Println("client got syn+ack")
}()
}
func (chs *clientHandShake) checkConn() bool {
chs.Lock()
chs.Unlock()
return chs.getSynAck
}
func (chs *clientHandShake) sendAck() {
//发送ack
fPacket := FPacket{}
srcIP := net.ParseIP(mConfig.TunSrcIP).To4()
dstIP := net.ParseIP(mConfig.ClientTunToIP).To4()
fPacket.srcIP = srcIP.To4()
fPacket.dstIP = dstIP.To4()
fPacket.srcPort = uint16(mConfig.TunSrcPort)
fPacket.dstPort = uint16(mConfig.ClientTunToPort)
fPacket.syn = false
fPacket.ack = true
fPacket.seqNum = chs.clt.lastRecvPkt.ackNum
fPacket.ackNum = chs.clt.lastRecvPkt.ackNum + 1
fPacket.payload = nil
craftPacket(chs.recvPkt.data, &fPacket)
chs.recvPkt.len = 40
_, err := chs.tun.Write(chs.recvPkt.data[:chs.recvPkt.len])
checkError(err)
fmt.Println("send ack")
}
/*
服务端握手
*/
type serverHandshake struct {
tun *water.Interface
clientSeq uint32
}
func newServerHandshak(tun *water.Interface) *serverHandshake {
mServerQueue, _ = blockingQueues.NewArrayBlockingQueue(uint64(mConfig.QLen))
sh := new(serverHandshake)
sh.tun = tun
return sh
}
func (sh *serverHandshake) waitSyn() {
fmt.Println("server waiting for SYN")
packet := make([]byte, 40)
_, err := sh.tun.Read(packet)
checkError(err)
fPacket := FPacket{}
fPacket.srcIP = make([]byte, 4)
fPacket.dstIP = make([]byte, 4)
unpacket(packet, &fPacket)
if !fPacket.syn {
fmt.Println("server get first packet not SYN!")
os.Exit(1)
}
peerIP = make([]byte, 4)
copy(peerIP, fPacket.srcIP)
peerPort = fPacket.srcPort
sh.clientSeq = fPacket.seqNum
}
func (sh *serverHandshake) sendSynAck() {
fmt.Println("server send syn+ack")
packet := make([]byte, 40)
fPacket := FPacket{}
fPacket.srcIP = net.ParseIP(mConfig.TunSrcIP).To4()
fPacket.dstIP = make([]byte, 4)
copy(fPacket.dstIP, peerIP)
fPacket.srcPort = uint16(mConfig.ServerTunPort)
fPacket.dstPort = peerPort
fPacket.syn = true
fPacket.ack = true
fPacket.seqNum = 1000 //首次发送syn
fPacket.ackNum = sh.clientSeq + 1
fPacket.payload = nil
craftPacket(packet, &fPacket)
_, err := sh.tun.Write(packet)
checkError(err)
mSerSeq = 1000
}
func (sh *serverHandshake) waitAck() {
packet := make([]byte, 40)
fPacket := FPacket{}
_, err := sh.tun.Read(packet)
checkError(err)
lastRecPacket = FPacket{}
lastRecPacket.srcIP = make([]byte, 4)
lastRecPacket.dstIP = make([]byte, 4)
unpacket(packet, &fPacket)
if !fPacket.ack {
fmt.Println("server get not ack")
os.Exit(1)
}
fmt.Println("server got ack hand shake done")
}