☰
MQTT 连不上先看 TCP:三次握手、四次挥手和 RST 在 Wireshark 里长什么样
2026/10/15 4:08:39 网站建设 项目流程

副标题:有 IP 还上不了云时,先问 TCP 有没有 ESTABLISHED
专栏:《嵌入式学生的方案测试课》第 6 篇
前置:第 5 篇四层表,应用层已经走到「有 IP 无业务」
标签:嵌入式、TCP/IP、Wireshark、软件测试、MQTT
读者:会 AT 拿到 IP,Wireshark 可以刚装,还没对着包列表讲过握手
学完交什么:手绘握手/挥手、一张 SYN 截图(打码 IP)、故障对照表、一张「只有 SYN 没有 SYN-ACK」缺陷单
本篇先抓电脑自己的网页。板上 CIPSTART 是加分,不是门槛。


0. 这篇结束你能干什么

  1. 能手画三次握手和四次挥手,并指出 Wireshark 里 SYN、SYN-ACK、ACK、PSH、FIN、RST 各长什么样。
  2. 能把「MQTT 连不上」拆成:没 IP(回到第 5 篇)/ 有 IP 无 SYN-ACK / 有 TCP 无 CONNACK(CONNACK 留给第 10 篇)。
  3. 能解释 retransmission 和 RST 不是同一类失败:前者是路不好还在试,后者是被踢开或自己放弃。

笔试已经确认:TCP 和 UDP 都是传输层。面试会问全流程。方案测试里 MQTT、HTTP、RTSP 控制通道、iperf TCP 都骑在 TCP 上。不会握手,应用层缺陷单会写错层。


1. 为什么 MQTT 连不上要先看 TCP

打电话比喻:先拨通再说话,说完挂断。MQTT CONNECT 是接通之后的第一句话。电话没拨通,分析「你好」的发音没有意义。

农业终端上云路径:

GOT IP -> TCP 连 1883 或 8883 -> MQTT CONNECT -> CONNACK 0 -> PUBLISH / SUBSCRIBE / PING

学生常把整段叫「MQTT 失败」。分层后:

你看见停在哪
无 GOT IP第 5 篇 IP 层
有 IP,抓包一直 SYN,无 SYN-ACKTCP 连不上:路由、防火墙、DNS、服务器没开、端口错
三次握手完成,无 CONNACK 或 CONNACK 非 0MQTT 应用:密钥、ClientId、协议版本
有 CONNACK,心跳后 RST保活、弱网、中间盒,第 10 篇

本篇只把中间那一行练熟。TLS(8883)会在 TCP 之上再握一层,不要把 TLS ClientHello 当成 TCP SYN。


2. 最小原理

2.1 三次握手(连接)

  1. 客户端 -> 服务器:SYN,我的序号是 x
  2. 服务器 -> 客户端:SYN+ACK,我的序号是 y,确认 x+1
  3. 客户端 -> 服务器:ACK,确认 y+1

之后 ESTABLISHED,可以发数据。Wireshark Info 列常见[SYN]、[SYN, ACK]、[ACK]。

过滤:tcp.flags.syn==1能抓住前两步。第三步纯 ACK 要用 Follow TCP Stream 或看同一五元组。

2.2 通信

数据带 SEQ(这包从哪个字节开始)、ACK(我期望对方下一个字节)。窗口控制一次能发多少未确认数据。丢了会重传,Info 里出现[TCP Retransmission]。PSH 表示把数据尽快交给应用,MQTT/HTTP 常见PSH, ACK。

2.3 四次挥手(正常断开)

  1. 主动方 FIN
  2. 对方 ACK(它可能还有数据)
  3. 对方也 FIN
  4. 主动方 ACK

半关闭存在:一方已经 FIN,另一方仍可发。测试不要把「还有数据包」当成挥手失败。

2.4 RST:异常踢开

没走完挥手。弱网、进程崩溃、防火墙、端口没人听、应用直接 close 带 RST,都常见。RST 之后这条 TCP 死了。MQTT 若在 RST 后仍当连接活着,就会出现「本地以为在线、云端已踢」——应用层缺陷,证据却在 TCP。

2.5 UDP 一句就够(细节第 7 篇)

无握手、无挥手。本篇不要用 UDP 抓包来认 SYN。DNS 经常是 UDP,别和 TCP 握手截图搞混。


3. Wireshark 里怎么认(本篇最小点击)

第 8 篇才把安装和网卡讲透。本篇假设你能打开软件、选「正在上网的那块网卡」、点鲨鱼鳍。

  1. 过滤器先空,开始捕获。
  2. 浏览器打开任意网站(HTTPS 也行,我们只看 TCP 443 握手,不看明文)。
  3. 停止。过滤器:tcp.flags.syn==1。
  4. 点第一条 SYN,看详情树:Ethernet -> IPv4 -> TCP,Flags 里 SYN 置位。
  5. 右键 Follow -> TCP Stream。包列表被筛成这一条连接。找 SYN / SYN-ACK / ACK,再往后可能是 TLS。
  6. 清过滤器,改tcp.analysis.retransmission,看有没有重传。家里局域网可能很少。
  7. 捕获中途拔网线或杀掉浏览器,再找 RST 或超时重传。

你现在屏幕上应看到:Protocol 列是 TCP 或 TLSv1.2,不是802.11。这是网口。把这张图说成空口,第 8、9 篇会判翻车。

颜色:浅紫常见 SYN,黑红常见错误或 RST,具体主题可改,不要背颜色当结论,看 Flags。


4. 故障对照表(应用层上不了云时用)

抓包现象先查不要先查
没有任何 SYN设备有没有 IP、有没有发起连接、是否连错网卡抓包MQTT 主题
只有 SYN,无 SYN-ACK对端 IP/端口、防火墙、路由、服务器进程、DNS 是否解析错射频天线(网关已 ping 通时)
握手完立刻 RST对端拒绝、端口策略、TLS 失败有时也伴随 RSTKeepAlive 参数
传输中大量 retransmission链路质量、弱网、发送窗口;可和第 12 篇打流一起看先改业务 JSON
正常 FIN 四次应用主动关,可能是正常下线当异常掉线
RST 在 PING 之后中间盒、broker 踢人、设备崩溃当作「没握手」

缺陷单范文:

标题:【TCP】GOT IP 后连云端 1883 只有 SYN 无 SYN-ACK(3/3) 环境:ENV-xx;已 ping 通网关;DNS 解析结果 ____ 步骤:设备上云;电脑热点拓扑抓包(第 8 篇拓扑,本篇若还不会,先抓电脑自己访问该 IP:1883 的对照) 期望:三次握手完成 实际:重复 SYN,无 SYN-ACK。串口已 GOT IP。 初步分层:IP/网络路径或对端端口,不是 MQTT 密钥(CONNECT 还没发出)。

电脑自己用Test-NetConnection ip -Port 1883或浏览器/MQTTX 对照:电脑也 SYN 无回应,锅不在模组协议栈。电脑能握手、板子不能,再查板子路由、DNS、源端口。一次一个变量。


5. 学生板:ESP8266 CIPSTART

基线:第 5 篇应用层已有 IP。

AT+CIPSTART="TCP","broker地址",1883

成功常见CONNECT和OK。失败常见ERROR、CLOSED。这只证明 TCP。真正 MQTT 要用后续CIPSEND发 CONNECT 报文,或透传模式,第 10 篇。

本篇作业不强制板子抓包。板上实验:CIPSTART 正确端口一次、错误端口一次(例如 1882),记录串口耗时。错误端口往往超时或 RST,用来体会「有 IP 无 SYN-ACK」的设备侧观感。

农业终端:连 IoTDA 1883/8883。8883 是 TCP+TLS,握手后还有证书。没证书日志时,先看 TCP 是否 ESTABLISHED。


6. 泰芯公开场景

打流AT+IPERF2、RTSP、MQTT 都先 TCP(iperf UDP 除外)。公开 SRRC 用 iperf,那是 ESTABLISHED 之后的持续数据,不是握手测试。AH 2.4 版有 IP 才能按 IP 对打;1.6 透传无模组 IP,握手发生在两边电脑上。TXW82x 图传:电脑连设备热点再打开 RTSP,TCP 连的是设备口,仍是网口视角。


7. 30 秒口径

TCP 先三次握手再传数据,结束四次挥手或 RST。
MQTT/HTTP 必须先 ESTABLISHED。
有 IP 上不了云:先看有没有 SYN-ACK,再看 CONNACK。
重传是路差还在试,RST 是被踢开。
我抓的是网口 TCP,不是空口 802.11。


8. 作业

labs/week06/ handshake.png # SYN/SYN-ACK/ACK,打码 IP flags.md # 六个标志各一句话 fault-table.md # 抄对照表,用自己的一次失败填一行 BUG-tcp.md board-cipstart.md # 可选

截图用箭头标三次包。Follow TCP Stream 窗口不要把二进制 TLS 当「握手明文」。


9. 自测题

  1. 第三步 ACK 为什么有时过滤器tcp.flags.syn==1看不到?
  2. TLS ClientHello 是第几次 TCP 握手?
  3. 只有 SYN 无 SYN-ACK,为什么不应先改 MQTT ClientId?
  4. RST 和 FIN 的产品含义差在哪?
  5. ping 通一定 TCP 能建吗?

答案:1. 第三步 SYN 位为 0。2. 不是 TCP 握手,是握手之后的应用数据(TLS)。3. CONNECT 还没发出。4. FIN 正常关,RST 异常中止。5. 不一定,ICMP 通不保证端口开、防火墙放行。


10. 翻车与下一篇

翻车:把 TLS 当 TCP 握手;把应用断开说成四次挥手已完成;网口截图当空口。

第 7 篇:《UDP 没有连接过程:图传卡顿为什么不能按 MQTT 那套测》。ping 通、MQTT 偶发几包,测不出图传。要用 UDP 打流看丢包和抖动。

(第 6 篇完)


11. 五元组、状态和你在 Wireshark 里该圈的字段

一条 TCP 连接用五元组标识:源 IP、源端口、目的 IP、目的端口、协议。Follow TCP Stream 其实就是按这个把会话抽出来。

详情树里圈这些即可,不必背全部选项:

字段握手时你应看到
Src Port / Dst Port客户端临时端口 -> 1883 或 443 或 80
Seq / Ack第二次 Ack = 第一次 Seq+1(相对序号模式下显示 1)
FlagsSYN;SYN,ACK;ACK
Window非 0;变成 0 要另说窗口关了
Expertretransmission / duplicate ACK / RST

Wireshark 默认相对序号,所以你看见 Seq=0、Seq=1,不是协议真从 0 开始。报告写「相对序号」以免和开发对日志打架。


12. 电脑对照:证明锅不在模组

设备只有 SYN 时,先让电脑当客户端:

# Windows PowerShell Test-NetConnection 192.168.x.x -Port 1883

或 MQTTX 连同一个 IP:端口。电脑也失败:对端、防火墙、路由。电脑成功、设备失败:设备 DNS、默认路由、源地址、lwIP。一次只改设备或只改电脑。

农业终端连 IoTDA:先在电脑 MQTTX 用同一套证书/密钥(仅实验室账号)证明云活着,再上板。云挂了不要报芯片。


13. 合格会话

网口,非空口 浏览器 443:SYN / SYN-ACK / ACK,随后 TLS 过滤器 tcp.flags.syn==1 两条;第三步在 Follow 里 拔网线:retransmission,无 MQTT 字段(本篇不要求) CIPSTART 错误端口:串口 ERROR/超时(可选)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询