TCP 传输控制协议( 三 )


TCP连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEIVE,
CLOSE,ABORT和STATUS;传送过来的数据段,非凡那些包括以下标记的数据段SYN,ACK
,RST和FIN;还有超时,上面所说的都会时TCP状态发生变化 。
 
下面的图表示了TCP状态的转换,但这图中没有包括错误的情况和错误处理,不要把这幅
图看成是总说明了 。
 
3.3. 序列号
请注重,我们在TCP连接中发送的字节都有一个序列号 。因为编了号,所以可以确认它们
的收到 。对序列号的确认是累积性的,也就是说,假如用户收到对X的确认信息,这表示
在X以前的数据(不包括X)都收到了 。在每个段中字节是这样安排的:第一个字节在包
头后面,按这个顺序排列 。我们需要认记实际的序列空间是有限的,虽然很大,但是还
是有限的,它的范围是0到2的32次方减1 。我想熟悉编程的一定知道为什么要在计算两个
段是不是相继的时候要使用2的32次方为模了 。TCP必须进行的序列号比较操作种类包括
以下几种:
(a) 决定一些发送了的但未确认的序列号;
(b) 决定所有的序列号都已经收到了;
(c) 决定下一个段中应该包括的序列号 。
对于发送的数据TCP要接收确认,处理确认时必须进行下面的比较操作:
SND.UNA = 最老的确认了的序列号;
SND.NXT = 下一个要发送的序列号;
SEG.ACK = 接收TCP的确认,接收TCP期待的下一个序列号;
SEG.SEQ = 一个数据段的第一个序列号;
SEG.LEN = 数据段中包括的字节数;
SEG.SEQ SEG.LEN-1 = 数据段的最后一个序列号 。
请注重下面的关系:
SND.UNA < SEG.ACK =< SND.NXT
假如一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了 。而在接收
数据时下面的比较操作是必须的:
RCV.NXT = 期待的序列号和接收窗口的最低沿;
RCV.NXT RCV.WND-1 = 最后一个序列号和接收窗口的最高沿;
SEG.SEQ = 接收到的第一个序列号;
SEG.SEQ SEG.LEN-1 = 接收到的最后一个序列号;
 
上面几个量有如下关系:
RCV.NXT =< SEG.SEQ < RCV.NXT RCV.WND 或 RCV.NXT =< SEG.SEQ SEG.LEN-1 < RCV.N
XT RCV.WND
测试的第一部分是检查数据段的开始部分是否在接收窗口中,第二部分是检查数据段的
结束部分是否也在接收窗口内;上面两个检查通过任何一个就说明它包括窗口要求的数
据 。实际中的情况会更复杂一些,因为有零窗口和零数据段长,因此我们有下面四种情
况:
段长度
接收窗口
测试
0
0
SEG.SEQ = RCV.NXT
0
>0
RCV.NXT =< SEG.SEQ < RCV.NXT RCV.WND
>0
0
不可接受
>0
>0
RCV.NXT =< SEG.SEQ < RCV.NXT RCV.WND或RCV.NXT =< SEG.SEQ SEG.LEN-1 < RCV.NX
T RCV.WND
请注重接收窗口的大小可以为零,在窗口为零时它只用来接收ACK信息,因此对于一个T
CP来说,它可以使用零大小窗口在发送数据的同时接收数据 。即使接收窗口的大小为零
,TCP必须处理所有接收到信息的RST和URG域 。
我们也应用计数的方式保护了一些特定的控制信息,这是通过隐式地使用一些控制标记
使数据段能够可靠地重新发送(或确认)为达到的 。控制信息并不在段数据空间中传送
,因此,我们必须采用隐式指定序列号进行控制 。SYN和FIN是需要保护的控制量,这两
个控制量也只在连接打开和关闭时使用 。SYN被认为是在第一个实际数据之间的数据,而
FIN是最后一个实际数据之后的数据 。段长度(SEG.LEN)包括数据和序列号空间,假如

推荐阅读