【问题标题】:TCP: Server sends [RST, ACK] immediately after receiving [SYN] from ClientTCP:服务器从客户端收到 [SYN] 后立即发送 [RST, ACK]
【发布时间】:2011-03-11 10:56:45
【问题描述】:

Host_A 尝试通过 TCP 向 Host_B 发送一些数据。 Host_B 正在侦听端口 8181。Host_A 和 Host_B 都是 Linux 机器(Red Hat Enterprise)。 TCP 层使用 Java NIO API 实现。

无论 Host_A 发送什么,Host_B 都无法接收。使用 WireShark 嗅探网络上的数据会产生以下日志:

1) Host_A (33253) > Host_B (8181):[SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=513413781 TSER=0 WS=7
2) Host_B (8181) > Host_A (33253): [RST, ACK] Seq=1 Ack=1 Win=0 Len=0

日志显示 Host_A 向 Host_B 发送 [SYN] 标志以建立连接。但不是 [SYN, ACK] Host_B 以 [RST, ACK] 进行响应,它重置/关闭连接。始终会观察到这种行为。

我想知道 TCP 侦听器在什么情况下会发送 [RST,ACK] 以响应 [SYN]?

【问题讨论】:

    标签: linux tcp nio redhat


    【解决方案1】:

    RST, ACK 表示端口已关闭。您确定 Host_B 正在侦听正确的 IP/接口吗?

    同时检查你的防火墙是否有 -j REJECT --reject-with tcp-reset

    【讨论】:

    • 谢谢埃里克。实际上,港口并没有关闭。但是发现8181端口绑定的是Host_B上的127.0.0.1而不是实际IP。看起来像 /etc/hosts 的错误配置。 Java 的 InetAddress.getByName() 是否更喜欢主机文件而不是 DNS?
    • 如果端口没有绑定你关心的IP,则关闭。打开的端口由元组 (dst_ip,port) 表示,您尝试连接到未绑定的端口。此外,地址解析的各种实现应按照/etc/nsswitch.conf 中指定的顺序运行。
    • 我也有同样的问题。我正在使用 seagull 工具,我在配置中提供了正确的 ip,但始终绑定在 127.0.0.1,我该怎么办?
    • RST 表示端口打开,没有人在监听。 No response 表示端口已关闭。为关闭的端口发送响应会泄露给攻击者的信息。
    • @EJP 在套接字编程术语中,open 表示某个端口正在接受数据包,而closed 表示数据包要么被拒绝(又名RST)要么被完全忽略,通常是由于到防火墙。在防火墙或系统管理员方面,可以使用您的定义。考虑到这是在 stackoverflow 上而不是在系统管理员 stackexchange 上提出的,我的回答使用了编程术语。
    【解决方案2】:

    发生在我身上是因为我没有在服务器c++程序中将sockaddr_in.sin_family设置为AF_INET。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2020-05-05
      • 1970-01-01
      • 2013-03-06
      • 2020-03-19
      相关资源
      最近更新 更多