Transmission Control Protocol, TCP 传输控制协议( 十 )


请注重:假定的最大数据段的生存时间为2分钟,这里人为指定为1分钟 。
假如下层是IP而且使用源地址路由,接口必须答应路由信息的通信 。这对建立连接和进行路由是十分重要的 。当然也可以不使用IP协议作为TCP的底层协议,但无论下层协议是什么,都必须提供源地址,目的地址和协议域,以及一些决定TCP长度的域,总之一句话,要能够提供类似于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" 。假如未指定外套接字,返回"error: 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一起的数据可以和SYN数据段一起发送,也可以在进入ESTABLISHED状态后发送 。假如没有空间接收请求,返回"error: insufficient resources",假如未指定外套接字,则返回"error: foreign socket unspecified" 。
SYN-SENT状态和SYN-RECEIVED时
在进入ESTABLISHED状态后将需要传送的数据加入队列 。假如队列已无空间,则返回"error: insufficient resources" 。
ESTABLISHED状态和CLOSE-WAIT状态
将缓冲区分段,发送缓冲区数据,并使它带有确认值RCV.NXT 。假如没有空间保存缓冲区,则返回"error: insufficient resources" 。假如设置了紧急标记,那么SND.UP

推荐阅读