如果我的套接字已连接且未关闭,为什么我要发送 RST?

2024-01-06

我有一个 Android 设备,它使用 java.net.Socket 与 PC 进行无线通信。一切都很好,但如果我在 1 分钟内什么都不做(即没有使用网络),那么当 Android 向 PC 发送数据包时,PC 会收到它并发送 ACK,但 Android 会用 RST 进行响应。

来自 Wireshark(10.1.2.1 是 Android,10.1.2.11 是 PC)...

356 0.112470 10.1.2.1 10.1.2.11 TCP 97 34360→181 [PSH,ACK] 序列=1 Ack=1 Win=4935 Len=31 TSval=156103571 TSecr=320673352

359 0.000011 10.1.2.11 10.1.2.1 TCP 66 181→34360 [ACK] 序列=1 确认=32 赢=260 伦=0 TSval=320738236 TSecr=156103571

360 0.000304 10.1.2.1 10.1.2.11 TCP 60 34360→181 [RST] Seq=32 Win=0 长度=0

此时,如果我询问套接字的成员变量,它会说。 。 。

  • 已连接 = true
  • 已创建 = true
  • isInputShutdown = false
  • 输出关闭 = false
  • 已关闭 = false
  • 已绑定 = true

...看起来我应该仍然可以正常接收数据包。那么我如何弄清楚为什么我要发送 RST?

N.B.- 此设备上没有启用“睡眠”或关闭 WiFi 或显示器或任何其他省电功能设置的设置。


1分钟的延迟看起来像是超时。这可能是SO_TIMEOUT但这本身不会产生网络活动。此外,最后发送的数据包包含 31 字节的数据这一事实似乎表明涉及应用程序。一种可能的情况是:

  • Android 应用程序超时(自行超时或由套接字触发)SO_TIMEOUT)
  • 它发送最后一个数据块,例如通过刷新输出流。
  • 它突然关闭套接字,例如通过使用setSoLinger(true, 0)套接字选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果我的套接字已连接且未关闭,为什么我要发送 RST? 的相关文章

随机推荐