TCP 传输控制协议( 六 )


现实中的情况太多了,我们列举一些产生RST控制信息的规则如下:通常情况下,RST在
收到的信息不是期待的信息时产生 。假如在不能确定时不要轻易发送RST控制信息 。下面
有三类情况:
假如连接已经不存在,而发送来的消息又不是RST,那么要返回RST 。假如想拒绝对不存
在的连接进行SYN,可以使用这种办法 。假如到达的信息有一个ACK域,返回的RST信息可
以从ACK域中取得序列号,假如没有这个域,就把RST的序列号设置为0,ACK域被设备为
序列号和到达段长度之和 。连接仍然处于CLOSE状态 。
假如连接处于非同步状态(LISTEN,SYN-SENT,SYN-RECEIVED),而且收到的确认是对
未发出包的确认或是接收到数据段的安全级别与不能连接要求的相一一致时,就发送RS
T 。假如SYN未被确认时,而且收到的数据段的优先级比要求的优先级要高,那么要么提
高本地优先级(得事先征得用户和系统的许可)要么发送RST;假如接收数据段的优先级
比要求的优先级低,就算是匹配了,当然假如对方发现优先级不对提高了优先级,在下
一个包中提高了优先级,这就不算是匹配了 。假如连接已经进入SYN,那么接收到数据段
的优先级必须和本地优先级一样,否则发送RST 。假如到达的信息有一个ACK域,返回的
RST信息可以从ACK域中取得序列号,假如没有这个域,就把RST的序列号设置为0,ACK域
被设备为序列号和到达段长度之和 。连接仍然处于与原来相同的状态 。
假如连接处于同步状态(ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSI
NG,LAST-ACK,TIME-WAIT),任何超出接收窗口的序列号的数据段都产生如下结果:发
出一个空确认数据段,此段中包括当前发送序列号,另外还包括一个确认指出希望接收
的下一个数据段的序列号,连接仍然保存在原来的状态 。假如因为安全级,优先级之类
的问题,那就发送RST信号然后进入CLOSED状态 。
RST过程
除了SYN-SENT状态外的其它状态中,所有的RST数据段可以通过检查SEQ域查明 。假如序
列号在接收窗口中,RST是有效的 。当连接处于SYN-SENT状态时,假如ACK域确认SYN,那
么RST也是合法的 。
RST的接收方首先确认它的合法性,然后进行状态转换 。假如接收方处于LISTEN状态,它
就忽略RST包 。假如接收方处于SYN-RECEIVED状态,而且以前处于LISTEN状态,接收方返
回LISTEN状态,否则接收方关闭连接进入CLOSED状态 。当接收方处于其它状态时,直接
关闭连接回到CLOSED状态 。
 
3.5. 关闭连接
CLOSE是一个操作,它的意思就是“本方已经有数据发送” 。由于是全双工的,所以会造
成一些麻烦,因为接收方对于处理接收方的连接有点麻烦 。我们以一种简单的方式对待
CLOSE,发送CLOSE的一方在接收到对方的CLOSED之前,还要继续接收数据 。因此程序可
以在一个CLOSE之后初始化几个SEND,然后开始RECEIVE,直到接收到对方的CLOSED而RE
CEIVE失败为止 。我们假设TCP可以通知用户连接关闭,即使仍在RECEIVE也可以,这样用
户就可以正常关闭了 。这样,TCP可以在连接关闭前可靠地发送数据 。下面列举了三种基
本情况:
情况1:本地用户关闭
这种情况下,可以建立一个FIN段放入发送队列 。TCP不再接收用户的SEND指令,TCP进入
FIN-WAIT-1状态 。RECEIVE在这种状态下是答应的 。所有数据段和FIN在未接收到确认以
前会一直发送 。当另一个TCP确认FIN,并发送自己的FIN后,本地的TCP可以确认这个FI

推荐阅读