找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

453

积分

0

好友

61

主题
发表于 4 天前 | 查看: 13| 回复: 0

当我们通过终端执行一条 curl 命令时,屏幕背后正进行着一系列复杂的网络通信。本文将以 curl -v cip.cc 这条简单命令为例,结合 Wireshark 抓包工具,带您亲眼见证一个数据包从发起到结束的完整生命周期。

第一步:执行命令,观察表面现象

在终端中输入以下命令:

curl -v cip.cc

-v 参数的作用是启用详细模式,它会输出请求和响应的详细信息,包括请求头、响应头等关键元数据。

执行 curl -v cip.cc 命令

从返回结果中,我们可以直接看到自己的公网IP地址以及地理位置等信息。而我们今天关注的重点,是隐藏在这些信息背后的网络通信流程。

第二步:Wireshark抓包,揭开网络层的神秘面纱

在启动Wireshark抓包前,建议先清空本地DNS缓存,以确保域名解析是从网络中实时获取的。在Windows系统中,可以在命令提示符中执行:ipconfig /flushdns

清空DNS缓存

随后,启动Wireshark,选择正在使用的网卡开始抓包,然后再次执行 curl -v cip.cc 命令。很快,Wireshark窗口中将出现大量色彩各异的数据包。

第三步:DNS协议分析——网络的指路系统

首先,在Wireshark顶部的过滤器中输入 dns,筛选出与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三次握手

三次握手建立连接

TCP通过三次握手建立一个可靠的连接通道:

  1. SYN:客户端向服务器发送一个SYN(同步)报文,序列号为随机初始值。
  2. SYN-ACK:服务器收到后回复一个SYN-ACK(同步-确认)报文,确认客户端的SYN,并携带自己的初始序列号。
  3. ACK:客户端再次发送ACK报文,确认服务器的SYN。至此,双向连接建立完成。

数据传输过程

连接建立后,HTTP请求和响应便通过这条可靠的TCP连接进行传输,TCP确保数据有序、不丢失地到达对端。

四次挥手关闭连接

通信结束后,通过四次挥手来优雅地释放连接资源:

  1. FIN:一方(通常是客户端)发送FIN报文,表示数据发送完毕,希望关闭连接。
  2. ACK:另一方回复ACK报文,确认收到了FIN请求。
  3. FIN:另一方也发送自己的FIN报文,表示自己也准备关闭连接。
  4. ACK:最初发送FIN的一方回复最终的ACK确认,连接完全关闭。

第五步:理解网络连接概念——使用Wireshark对话分析

Wireshark的 “Conversations”(对话) 功能是理解网络连接宏观概念的利器。它聚合展示了不同端点之间的所有通信,帮助我们从“连接”而非“单个数据包”的视角来审视网络流。

访问Conversations窗口

点击Wireshark菜单栏的 “Statistics” → “Conversations”,即可打开对话统计窗口。

Conversations窗口

在这个窗口中,您可以查看不同层次的通信对:

  • Ethernet选项卡:展示基于MAC地址的数据链路层通信。
  • IPv4/IPv6选项卡:展示基于IP地址的网络层通信。
  • TCP/UDP选项卡:展示基于端口的传输层对话,这是我们分析HTTP连接的重点。

分析TCP对话

切换到TCP选项卡,可以找到与 cip.cc 服务器IP通信的那一行。点击该行可以查看详细的统计信息,如通信双方的地址和端口、总吞吐量(发送/接收字节数、数据包数量)等。

连接的生命周期

通过Conversations视图,我们可以直观地看到一个完整网络连接的生命周期

  1. 连接建立阶段:对应三次握手的数据包。
  2. 数据传输阶段:对应HTTP请求和响应交换的数据包。
  3. 连接终止阶段:对应四次挥手的数据包。

连接生命周期示意

过滤特定连接

在Conversations窗口中右键点击感兴趣的对话行,选择 “Apply as Filter” → “Selected”,Wireshark主界面将只显示与该连接相关的所有数据包。这能让我们专注于分析单个连接的完整行为,对于性能分析与故障排查极为有用。

第六步:HTTP协议分析——应用层的数据传输

现在,在Wireshark过滤器中输入 http,查看应用层的HTTP协议数据包。

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 命令的完整执行过程,我们清晰地看到了数据在网络各层中的旅程:

  1. DNS解析:将人类可读的域名 cip.cc 转换为机器可识别的IP地址。
  2. TCP连接:通过三次握手,在客户端与服务器之间建立一条可靠的传输通道。
  3. HTTP请求:在建立的TCP连接上,发送应用层的HTTP GET请求。
  4. HTTP响应:服务器处理请求后,通过同一TCP连接返回HTTP响应(含状态码、头部和IP信息正文)。
  5. 连接关闭:数据传输完毕后,通过四次挥手释放TCP连接资源。

通过Wireshark的 Conversations功能,我们得以从宏观上把握整个连接从生到死的生命周期。这种连接级别的视角,比孤立地查看单个数据包更能帮助我们理解网络通信的本质,也是深入学习网络协议和进行网络调试的关键技能。抓包分析将抽象的网络概念转化为具体、可视的数据流,这种具象化的理解对于开发者和运维人员至关重要。

拓展建议:您可以尝试使用此方法分析更复杂的场景,例如浏览器加载一个完整网页时,是如何并发建立多个TCP连接以下载HTML、CSS、JavaScript和图片等资源的,这将有助于理解现代Web应用的网络性能特性。




上一篇:UART与PS/2通信协议详解:FPGA Verilog实现实战(上篇)
下一篇:Spring Cloud Feign首次调用延迟分析与Ribbon饥饿加载优化
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 13:08 , Processed in 0.368733 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表