TCP 传输控制协议(11)


,要能够提供类似于IP的功能 。
3.9. 事件处理
下面说明的过程是可能的实现,其它实现和本例的过程可能有一点点不同,但只在细节
,而决不在结果 。TCP的活动可以总结为对事件的响应 。事件可以分为三类:用户调用,
接收数据段和超时 。下面描述的是TCP对具体事件的响应,在许多情况下,相关的动作(
响应)要和连接状态相关 。
用户调用的有:
OPEN
SEND
RECEIVE
CLOSE
ABORT
STATUS
接收数据段的有:
SEGMENT ARRIVES
超时的有:
USER TIMEOUT
RETRANSMISSION TIMEOUT
TIME-WAIT TIMEOUT
TCP对用户的响应可能是立即的也可能是延时的 。错误信息以字符串的形式给出 。下面就
是一个具体的错误信息:error: connection not open 。另外,请记住序列号空间大小
为2的32次方 。处理数据段的顺序为首先接收,再检查序列号,假如是要接收的就放入接
收队列 。另外,没有说明状态转移时,TCP保持原来的状态 。
OPEN调用
CLOSED状态
创建新的TCB保存连接状态信息,填充本地套接字标记,外套接字,优先级,security/
compartment和用户超时信息 。注重一部分外套接字在被动OPEN中可能未说明 。假如是主
动的,而外套接字未指定,返回"error: foreign socket unspecified";假如是主动的
,而外套接字指定了,发送一个SYN数据段 。选择初始发送序列号ISS 。SYN数据段的格式
如下,设置SND.UNA为ISS,SND.NXT为ISS 1,进行SYN-SENT状态,
然后返回 。
假如调用者不能访问指定的本地套接字,返回"error: connection illegal for this
process" 。假如没有空间接收新的连接,返回"error: insufficient resources" 。
LISTEN状态
假如处于主动状态,指定了外套接字,可以将连接从被动改为主动,并选择ISS 。发送一
个SYN数据段,设置SND.UNA为ISS,SND.NXT为ISS 1 。进入SYN-SENT状态 。和SEND一起的
数据可以和SYN数据段一起发送,也可以在进入ESTABLISHED状态后发送 。假如没有空间
接收请求,返回"error: insufficient resources" 。假如未指定外套接字,返回"erro
r: foreign socket unspecified" 。假如处于以下状态:SYN-SENT状态,SYN-RECEIVED
,ESTABLISHED状态,FIN-WAIT-1状态,FIN-WAIT-2状态,CLOSE-WAIT状态,CLOSING状
态,LAST-ACK状态或TIME-WAIT状态时返回"error: connection already exists" 。
SEND调用
CLOSED状态
假如用户无权访问连接,返回"error: connection illegal for this process" 。否则
返回"error: connection does not exist" 。
LISTEN状态
假如指定了外套接字,可以将连接从被被动改为主动,选择一个ISS 。发送SYN数据段,
设置SND.UNA为ISS,SND.NXT为ISS 1 。进入SYN-SENT状态 。和SEND一起的数据可以和SY
N数据段一起发送,也可以在进入ESTABLISHED状态后发送 。假如没有空间接收请求,返
回"error: insufficient resources",假如未指定外套接字,则返回"error: foreign
socket unspecified" 。
SYN-SENT状态和SYN-RECEIVED时
在进入ESTABLISHED状态后将需要传送的数据加入队列 。假如队列已无空间,则返回"er
ror: insufficient resources" 。
ESTABLISHED状态和CLOSE-WAIT状态
将缓冲区分段,发送缓冲区数据,并使它带有确认值RCV.NXT 。假如没有空间保存缓冲区
,则返回"error: insufficient resources" 。假如设置了紧急标记,那么SND.UP <- S
ND.NXT-1,并设置紧急指针指向发送数据段中的相应位置 。
在FIN-WAIT-1,FIN-WAIT-2,CLOSING,LAST-ACK和TIME-WAIT状态时返回"error: conn
ection closing",不理会请求 。

推荐阅读