TCP 传输控制协议( 五 )


,但也可以了 。
假如在实现TCP时没有为保存序列号留下空间,那清除多余的包可能就不能实现了,因此
推荐这种类型的TCP实现最好在失败后等待MSL时间,这样保证多余的包被删除 。这种情
况有时候也可能会出现在保留序列号的TCP实现中 。假如TCP在选择一个另一个TCP连接正
在使用的序列号时,这台主机忽然失败了,这就产生了问题 。这个问题的实质在于主机
不知道它失败了多久,也不知道多余的复本是不是还在网络中 。
处理这种问题的方法是等待MSL时间,假如不这样就要冒着对方错误接收数据的危险,要
等待的时间也就称为“沉默时间” 。实现者可以让用户选择是不是等待,但是无论用户
如何也不见得非要等待MSL时间 。
3.4. 建立一个连接
建立连接应用的是三消息握手 。假如双方同时都发送SYN也没有关系,双方会发现这个S
YN中没有确认,于是就知道了这种情况,通常来说,应该发送一个"reset"段来解决这种
情况 。三消息握手减少了连接失败的可能性 。下面就是一个例子,在尖括号是的就是数
据段中的内容和标记 。其它的就不多说了 。
在第2行,TCP A发送SYN初始化序列号,表示它要使用序列号100;第3行中,TCP B给出
确认,并且期待着A的带有序列号101的数据段;第4行,TCP A给出确认,而在第5行,它
也给出确认,并发送了一些数据,注重第4行的序列号与第5号的一样,因为ACK信息不占
用序列号空间内的序列号 。同时产生请求的情况如下图所示,只复杂一点 。
使用三消息握手的主要原因是为了防止使用过期的数据段 。为了这个目的,必须引入新
的控制消息,RESET 。假如接收TCP处理非同步状态,在接收到RESET后返回到LISTEN状态
。假如TCP处理下面几种状态ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CL
OSING,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状
态 。

推荐阅读