连接期间RST重置TCP连接()

连接期间RST重置TCP连接(),c,sockets,tcp,C,Sockets,Tcp,在connect()期间,RST重置TCP连接 许多客户端连接到服务器并发送数据。 在根据我用tcpdump捕获的数据包发送三方握手的最后一个ACK之前,客户端发送一个带有数据的[PSH,ACK] 它导致通过服务器端发送rst无延迟选项。 从数据包来看,除了RST阻塞包外,数据包看起来非常正常 起初,我怀疑防火墙或黑客可以通过其他方式获取源端口。RST攻击是可能的,但客户表示没有防火墙,这台机器运行客户端和服务器程序 此外,这个问题很难重现,可能需要几周或更长时间。它偶尔会收到这样的数据包,并导

connect()
期间,RST重置TCP连接

许多客户端连接到服务器并发送数据。 在根据我用tcpdump捕获的数据包发送三方握手的最后一个ACK之前,客户端发送一个带有数据的[PSH,ACK]

它导致通过服务器端发送rst<使用代码>无延迟选项。 从数据包来看,除了RST阻塞包外,数据包看起来非常正常

起初,我怀疑防火墙或黑客可以通过其他方式获取源端口。RST攻击是可能的,但客户表示没有防火墙,这台机器运行客户端和服务器程序

此外,这个问题很难重现,可能需要几周或更长时间。它偶尔会收到这样的数据包,并导致连接失败

连接代码:

do
{
r1=连接(socketfd,addr->ai_addr,addr->ai_addrlen);
}而(r1<0&&errno==EINTR);
如果(设置锁定选项)(socketfd、IPPROTO_TCP、TCP_NODELAY、,
&选项_值,选项_len)!=0{}
谁知道可能的原因是什么?请参见下面的cap:

错误包:

普通包装:
谢谢。

你应该考虑重置是由防火墙或其他对连接不满意的安全应用程序“伪造”的可能性。注意,在“错误包”捕获中,第一次重置之后是与PSH一起发送的数据的ack,ack帧,并且随后是具有有效负载的帧。如果这是TCP堆栈处理的数据包的实际顺序,则这与本地TCP堆栈发送的RST不兼容。TCP堆栈不会重置连接,然后继续ackowledge并发送数据。此外,完成三方握手的ACK与PSH、ACK数据包和有效负载不符,这是一个有趣的边缘情况。我不清楚在没有第2层的linux上,这种情况是如何在环回上发生的;数据包被直接传递到tcp堆栈。我知道windows在环回上有一个第二层,但不知道数据包是否会无序到达。我们已经确认没有防火墙。这个地方真的很奇怪,TCP堆栈在重置连接后继续确认并发送数据。但是,如果三方握手不成功,psh数据包会导致服务器发送rst吗?正如您所说,这台机器上没有第2层,linux代码实现环回。但在正常情况下,psh包总是在ack之后。因此,如果您使用linux,我猜这是一个与通过环回传递TCP数据包有关的错误。客户端发送SYN,服务器发送SYN,ACK。然后客户端应该确认。ack应该传递到SYN队列中的套接字。然后,客户端应用程序发送一些数据。带有PSH、ACK的数据包被发送到服务器。我猜一些时间问题+一些错误意味着PSH,ACK数据包首先被传递,并且它找不到套接字,所以TCP堆栈发送重置,因为没有监听套接字。1/2