Files
goodlink/netstack/tcp.go
2025-12-09 09:36:08 +08:00

76 lines
2.1 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 (
// 优化的缓冲区大小配置
defaultSendBufferSize = 10 * 1024 * 1024 // 从256KB提升到10MB
defaultReceiveBufferSize = 10 * 1024 * 1024 // 从512KB提升到10MB
// 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
}