-
ID
-
status
:
SYN
ESTAB
FIN_WAIT
CLOSE_WAIT
CLOSED
-
wind
ID
[]byte 16 bytes
status
uint16 2 bytes
SYN
0b1000,0000,0000,0000
ACK
0b0100,0000,0000,0000
PSH
0b0010,0000,0000,0000
FIN
0b0001,0000,0000,0000
RST
0b0000,1000,0000,0000
RSV
0b0000,0000,0000,0000
extend
可选,以后由RSV决定
length
uint16 2 bytes
payload
可选,当length
不为0时存在
func read() (*packet, error) {
while true {
接受一个packet
p = *packet
if error {
return nil, 不可逆转error
}
if p.ACK {
扩大wind
continue
}
if p.FIN {
switch link 状态 {
case FIN_WAIT:
link 状态为CLOSED
return nil, CLOSED
case ESTAB:
lik 状态为CLOSE_WAIT
return nil, CLOSE_WAIT
default:
return nil, link 状态
}
}
if p.RST {
clink状态为异常,应立即强行关闭link
return nil, RST
}
if p.PSH {
发送 p.ID 的ack
return p, nil
}
}
}
func write(b []byte) (int, error) {
switch clink状态 {
//case CLOSE_WAIT, ESTAB:
case FIN_WAIT:
return 0, FIN_WAIT
case CLOSED:
return 0, CLOSED
}
if wind < len(b) {
阻塞,直到wind>=len(b)
}
构造packet, payload为b
p = packet
//p 放入缓冲区
发送p
缩小wind
return len(b), nil
}
func connect() {
构造 SYN packet, 发送
link 状态为 SYN
接收 SYN_ACK packet
link 状态为 ESTAB
}
func closeWrite() error {
switch link 状态:
case ESTAB:
发送 FIN packet
link 状态为 FIN_WAIT
return FIN_WAIT
case CLOSE_WAIT:
发送 FIN packet
link 状态为 CLOSED
return CLOSED
case FIN_WAIT:
return FIN_WAIT
case CLOSED:
return CLOSED
}
func close() error {
switch link 状态:
default:
发送 RST packet
return RST
case CLOSE_WAIT:
发送 FIN packet
return nil
}