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

Riy*_*yaz 21 linux redhat nio tcp

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]?

Eri*_*rik 35

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

还要检查防火墙是否有-j REJECT --reject-with tcp-reset

  • 谢谢Erik.实际上港口没有关闭.但是发现端口8181在Host_B上绑定到127.0.0.1而不是实际的IP.看起来像是/ etc/hosts的配置错误.Java的InetAddress.getByName()是否更喜欢DNS上的主机文件? (5认同)
  • 如果端口未绑定到您关心的IP,则它将关闭.开放端口由元组(dst_ip,port)表示,并且您尝试连接到未绑定的端口.此外,地址解析的各种实现应按照`/ etc/nsswitch.conf`中指定的顺序运行. (2认同)
  • @EJP用套接字编程术语来说,“ open”表示某个端口上正在接受某些数据包,而“ closed”表示通常由于防火墙而被拒绝(也称为“ RST”)或被完全忽略。用防火墙或系统管理员的术语,可以使用您的定义。考虑到这是在stackoverflow而不是在sysadmin stackexchange上提出的,我的答案使用编程术语。 (2认同)