
大家好,我是Tony Bai。
欢迎来到 Go 网络编程全解微专栏 的第三讲。
在上一讲中,我们投入了大量精力,去驯服 TCP 这条无边界的“字节之河”,通过设计应用层协议,成功地在“流”之上构建了“消息”的边界。我们现在拥有了可靠传输数据的能力。
但是,我们赖以传输数据的这条“管道”——net.Conn,它本身又是如何被建立,又如何被销毁的呢?
我们知道 net.Dial 能建立连接,conn.Close() 能关闭它。但这背后,客户端和服务器的内核之间,究竟发生了怎样一番“友好而严谨的对话”?我们常常听说的“三次握手”和“四次挥手”,到底“握”了什么,“挥”了什么?
一个 TCP 连接的生命周期,远比我们想象的要复杂。它是所有上层应用(如 HTTP, gRPC)的舞台。如果舞台的搭建和拆除过程我们一无所知,那么当应用出现 connection refused, connection reset by peer等错误,或者 netstat 里出现一堆 TIME_WAIT, CLOSE_WAIT 等“神秘”状态时,我们就只能束手无策。
不懂连接的生命周期,网络诊断就无从谈起。
这一讲,我们将扮演一次“网络侦探”,从应用层暂时下潜,重温一下大学本科学习计算机网络时的场景,去亲眼见证一个 TCP 连接从诞生到消亡的全过程。我们将不再满足于“知道”有三次握手和四次挥手,而是要用最强大的网络分析工具 tcpdump,去“看见”它们。
注:如果具备实验条件,大家也可以使用GUI版本的Wireshark进行tcp握手和挥手的分析。
在这一讲,我将带你一起:
理论与图示: 用清晰的时序图,彻底搞懂三次握手和四次挥手的每一个步骤和状态变迁。
tcpdump实战: 编写 Go 程序,并用tcpdump抓取真实的数据包,将抽象的理论与具体的数据一一对应。异常终结: 了解连接是如何被异常重置(RST)的。
埋下伏笔: 首次使用
netstat观察到TIME_WAIT和CLOSE_WAIT状态,为下一讲的深度诊断做好铺垫。
准备好你的终端,一场“眼见为实”的网络探索之旅,现在开始。

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



