使用三消息握手的主要原因是为了防止使用过期的数据段 。为了这个目的,必须引入新的控制消息,RESET 。假如接收TCP处理非同步状态,在接收到RESET后返回到LISTEN状态 。假如TCP处理下面几种状态ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT时,放弃连接并通过用户 。我们下面就具体说明后一种情况 。
通过上面的例子,我们可以看出TCP连接是如何从过期数据段的干扰下恢复的 。请注重第4行和第5行中的RST(RESET信号) 。
半开连接和其它非正常状态
假如一方在未通过另一方的情况下关闭连接,或双方虽然失败而不同步的情况我们称为半开连接状态 。在一方试图发送数据时连接会自动RESET 。然而这种情况究竟属于不正常情况 。应该做出相应的处理 。假如A处的连接已经关闭,B处并不知道 。当B希望发送数据到A时,就会收到RESET信号,表示这个TCP连接有误,要中止当前连接 。
假设A和B两个进程相互通信的时候A的TCP发生了失败,A依靠操作系统支持TCP的存在,通常这种情况下会有恢复机制起作用,当TCP重新恢复的时候,A可能希望从恢复点开始工作 。这样A可能会试图OPEN连接,然后在这个它认为还是打开的连接上传送数据,这时A会从本地(也就是A的)TCP上获得错误消息“未打开连接” 。A的TCP将发送包括SYN的数据段 。下面的例子将显示这一过程:
上面这个例子中,A方收到的信息并没有确认任何东西,这时候A发现出了问题,于是发送了RST控制信息 。另一种情况是发生在A失败,而B方仍然试图发送数据时,下面的例子可以表示这种情况,请注重第2行中A对B发送来的信息不知所云 。
在下面的例子中,A方和B方进行的被动连接,它们都在等待SYN信息 。过期的包传送到B方使B回应了,而收到回应的A却发现不对头,传送RST控制信息,B方返回被动LISTEN状态 。
现实中的情况太多了,我们列举一些产生RST控制信息的规则如下:通常情况下,RST在收到的信息不是期待的信息时产生 。假如在不能确定时不要轻易发送RST控制信息 。下面有三类情况:
假如连接已经不存在,而发送来的消息又不是RST,那么要返回RST 。假如想拒绝对不存在的连接进行SYN,可以使用这种办法 。假如到达的信息有一个ACK域,返回的RST信息可以从ACK域中取得序列号,假如没有这个域,就把RST的序列号设置为0,ACK域被设备为序列号和到达段长度之和 。连接仍然处于CLOSE状态 。
假如连接处于非同步状态(LISTEN,SYN-SENT,SYN-RECEIVED),而且收到的确认是对未发出包的确认或是接收到数据段的安全级别与不能连接要求的相一一致时,就发送RST 。假如SYN未被确认时,而且收到的数据段的优先级比要求的优先级要高,那么要么提高本地优先级(得事先征得用户和系统的许可)要么发送RST;假如接收数据段的优先级比要求的优先级低,就算是匹配了,当然假如对方发现优先级不对提高了优先级,在下一个包中提高了优先级,这就不算是匹配了 。假如连接已经进入SYN,那么接收到数据段的优先级必须和本地优先级一样,否则发送RST 。假如到达的信息有一个ACK域,返回的RST信息可以从ACK域中取得序列号,假如没有这个域,就把RST的序列号设置为0,ACK域被设备为序列号和到达段长度之和 。连接仍然处于与原来相同的状态 。
假如连接处于同步状态(ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT),任何超出接收窗口的序列号的数据段都产生如下结果:发出一个空确认数据段,此段中包括当前发送序列号,另外还包括一个确认指出希望接收的下一个数据段的序列号,连接仍然保存在原来的状态 。假如因为安全级,优先级之类的问题,那就发送RST信号然后进入CLOSED状态 。
推荐阅读
- Wireless Application Protocol WAP-无线应用协议
- Internet Protocol Internet协议
- BOOTP:Bootstrap Protocol 应用层BOOTP:引导协议
- IP的概念及实质
- Session Initial Protocol SIP介绍
- NetControl 局域网连通状态动态监控
- Ubuntu安装Transmission
- Total Control怎么连接手机
- 控制Control免费怎么领 控制Control免费领取方法一览
- 控制游戏免费领取方法介绍 control免费送