副标题:有 IP 还上不了云时,先问 TCP 有没有 ESTABLISHED
专栏:《嵌入式学生的方案测试课》第 6 篇
前置:第 5 篇四层表,应用层已经走到「有 IP 无业务」
标签:嵌入式、TCP/IP、Wireshark、软件测试、MQTT
读者:会 AT 拿到 IP,Wireshark 可以刚装,还没对着包列表讲过握手
学完交什么:手绘握手/挥手、一张 SYN 截图(打码 IP)、故障对照表、一张「只有 SYN 没有 SYN-ACK」缺陷单
本篇先抓电脑自己的网页。板上 CIPSTART 是加分,不是门槛。
0. 这篇结束你能干什么
- 能手画三次握手和四次挥手,并指出 Wireshark 里 SYN、SYN-ACK、ACK、PSH、FIN、RST 各长什么样。
- 能把「MQTT 连不上」拆成:没 IP(回到第 5 篇)/ 有 IP 无 SYN-ACK / 有 TCP 无 CONNACK(CONNACK 留给第 10 篇)。
- 能解释 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-ACK | TCP 连不上:路由、防火墙、DNS、服务器没开、端口错 |
| 三次握手完成,无 CONNACK 或 CONNACK 非 0 | MQTT 应用:密钥、ClientId、协议版本 |
| 有 CONNACK,心跳后 RST | 保活、弱网、中间盒,第 10 篇 |
本篇只把中间那一行练熟。TLS(8883)会在 TCP 之上再握一层,不要把 TLS ClientHello 当成 TCP SYN。
2. 最小原理
2.1 三次握手(连接)
- 客户端 -> 服务器:SYN,我的序号是 x
- 服务器 -> 客户端:SYN+ACK,我的序号是 y,确认 x+1
- 客户端 -> 服务器: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 四次挥手(正常断开)
- 主动方 FIN
- 对方 ACK(它可能还有数据)
- 对方也 FIN
- 主动方 ACK
半关闭存在:一方已经 FIN,另一方仍可发。测试不要把「还有数据包」当成挥手失败。
2.4 RST:异常踢开
没走完挥手。弱网、进程崩溃、防火墙、端口没人听、应用直接 close 带 RST,都常见。RST 之后这条 TCP 死了。MQTT 若在 RST 后仍当连接活着,就会出现「本地以为在线、云端已踢」——应用层缺陷,证据却在 TCP。
2.5 UDP 一句就够(细节第 7 篇)
无握手、无挥手。本篇不要用 UDP 抓包来认 SYN。DNS 经常是 UDP,别和 TCP 握手截图搞混。
3. Wireshark 里怎么认(本篇最小点击)
第 8 篇才把安装和网卡讲透。本篇假设你能打开软件、选「正在上网的那块网卡」、点鲨鱼鳍。
- 过滤器先空,开始捕获。
- 浏览器打开任意网站(HTTPS 也行,我们只看 TCP 443 握手,不看明文)。
- 停止。过滤器:
tcp.flags.syn==1。 - 点第一条 SYN,看详情树:Ethernet -> IPv4 -> TCP,Flags 里 SYN 置位。
- 右键 Follow -> TCP Stream。包列表被筛成这一条连接。找 SYN / SYN-ACK / ACK,再往后可能是 TLS。
- 清过滤器,改
tcp.analysis.retransmission,看有没有重传。家里局域网可能很少。 - 捕获中途拔网线或杀掉浏览器,再找 RST 或超时重传。
你现在屏幕上应看到:Protocol 列是 TCP 或 TLSv1.2,不是802.11。这是网口。把这张图说成空口,第 8、9 篇会判翻车。
颜色:浅紫常见 SYN,黑红常见错误或 RST,具体主题可改,不要背颜色当结论,看 Flags。
4. 故障对照表(应用层上不了云时用)
| 抓包现象 | 先查 | 不要先查 |
|---|---|---|
| 没有任何 SYN | 设备有没有 IP、有没有发起连接、是否连错网卡抓包 | MQTT 主题 |
| 只有 SYN,无 SYN-ACK | 对端 IP/端口、防火墙、路由、服务器进程、DNS 是否解析错 | 射频天线(网关已 ping 通时) |
| 握手完立刻 RST | 对端拒绝、端口策略、TLS 失败有时也伴随 RST | KeepAlive 参数 |
| 传输中大量 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. 自测题
- 第三步 ACK 为什么有时过滤器
tcp.flags.syn==1看不到? - TLS ClientHello 是第几次 TCP 握手?
- 只有 SYN 无 SYN-ACK,为什么不应先改 MQTT ClientId?
- RST 和 FIN 的产品含义差在哪?
- 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) |
| Flags | SYN;SYN,ACK;ACK |
| Window | 非 0;变成 0 要另说窗口关了 |
| Expert | retransmission / 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/超时(可选)