| 分类: 电子书籍 |
TCP和下层接口
TCP实际上调用下层服务才能在网络上传输数据,在互联网上我们通常认为TCP的下层是IP协议。如果下层是IP层,它提供一些类于服务类型和生存时间的参数。TCP使用这些参数的如下设置:
Type of Service = Precedence: routine, Delay: normal, Throughput: normal, Reliability: normal;或是数字00000000。
Time to Live = 一分钟,或是数字00111100。
请注意:假定的最大数据段的生存时间为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数据段的格式如下<SEQ=ISS><CTL=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 <- SND.NXT-1,并设置紧急指针指向发送数据段中的相应位置。
在FIN-WAIT-1,FIN-WAIT-2,CLOSING,LAST-ACK和TIME-WAIT状态时返回"error: connection closing",不理会请求。
RECEIVE调用
CLOSED状态
如果用户没有权利访问这个连接,返回"error: connection illegal for this process"。如果有权利,则返回"error: connection does not exist"。
在LISTEN,SYN-SENT和SYN-RECEIVED状态下
在进入ESTABLISHED状态后,将数据放入队列准备处理。如果队列中没有空间,返回"error: insufficient resources"。
在ESTABLISHED,FIN-WAIT-1和FIN-WAIT-2状态下
如果没有接收到足够的数据段满足请求,将请求放入队列。如果队列中没有空间记录RECEIVE,返回"error: insufficient resources"。重新将接收数据段放入接收缓冲区,并返回给用户。在这种情况下,可以设置PUSH标记。如果RCV.UP比现在传送给用户的要大,通知用户有紧急数据。
CLOSE-WAIT状态
因为远方TCP已经发送了FIN,RECEIVE必须由现在在缓冲区但还未传送给用户的数据满足。如果没有数据了,RECEIVE会得到"error: connection closing"的响应。
在CLOSING,LAST-ACK和TIME-WAIT状态下返回"error: connection closing".
CLOSE 调用
CLOSED状态
如果用户没有权利访问这个连接,返回"error: connection illegal for this process"。如果有权利,则返回"error: connection does not exist"。
LISTEN状态
存在着的任何RECEIVE都会返回"error: closing"的响应。删除TCB,然后进入CLOSED状态并返回。
SYN-SENT状态
删除TCB并返回"error: closing"响应给任何在队列中的SEND或RECEIVE。
SYN-RECEIVED状态
如果没有发送SEND,而且没有等待发送的数据了,则形成并发送FIN数据段,进入FIN-WAIT-1状态;否则在进入ESTABLISHED状态后将命令保存在队列中等待处理。
ESTABLISHED状态
将这一命令保存在队列中,直到所有正在进行的SEND完成后,形成并发送FIN数据段,然后进入FIN-WAIT-1状态。
在FIN-WAIT-1和FIN-WAIT-2状态下
严格地说,这将会是个错误,会收到"error: connection closing"。只要第二个FIN没有发出,也可以收到一个"ok"响应。
CLOSE-WAIT状态
直到所有SEND命令完成后再将这个请求放入队列;然后发送FIN数据段,进入CLOSING状态。
在CLOSING,LAST-ACK和TIME-WAIT状态下返回"error: connection closing"。





加载中…