tcp程序在收到RST或FIN后被动关闭tcp连接之前是否会检查丢失的数据包

tcp程序在收到RST或FIN后被动关闭tcp连接之前是否会检查丢失的数据包,tcp,network-programming,Tcp,Network Programming,如果a和B之间存在tcp连接, A发送一些数据包,然后发送TCP RST(或TCP FIN/ACK)以关闭连接, 让我说 PKT1, PKT2, PKT3, TCP_RST 或 但是包裹的到达是不正常的 PKT1, TCP_RST(or TCP_FIN/ACK), PKT2, PKT3 那么B会有什么反应 根据TCP_RST和TCP_FIN/ACK的序列号, B知道有一些数据包丢失(PKT2和PKT3), B是否会在关闭连接之前等待PKT2和PKT3, 或B在收到TCP\u

如果a和B之间存在tcp连接, A发送一些数据包,然后发送TCP RST(或TCP FIN/ACK)以关闭连接, 让我说

     PKT1, PKT2, PKT3, TCP_RST

但是包裹的到达是不正常的

    PKT1, TCP_RST(or TCP_FIN/ACK), PKT2, PKT3
那么B会有什么反应

根据TCP_RST和TCP_FIN/ACK的序列号, B知道有一些数据包丢失(PKT2和PKT3), B是否会在关闭连接之前等待PKT2和PKT3, 或B在收到TCP\u RST(或TCP\u FIN/ACK)时立即关闭连接


谢谢

TCP协议将对数据包重新排序,然后再将其发送到堆栈的更高位置。这意味着它将根据序列号等待无序数据包,如果需要,请求重新传输,等等,并在关闭连接之前等待最后一次确认

您可以在此处找到TCP状态图:
TCP保证顺序。这包括EOS的序列。它必须在所有数据之后交付。

我不明白你的意思。什么是EOS?必须交付什么?问题是如果RST或FIN/ACK在数据之前到达,“问题是如果RST或FIN/ACK在数据之前到达”无关紧要,B不会为A的FIN发送ACK,直到B拥有序列号告诉它应该拥有的所有数据。EOS是流的结束。它是由传入的
FIN
引起的,显示为
recv()
返回零。直到
recv()
首先读取了所有数据,才会发生这种情况。但是,传入的
RST
会导致任何挂起数据的丢失,并显示为
recv()
返回-1,带有
errno==ECONNRESET
。因此,如果PKT2和PKT3丢失,由于A已经半关闭,A不会重新传输PKT2和PKT3,那么B仍将等待PKT2和PKT3,并忽略RST(或FIN/ACK)?即使A发送FIN,如果要求,它仍将向B发送重新传输。只有当FIN得到B的确认时,A才会关闭。当A和B都决定关闭连接,并且各自收到FIN数据包的确认时,套接字才会关闭。只是为了澄清一件事:如果A发送RST,则连接将立即重置,并发生数据丢失。这是一种可能干扰网络的攻击向量。但是在正常情况下,RST不会被发送。例如,当主机B重新启动并且A继续发送数据包时,就会发生这种情况。B然后可以发送RST数据包,因为它没有任何传入数据的上下文。如果它在正常情况下发生,则只有在它之前发送的FIN得到确认时才会发送。对不起,最后一个问题:如果B已经收到一些数据包,并且它们在接收缓冲区中(尚未发送到应用层)。此时,接收到重置数据包,B是否会丢弃接收缓冲区中的数据?是,在这种情况下,它会丢弃。RST将指示另一端出了问题,现在缓冲区中的任何数据都是无关的。这就是为什么在网络中,如果您可以制造错误的RST数据包来中断正常的网络操作,那么这是一种有效的攻击。
    PKT1, TCP_RST(or TCP_FIN/ACK), PKT2, PKT3