当我们通过终端执行一条 curl 命令时,屏幕背后正进行着一系列复杂的网络通信。本文将以 curl -v cip.cc 这条简单命令为例,结合 Wireshark 抓包工具,带您亲眼见证一个数据包从发起到结束的完整生命周期。
第一步:执行命令,观察表面现象
在终端中输入以下命令:
curl -v cip.cc
-v 参数的作用是启用详细模式,它会输出请求和响应的详细信息,包括请求头、响应头等关键元数据。

从返回结果中,我们可以直接看到自己的公网IP地址以及地理位置等信息。而我们今天关注的重点,是隐藏在这些信息背后的网络通信流程。
第二步:Wireshark抓包,揭开网络层的神秘面纱
在启动Wireshark抓包前,建议先清空本地DNS缓存,以确保域名解析是从网络中实时获取的。在Windows系统中,可以在命令提示符中执行:ipconfig /flushdns。

随后,启动Wireshark,选择正在使用的网卡开始抓包,然后再次执行 curl -v cip.cc 命令。很快,Wireshark窗口中将出现大量色彩各异的数据包。
第三步:DNS协议分析——网络的指路系统
首先,在Wireshark顶部的过滤器中输入 dns,筛选出与DNS协议相关的数据包。

我们可以看到第一个请求就是DNS查询:客户端向DNS服务器请求解析 cip.cc 域名对应的IP地址。
- Queries部分:查询的域名为
cip.cc,查询类型(Type)为A记录,类别(Class)为IN(Internet)。
- Answers部分:DNS服务器返回的响应中,包含了查询结果,即
cip.cc 对应的IP地址。这个过程如同在网络世界中“问路”,DNS服务器扮演了向导的角色。
第四步:TCP协议基础——HTTP的可靠传输载体
HTTP协议本身并不负责可靠传输,这一重任落在了TCP协议肩上。在抓包结果中,我们可以清晰地观察到TCP连接的经典“三次握手”与“四次挥手”。

三次握手建立连接
TCP通过三次握手建立一个可靠的连接通道:
- SYN:客户端向服务器发送一个SYN(同步)报文,序列号为随机初始值。
- SYN-ACK:服务器收到后回复一个SYN-ACK(同步-确认)报文,确认客户端的SYN,并携带自己的初始序列号。
- ACK:客户端再次发送ACK报文,确认服务器的SYN。至此,双向连接建立完成。
数据传输过程
连接建立后,HTTP请求和响应便通过这条可靠的TCP连接进行传输,TCP确保数据有序、不丢失地到达对端。
四次挥手关闭连接
通信结束后,通过四次挥手来优雅地释放连接资源:
- FIN:一方(通常是客户端)发送FIN报文,表示数据发送完毕,希望关闭连接。
- ACK:另一方回复ACK报文,确认收到了FIN请求。
- FIN:另一方也发送自己的FIN报文,表示自己也准备关闭连接。
- ACK:最初发送FIN的一方回复最终的ACK确认,连接完全关闭。
第五步:理解网络连接概念——使用Wireshark对话分析
Wireshark的 “Conversations”(对话) 功能是理解网络连接宏观概念的利器。它聚合展示了不同端点之间的所有通信,帮助我们从“连接”而非“单个数据包”的视角来审视网络流。
访问Conversations窗口
点击Wireshark菜单栏的 “Statistics” → “Conversations”,即可打开对话统计窗口。

在这个窗口中,您可以查看不同层次的通信对:
- Ethernet选项卡:展示基于MAC地址的数据链路层通信。
- IPv4/IPv6选项卡:展示基于IP地址的网络层通信。
- TCP/UDP选项卡:展示基于端口的传输层对话,这是我们分析HTTP连接的重点。
分析TCP对话
切换到TCP选项卡,可以找到与 cip.cc 服务器IP通信的那一行。点击该行可以查看详细的统计信息,如通信双方的地址和端口、总吞吐量(发送/接收字节数、数据包数量)等。
连接的生命周期
通过Conversations视图,我们可以直观地看到一个完整网络连接的生命周期:
- 连接建立阶段:对应三次握手的数据包。
- 数据传输阶段:对应HTTP请求和响应交换的数据包。
- 连接终止阶段:对应四次挥手的数据包。

过滤特定连接
在Conversations窗口中右键点击感兴趣的对话行,选择 “Apply as Filter” → “Selected”,Wireshark主界面将只显示与该连接相关的所有数据包。这能让我们专注于分析单个连接的完整行为,对于性能分析与故障排查极为有用。
第六步:HTTP协议分析——应用层的数据传输
现在,在Wireshark过滤器中输入 http,查看应用层的HTTP协议数据包。


选中一个HTTP数据包,右键点击并选择“追踪流” -> “TCP流”,可以看到清晰的HTTP报文内容。
HTTP请求头
GET / HTTP/1.1
Host: cip.cc
User-Agent: curl/8.7.1
Accept: */*
- 请求行:使用GET方法,请求根路径
/,协议版本为HTTP/1.1。
- Host字段:指定服务器的主机名。
- User-Agent:表明客户端是cURL工具。
- Accept:声明客户端可以接收任何类型的响应内容。
HTTP响应头
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 188
Connection: keep-alive
- 状态行:协议版本、状态码200(成功)、原因短语OK。
- 响应头:
Content-Type定义内容类型,Content-Length指明响应体大小,Connection: keep-alive表示支持长连接。
- 响应体:紧随头部之后,即我们看到的包含IP地址信息的文本内容。
总结:数据流动的全景图
回顾 curl -v cip.cc 命令的完整执行过程,我们清晰地看到了数据在网络各层中的旅程:
- DNS解析:将人类可读的域名
cip.cc 转换为机器可识别的IP地址。
- TCP连接:通过三次握手,在客户端与服务器之间建立一条可靠的传输通道。
- HTTP请求:在建立的TCP连接上,发送应用层的HTTP GET请求。
- HTTP响应:服务器处理请求后,通过同一TCP连接返回HTTP响应(含状态码、头部和IP信息正文)。
- 连接关闭:数据传输完毕后,通过四次挥手释放TCP连接资源。
通过Wireshark的 Conversations功能,我们得以从宏观上把握整个连接从生到死的生命周期。这种连接级别的视角,比孤立地查看单个数据包更能帮助我们理解网络通信的本质,也是深入学习网络协议和进行网络调试的关键技能。抓包分析将抽象的网络概念转化为具体、可视的数据流,这种具象化的理解对于开发者和运维人员至关重要。
拓展建议:您可以尝试使用此方法分析更复杂的场景,例如浏览器加载一个完整网页时,是如何并发建立多个TCP连接以下载HTML、CSS、JavaScript和图片等资源的,这将有助于理解现代Web应用的网络性能特性。