发博文
正文 字体大小:

TCP协议-3

(2006-06-13 12:35:25)
分类: 电子书籍

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"。

阅读 评论 收藏 转载 打印举报
前一篇:TCP协议-4
后一篇:TCP协议-2
  • 评论加载中,请稍候...

       

    验证码: 请点击后输入验证码 收听验证码

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    < 前一篇TCP协议-4
    后一篇 >TCP协议-2
      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有