如果你搜过TCP的四次挥手相关信息,你一定会看到类似这样的话:“主动方选择关闭连接后,被动方马上回ACK,此时可以继续传输数据,传完后再发送FIN”
(图片来源:CS-Notes/计算机网络 - 传输层.md at master · CyC2018/CS-Notes · GitHub)
为了验证CLOSE-WAIT状态是否真的能发数据,我先是写了这样一段代码:
代码如下,大致效果是:启动一个TCP服务端和客户端,服务端accept连接后关闭,此时理论上应该进入FIN-WAIT-1阶段。然后客户端不关闭,尝试在CLOSE-WAIT阶段发送数据,看看服务端能否在FIN-WAIT2阶段接收到数据。
// main.go
package main
import (
"net"
"time"
"github.com/sirupsen/logrus"
)
const (
serverAddr = "127.0.0.1:6666"
)
func serverMain() {
listener, err := net.Listen("tcp", serverAddr)
if err != nil {
panic(err)
}
conn, err := listener.Accept()
if err != nil {
panic(err)
}
go func() {
time.Sleep(time.Second)
conn.Close()
}()
go func() {
for {
buf := make([]byte, 100)
n, err := conn.Read(buf)
if err != nil {
logrus.Errorf("cannot read %v", err)
return
}
logrus.Infof("read:%v", buf[:n])
}
}()
tim