我有两台服务器,我使用自己的带有 LwIP 的嵌入式系统来连接这些服务器。
我的带有 LwIP 的嵌入式系统是客户端,我有服务器 1 和服务器 2。我连接到服务器 1 并在连接到服务器 2 之前结束连接。
进一步细分流程:
- 客户端与服务器 1 创建新的套接字
- 客户端发送 DNS 数据包以获取服务器 1 的 IP 地址;收到来自 AP 的 ACK
- 客户端发送TCP SYN数据包;
- Server1 发送 TCP SYN-ACK 并执行一些数据传输
- 客户端通过发送 TCP RST 数据包结束与服务器 1 的连接;并关闭套接字
- 客户端与服务器2创建新的套接字
- 客户端发送 DNS 数据包以获取服务器 2 的 IP 地址;收到来自 AP 的 ACK
- 客户端向服务器2发送TCP SYN数据包
- Server2 发送 TCP SYN-ACK 并执行一些数据传输
- 客户端通过发送 TCP RST 数据包结束与服务器 2 的连接;并关闭套接字
但是,有时 server2 没有响应客户端的 SYN 数据包(步骤 9)。这种情况只会偶尔发生。我查看了几个论坛,例如:
[1]为什么服务器不会发送 SYN/ACK 数据包来响应 SYN 数据包
[2]服务器未发送 SYN/ACK 数据包来响应 SYN 数据包
我的代码没有启用窗口缩放。我无法检查服务器,因为它是私人服务器,所以我不确定它是否被丢弃。我的环境非常嘈杂,而且有很多路由器和通信设备。这个问题只发生在嘈杂的环境中,而不会发生在干净的环境中。
作为客户我应该怎么做才能解决这个问题?
答案1
关于为什么有时你的服务器不以 SYN-ACK 应答的一些想法:
- 发送 SYN 数据包时,服务器上的应用程序停止:这可能会导致崩溃,然后通过程序的自动重启机制设法再次运行。当服务器应用程序停止或崩溃时,tcp 监听套接字会关闭,因此操作系统不会响应。
- 您的服务器在找回客户端时遇到了一些麻烦。这可能是路由问题或非对称路由(这会破坏防火墙)。
- 如果客户端和服务器在同一个网络上,这可能是第 2 层问题,如生成树协议或 ARP。
- 网络中的数据包丢失:您的 SYN 或 SYN ACK 数据包被丢弃。
- 服务器不堪重负,有时无法回答您的 SYN 数据包。
可能有大量的事情导致服务器不应答 SYN 数据包。
我将要做的 :
- 在服务器上执行一些 tcpdump 来验证网络:服务器是否收到 SYN 数据包,或者网络事先是否存在问题?服务器是否生成并发送 SYN ACK 数据包?然后从那里开始工作。
- 如果您无法访问服务器,请在最近的路由器/防火墙上执行相同的操作。
- 联系有权访问该服务器的人员。