TCP重置报文段(RST)
通常当发现一个到达的报文段对于相关连接而言是不正确的时,TCP就会发送一个重置报文段。总体上来说,重置报文段主要有以下几种场景:
1.针对不存端口的连接请求
当一个连接请求到达本地却没有相关进程在目的端口侦听时就会产生一个重置报文段。
2.终止一条连接
通常终止一条连接的正常方法是由通信一方发送一个FIN。这种方法有时也被称为有序释放。(因为FIN是在之前所有排队数据都已经发送后才被发送出去,通常不会出现丢失数据的情况)
而在任何时刻,我们都可以通过发送一个重置报文段RST替代FIN来终止一条连接。这种方式一般被称为终止释放。
终止一条连接的特点:
1)任何排队的数据都将被抛弃,一个重置报文段会被立即发送出去;
2)重置报文段的接收方会说明通信另一端采用了终止的方式而不是一次正常关闭
需要注意的是重置报文段不会令通信令一端做出任何响应,即它不会被确认。接收重置报文段的一端会终止连接并提供“连接被另一端重置”的错误提示。
3.半开(半关闭)连接,服务器重启后接收到命令
一般造成半开状态的情景有:1)通信一方的主机崩溃;2)某一台主机的电源被切断而不是被正常关闭。
在连接处于半开或半关闭状态时,服务器异常崩溃后重启,重新连接以太网并尝试从客户端向服务器发送新命令,由于重启之后服务器的TCP会丢失之前所有连接的记忆,此时TCP规定接收者将回复一个RST重置报文段作为响应。
4.时间等待错误(TIME-WAIT Assassination)
我们知道,在关闭连接流程,主动发起关闭者在发送了ACK之后,会进入TIME_WAIT状态。在这段时期,等待的TCP通常不需要做任何操作,它只需要维持当前状态直到2MSL的倒计时结束。然而,如果它在这段时期内接收到来自于这条连接的一些报文段,或是更加特殊的重置报文段,它将会被破坏(例如客户端收到某个报文,回复ACK,而此时服务器收到后没有关于该连接的任何信息,则会发送RST)。这即是时间等待错误。
一般可以设置在TIME_WAIT状态时忽略重置报文段一阻止这一问题。
|