TCP:服务器在收到客户端的[SYN]后立即发送[RST,ACK]。

30

Host_A 试图通过 TCP 向 Host_B 发送一些数据。Host_B 在端口 8181 上进行监听。两台主机都是 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 发送了一个 [SYN] 标志给 Host_B,以建立连接。但是,Host_B 没有回复 [SYN, ACK],而是发回了 [RST, ACK],从而重置/关闭连接。这种行为总是被观察到。

我想知道在何种情况下 TCP 监听程序会对 [SYN] 发送 [RST, ACK] 响应?

2个回答

48

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

还要检查您的防火墙是否具有“-j REJECT --reject-with tcp-reset”选项。


6
谢谢Erik。实际上端口没有关闭。但是发现在Host_B上,端口8181绑定到127.0.0.1而不是实际IP地址。看起来是/etc/hosts的错误配置。Java的InetAddress.getByName()方法是否优先使用hosts文件而非DNS? - Riyaz
2
如果端口未绑定到您关心的IP,则它将关闭。打开的端口由元组(dst_ip,port)表示,并且您正在尝试连接到未绑定的端口。此外,地址解析的各种实现应按照“/etc/nsswitch.conf”中指定的顺序进行操作。 - Nick Bastin
1
RST表示端口是开放的,但没有人在监听。无响应表示端口已关闭。对于关闭的端口发送响应将会向攻击者泄露信息。 - user207421
3
在套接字编程中,“open”表示某个端口正在接收数据包,而“closed”则表示数据包要么被拒绝(也称为“RST”),要么完全被忽略,通常是由于防火墙的原因。对于防火墙或系统管理员来说,您提供的定义是可行的。考虑到这个问题是在stackoverflow上提出的,而不是在系统管理员的stackexchange上,我的回答使用了编程术语。 - Erik
@Eric 套接字编程是关于套接字,而不是端口。开放的端口是防火墙术语。开放的套接字可能意味着未连接的套接字、监听套接字、已连接的套接字或应用程序尚未关闭的遇到致命错误的套接字。它并不仅仅指一个开放的监听端口。在套接字编程术语中,关闭的端口已经不存在了,而不仅仅是被“关闭”。你的答案使用的是防火墙术语,而不是套接字编程术语。 - user207421
显示剩余2条评论

0

这种情况发生在我的服务器C++程序中,因为我没有将sockaddr_in.sin_family设置为AF_INET


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接