网络协议分析工具真能抓TCP包?手把手教你用Wireshark看三次握手

你在公司改完服务器配置,网页死活打不开;在家连游戏老掉线,ping又显示通;或者写个小程序,客户端连不上服务端——这时候,很多人第一反应是“ref="/tag/72/" style="color:#EB6E00;font-weight:bold;">网络出问题了”,但到底哪一层出的问题?

TCP不是黑盒子,它是能被看见的

TCP(传输控制协议)不是藏在系统底层的神秘代码,它每发一个SYN、ACK、FIN,都会变成实实在在的数据,在网卡上跑过。只要工具够硬、权限到位,你完全能把它揪出来看个明白。

主流网络协议分析工具全支持TCP

Wireshark、Tcpdump、Microsoft Message Analyzer(已停更但旧版仍可用)、甚至 macOS 自带的 packet capture 框架,都原生支持TCP协议解析。它们不只是“能抓”,而是能把TCP头部字段逐字展开:源端口、目的端口、序列号、确认号、标志位(SYN/ACK/FIN/RST)、窗口大小、校验和……全给你标得清清楚楚。

举个真实例子:网页打不开,先看TCP连没连上

打开Wireshark,选对网卡,输入过滤条件:

tcp port 80 and host example.com
然后访问 example.com。如果看到一连串 SYN → SYN-ACK → ACK,说明三次握手成功;如果只看到 SYN,没回音,那大概率是防火墙拦了、目标端口关了,或者中间路由丢了包。

再比如:程序连不上本地服务

你写了个Python服务监听 127.0.0.1:8080,但curl死活连不上。抓包时加个过滤:

tcp and (ip.src == 127.0.0.1 or ip.dst == 127.0.0.1)
一看发现只有SYN,没SYN-ACK——立马知道:服务根本没起来,或者绑定错了地址(比如绑了192.168.1.100却用localhost连)。

注意两个实操细节

一是权限:Wireshark在Windows要以管理员运行,Linux/macOS需sudo或加入wireshark用户组,否则抓不到TCP层原始帧;
二是过滤别写错:写成 tcp.port == 80 是对的,但写成 tcp.port = 80(少个等号)就啥也看不到——Wireshark语法很较真。

不光能看,还能“演”

Wireshark自带的“Follow TCP Stream”功能,点一下就能把某次TCP会话的所有数据拼成可读文本流。HTTP请求头、JSON响应、甚至Telnet交互内容,直接展现在眼前,不用自己按序号拼包。

小提醒:别被“协议分析”四个字吓住

它不像编译器那么复杂。你不需要懂RFC文档全文,只要记住三个关键帧:SYN(我要连你)、SYN-ACK(好,我同意)、ACK(收到,开始传数据)。剩下的,交给工具高亮、排序、过滤——你只管盯结果。