如果你搜过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])
}
}()
time.Sleep(time.Minute)
}
func clientMain() {
conn, err := net.D

博客探讨了TCP连接关闭过程中CLOSE-WAIT和FIN-WAIT2状态下的数据传输能力。通过Go和C语言的代码示例,展示了当服务端主动关闭连接后,客户端在CLOSE-WAIT状态尝试发送数据导致服务端返回RST的情况。解决方案是使用`shutdown`函数关闭写方向的连接,使得服务端能在FIN-WAIT2状态下接收数据。
1635

被折叠的 条评论
为什么被折叠?



