传输控制协议(TCP) (3)

2008-02-22 12:36:59来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


序列号正在使用,不需要等待,但必须确认使用的序列号比当前使用的要大。
如果一台主机在未保留任何序列号的情况下失败,那么它应该在MSL时间之内不发出任何
数据段。下面将会这一情况进行说明。TCP的实现可以不遵守这个规定,但是这会造成老
数据被当成新数据接收,而新数据被当成老数据拒绝的情况。
每当数据段形成并进入输出队列,TCP会为它指定序列空间中的一个值。TCP中多复本检
测和序列算法都依赖于这个地址空间,在对方发送或接收之前不会超过2的32次方个包存
在于输出队列中。所有多余的数据段都会被删除。如果没有这个规定,会出现多个数据
段被指定同一个序列号的情况,会造成混乱。数据段中序列号的多少和数据段中的字节
数一样多。
在通常情况下,TCP保留下一个要发送的序列号和还未确认的最老的序列号,不要在没有
确认的时候就再次使用,这样会有些风险,也正是因为这样的目的,所以序列空间很大
。对于2M的网络,要4.5小时来耗尽序列空间,因为一个数据段可能的最大生存时间也不
过十几分之一秒,这就留下了足够的空间;而在100M的网络上需要5.4分钟,虽然少了点
,但也可以了。
如果在实现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状
态。
现实中的情况太多了,我们列举一些产生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),任何超出接收窗口的序列号的数据段都产生如下结果:发
出一个空确认数据段,此段中包括当前发送序列号,另外还包括一个确认指出希望接收
的下一个数据段的序列号,连接仍然保存在原来的状态。如果因为安全级,优先级之类

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:监视POP3邮箱

下一篇:PPPoA基准体系结构