news 2026/9/26 11:00:52

Go 网络模型:从 net.Conn 到 TCP 调优实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go 网络模型:从 net.Conn 到 TCP 调优实战

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 说明
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 10:59:50

Manus惊天反转背后:用TaoToken统一Key打通Meta系AI工具链的配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 10:57:40

Verdi 2026 Assistant与MCP配置指南:modulefile编写与联调实战

1. 从一条报错说起&#xff1a;为什么要在 Verdi 里折腾 MCP如果你正在跑 VCS 与 Verdi 的联合仿真&#xff0c;大概率见过这个场景&#xff1a;仿真跑完&#xff0c;simv正常退出&#xff0c;verdi -ssf novas.fsdb也能打开波形&#xff0c;但当你试图在 Verdi 里调用某个自动…

作者头像 李华