Files
goodlink/netstack/tcp.go
2025-07-15 13:04:21 +08:00

87 lines
2.3 KiB
Go

package netstack
import (
"time"
"gvisor.dev/gvisor/pkg/tcpip"
"gvisor.dev/gvisor/pkg/tcpip/adapters/gonet"
"gvisor.dev/gvisor/pkg/tcpip/stack"
)
const (
// defaultWndSize 如果设置为零,则使用默认的接收窗口缓冲区大小
defaultWndSize = 64 * 1024
// maxConnAttempts 指定最大并发TCP连接尝试数
maxConnAttempts = 2 << 12
// 优化的缓冲区大小配置
minSendBufferSize = 64 * 1024
maxSendBufferSize = 4 * 1024 * 1024
defaultSendBufferSize = 256 * 1024
minReceiveBufferSize = 64 * 1024
maxReceiveBufferSize = 8 * 1024 * 1024
defaultReceiveBufferSize = 512 * 1024
// tcpKeepaliveCount 在放弃并关闭连接之前发送的最大TCP保活探测次数
tcpKeepaliveCount = 6
// tcpKeepaliveIdle 减少保活空闲时间以更快检测断开连接
tcpKeepaliveIdle = 30 * time.Second
// tcpKeepaliveInterval 减少探测间隔
tcpKeepaliveInterval = 10 * time.Second
)
// setSocketOptions 设置TCP套接字选项
func setSocketOptions(s *stack.Stack, ep tcpip.Endpoint) tcpip.Error {
{ /* TCP保活选项 */
ep.SocketOptions().SetKeepAlive(true)
// 设置保活空闲时间
idle := tcpip.KeepaliveIdleOption(tcpKeepaliveIdle)
if err := ep.SetSockOpt(&idle); err != nil {
return err
}
// 设置保活探测间隔
interval := tcpip.KeepaliveIntervalOption(tcpKeepaliveInterval)
if err := ep.SetSockOpt(&interval); err != nil {
return err
}
// 设置保活探测次数
if err := ep.SetSockOptInt(tcpip.KeepaliveCountOption, tcpKeepaliveCount); err != nil {
return err
}
}
{ /* TCP接收/发送缓冲区大小 */
// 设置优化的发送缓冲区大小
ep.SocketOptions().SetSendBufferSize(int64(defaultSendBufferSize), false)
// 设置优化的接收缓冲区大小
ep.SocketOptions().SetReceiveBufferSize(int64(defaultReceiveBufferSize), false)
}
{ /* TCP性能优化选项 */
// 启用延迟ACK以减少网络流量
ep.SocketOptions().SetDelayOption(true)
// 启用重用地址和端口
ep.SocketOptions().SetReuseAddress(true)
ep.SocketOptions().SetReusePort(true)
}
return nil
}
// tcpConn 实现了TCP连接接口
type TcpConn struct {
*gonet.TCPConn
id stack.TransportEndpointID
}
// ID 返回连接的传输端点ID
func (c *TcpConn) ID() *stack.TransportEndpointID {
return &c.id
}