Go 网络模型:从 net.Conn 到 TCP 调优实战
网络编程是 Go 后端基础功。本文讲清 net 包、TCP / UDP 区别、连接管理、TLS、企业实战。
一、net 包基础
import"net"ln,err:=net.Listen("tcp",":8080")conn,err:=ln.Accept()二、TCP 三次握手
client → SYN server → SYN+ACK client → ACK三、net.Dial
conn,err:=net.DialTimeout("tcp","127.0.0.1:3306",2*time.Second)四、TLS
import"crypto/tls"config:=&tls.Config{ServerName:"example.com"}conn,err:=tls.Dial("tcp","example.com:443",config)五、Client
typeClientstruct{conn net.Conn mu sync.Mutex}func(c*Client)send(p[]byte)error{c.mu.Lock();deferc.mu.Unlock()_,err:=c.conn.Write(p)returnerr}加锁避免并发写。
六、读 Loop
buf:=make([]byte,4096)for{n,err:=conn.Read(buf)iferr!=nil{returnerr}// 业务处理}注意 buffer 复用以减少分配。
七、HTTP Client 调优
import"net/http"client:=&http.Client{Timeout:3*time.Second,Transport:&http.Transport{MaxIdleConns:100,MaxIdleConnsPerHost:10,IdleConnTimeout:30*time.Second,},}八、tcp 半连接 / 全连接
- 半连接 (SYN_RECV):还在握手
- 全连接 (ESTABLISHED):可通信
netstat-n|grep8080九、TCP_NODELAY
conn.(*net.TCPConn).SetNoDelay(true)关闭 Nagle 算法,对低时延业务有用。
十、SO_KEEPALIVE
conn.(*net.TCPConn).SetKeepAlive(true)conn.(*net.TCPConn).SetKeepAlivePeriod(30*time.Second)十一、UDP
udpAddr,_:=net.ResolveUDPAddr("udp",":9999")conn,_:=net.DialUDP("udp",nil,udpAddr)conn.Write([]byte("hello"))buf:=make([]byte,1024)n,addr,err:=conn.ReadFromUDP(buf)十二、DNS Lookup
addrs,err:=net.LookupHost("golang.org")十三、自定义 Resolver
resolver:=&net.Resolver{PreferGo:true,Dial:func(ctx context.Context,network,addressstring)(net.Conn,error){d:=net.Dialer{Timeout:2*time.Second}returnd.DialContext(ctx,"udp","8.8.8.8:53")},}十四、WebSocket
import"github.com/gorilla/websocket"十五、KCP
import"github.com/xtaci/libkcp-go"KCP 在丢包环境下比 TCP 友好。
十六、QUIC
import"github.com/lucas-clemente/quic-go"QUIC / HTTP3 是未来。
十七、Connection Pool
typePoolstruct{connschannet.Conn factoryfunc()(net.Conn,error)}func(p*Pool)Get()(net.Conn,error){select{casec:=<-p.conns:returnc,nildefault:returnp.factory()}}func(p*Pool)Put(c net.Conn){select{casep.conns<-c:default:c.Close()}}十八、企业实战:高吞吐代理
gofunc(){for{ln.Accept()handle(...)}}()goroutine-per-conn。
十九、踩坑清单
- TIME_WAIT 多 — 加 SO_REUSEADDR
- DNS 查询慢 — 自定义 Resolver
- 网络 IO 频繁 — 用 bufio
二十、监控 net io
ss-tanstate established ss-s二十一、未来
- HTTP/3 逐渐普及
- eBPF-based 网络监控
二十二、总结与展望
net 包功能强大。深入 TCP / UDP / TLS / WebSocket / QUIC 各层协议,能让你在网络调优时游刃有余。
二十三、参考文献
- Go 标准库 net
- Cloudflare TCP tuning 博客
- O’Reilly TCP/IP 说明