频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

传输控制协议(TCP)(2)

作者: 出处:vlan9收集  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2007-01-25 11:41
关 键 词:传输控制协议(TCP)
阅读提示:TCP协议主为了在主机间实现高可靠性的包交换传输协议。本文将描述协议标准和实现的一些方法。因为计算机网络在现代社会中已经是不可缺少的了,TCP协议主要在网络不可靠的时候完成通信,对军方可能特别有用,但是对于政府和商用部门也适用。本文主要是对TCP协议的详细介绍.

管理窗口
如果我们学习过网络基础,我们一定知道有一个窗口协议,TCP中每个数据段都包括下一
个希望接收到的序列号。窗口比较大会提高传送速度,如果传送过来的数据超过的窗口

大小,数据会被抛弃。这样会加重网络负担。如果TCP开始时的接收窗口比较大,而到最
后这个窗口缩小了,这种作法可不是好办法。对于健壮的TCP来说,最好不要自己缩小窗
口,但要做要准备对方的TCP缩小窗口。
即使发送窗口大小为零,发送TCP也必须做好准备接收数据并且可以发送至少一位新数据
。即使接收窗口为零,发送方也会重发,重发间的间隔时间一般为两分钟。当接收TCP的
接收窗口为零时,在它接收到数据时,它依然会返回确认,其中包括希望收到的序列码
和当前窗口大小(为零)。
发送TCP将数据打成符合当前大小的包,但在重新传送队列中可能重新打包。这种重新打
包并不是必须的,但是会很有好处。如果一个连接只有单向数据流,窗口信息可以在确
认信息中得到,这些的序列号都是一个,因此没法区别出谁先谁后。但这并不是一个严
重的问题。改进的方法是在数据段中加入最新的期待序列号,这样就可以区别出谁先谁
后了。窗口管理对传送效率有很大影响,下面是一些建议:
当使用更少的大数据而要获得高效率时分配非常小的窗口使数据以许多小段传送。对于
发送者来说要避免在发送小数据段时必须等到窗口大到一定程度再进行。确认不要被延
时。接收窗口如果大小为零时,要传送的数据段可能被分成越来越小的段。如果发送TC
P仅仅发送窗口允许大小的数据段,可能这些数据段会被换成比这个段大(或者小)的数
据段发送。接收方时不时地进行窗口大小调整会使大数据段分为小段,而不成对。尽量
把小的窗口合成大的窗口。
3.8. 接口
网络协议的分层结构决定了TCP有两个接口,向上的用户接口和下面的接口。对下层接收
口的描述不是很清楚,这个工作由下层协议来描述,但是这里我们也描述一些TCP要使用
要的参数。
用户/TCP接口
下面描述一些TCP命令,这些命令是功能性的,因各系统不同具体实现可能不同。最后,
我们必须清楚,不同的TCP实现可能有不同的用户接口,但是有一些功能是最基本的,本
节描述的功能便是这个基本功能集。
TCP用户命令
下面定义的命令与其它高级语言中定义的方法差不多,但有些陷井操作需要的,如SVC,
UUO,EMT。下面只是一个功能介绍,具体实现可能大为不同,如有些系统会把这里的多
条命令结合成一条命令使用。为了实现通信功能,TCP不能只会接收命令,而且能够返回
消息给它服务的进程,这些消息包括:
(a) 关于连接的通常消息,如中断,远程关闭等等;
(b) 对用户命令做出应答,是成功还是失败。
Open
格式:OPEN (local port, foreign socket, active/passive [, timeout] [, preced
ence] [, security/compartment] [, options]) -> local connection name
我们假定本地TCP注意到它所服务的进程标记,而且将检查进程的认证。因实现不同,本
地网络和源地址的TCP认证可能由TCP进行也可以由下层协议进行(如IP协议)。这些考
虑主要是基于安全性的考虑。
如果active/passive标记设置为passive,TCP会检测到达的连接请求,它是被动的,被
动的连接可以有一个完全指定的外套接字用于等待特定的连接或未指定的外套接字来等
待任何呼叫。一个完全定义的被动呼叫可以通过执行一系列的SEND命令而变为主动的。
创建一个传输控制块(TCB),其中一部分参数是由OPEN命令参数而来。在主动OPEN时,
TCP会立刻开始同步连接。如果给出参数timeout,会允许呼叫者应用于所有TCP数据。如
果在timeout规定的时间内还未把数据送到目的地,就关闭连接,一般的默认值是5分钟

参数precedence或security/compartment是用于规范用户对某一连接的安全性的,如果
没有指定则使用默认值。TCP会匹配这两个参数,只有在security/compartment一致而且
接收到的precedence小于等于要求的precedence时才会打开连接。当连接的precedence
大于要求的值时,从接收到的数据段中取得这一值,并在连接中一直使用这个比较大的
值。具体实现时可以给用户权力控制precedence的决定过程。例如,用户可以要求prec
edence必须安全一致,或在提升precedence时要通知用户。
本地连接名(local connection name)由TCP返回用户,它可以代替<本地套接字,外套
接字>标记一个连接。
Send
格式:SEND (local connection name, buffer address, byte count, PUSH flag, UR
GENT flag [,timeout])
这个命令使指定缓冲区内的数据发向指定连接,如果连接未打开则返回一个错误,一些
实现中可能在打开连接以前调用SEND,由SEND自动打开连接。如果设置了PUSH标记,数
据必须立刻传送给接收者,而且PUSH位在缓冲区中的最后一个段是必须设置。如果没有
设置,此数据段就会因为效率的考虑而和下一个SEND命令传送的数据一起传送。如果设
置了URGENT标记,那就必须象上面所述的一样紧急处理。传送方设置的URGENT数目不一
定非要等于通知接收方用户的次数。
如果在OPEN中没有指定外套接字,那缓冲区数据会被发送到隐式外套接字。未使用外套
接字打开连接的用户仍然可以SEND,而不用知道外套接字地址。但是,如果在指定外套
接字前进行SEND,则会出错。用户可以使用STATUES确定连接状态。如果指定了timeout
,对于当前连接的当前用户timeout会更改为新的连接。
最简单的实现方法就是在没有把数据发送完毕以前,SEND不把控制权交给发送进程,但
是这样可能会造成死锁(例如,双方都试图SEND,而不准备RECEIVE),效率也不好。好
的实现方法是在发送一段数据后返回控制权给发送进程,当然如果能够多个SEND同时发
送,那更好不过了。有多个SEND需要服务时一般采取先来先服务。
对于本地来说,我们现在假定的是SEND在发送数据后会产生类似中断的东西告诉发送进
程数据发送的情况;当然SEND也可以在发送完后立刻告知进行数据发送的情况。我们可
以乐观地认为发送是成功的,如果发送失败,连接会因为超时而关闭。在实现中,即使
是同步返回情况,也需要一些异步信号,但这些异步信号是用于处理连接的,而不是用
于处理数据发送的。既然允许多个SEND同时工作,因此有必要区别返回的信息是哪一个
SEND的。具体的情况下面会讨论到。
Receive
格式: RECEIVE (local connection name, buffer address, byte count) -> byte c
ount, urgent flag, push flag
此命令分配一个接收缓冲区给指定的连接。如果下面不是一个OPEN命令或者此调用进行
未被授权使用此连接返回错误。最简单的实现方法是在缓冲区没有填充完以前不返回控
制权,但这样可能会造成严重的死锁。更复杂的实现方法允许同时存在多个RECEIVE,这
样会提高效率。这样是在控制复杂的情况下取得了高效率。
如果在PUSH之前的数据已经填满缓冲区,那么对于RECEIVE的响应中就不用设置PUSH位了
。缓冲区会容纳尽可能多的数据,如果在缓冲区填充满以前看到PUSH位,将返回缓冲区
中的数据并设置PUSH。在处理紧急状态时,如果有URGENT标记,还有紧急数据;如果没
有URGENT标记了,就返回所有紧急数据,用户也离开紧急状态。请注意,在紧急指针指
向的点以后的那些数据不能和紧急数据一起返回,即使它们在同一个缓冲区内,当然,
如果用户指定要这么做例外。
为了区别多个RECEIVE并保证缓冲区不被充满,返回的数据中也要包括缓冲区指针和一个
计数器指明现在接收了多少数据。RECEIVE可以有自己专用了缓冲区,也可以和用户共享
一个缓冲区。
Close
格式: CLOSE (本地连接名)
此命令关闭连接,如果连接未打开,或未授权可以关闭连接返回错误。在关闭的时候应
该注意正常关闭,让所有的发送都发送完数据,也可以如上所说在CLOSE后面加上几个S
END,这就要求用户在收到CLOSE后仍然要进行接收。因此,CLOSE意指“我没有更多的数
据要发了”,并不代表“我不再发送任何数据了”。关闭方也可能在超时前不能发出所
有数据,这种情况下,要由CLOSE转入ABORT状态。用户可以自己决定在任何时间关闭连
接,也可以根据TCP返回的提示关闭。因此关闭操作要和外TCP进行通信,因此在关闭状
态可能要呆一会儿,在CLOSE没有返回前调用打开,会返回错误。
Status
格式: STATUS (本地连接名) -> status data
这个命令和具体的实现有关,而且有可能会有负作用。返回的信息通常来自有连接相关
的TCB。返回的数据块中包括下面的信息:本地套接字,外套接字,本地连接名,接收窗
口,发送窗口,连接状态,等待确认的缓冲区数,等待接收的缓冲区数,紧急状态,优
先级,security/compartment和传输超时。因此实现不同,所以上述数据项中可能有几
项没有意义或根本不存在。如果调用进程没有被授权使用这一连接,返回错误。这一点
会防止未被授权的进程获得连接状态。
Abort
格式: ABORT (本地连接名)
此命令中止所有SEND和RECEIVE,删除TCB,将发送特殊的RESERT信息到对方TCP。具体的
返回信息会因实现不同而不同。
TCP到用户信息
假定操作系统提供一种可以使TCP异步传送信息到用户程序的机制。当TCP确实通知用户
程序时会返回一些特定的信息。通常在这些信息中也会有错误信息,在其它情况下会有
关于完成SEND或RECEIVE或其它用户调用的相关信息。会提供下面的几种消息:
本地连接名 都提供
响应串 都提供
缓冲区地址 发送和接收
字节记数 接收
Push标记 接收
Urgent标记 接收
 
TCP和下层接口
TCP实际上调用下层服务才能在网络上传输数据,在互联网上我们通常认为TCP的下层是
IP协议。如果下层是IP层,它提供一些类于服务类型和生存时间的参数。TCP使用这些参
数的如下设置:
Type of Service = Precedence: routine, Delay: normal, Throughput: normal, Re
liability: 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数据段的格式
如下,设置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",不理会请求。
RECEIVE调用
CLOSED状态
如果用户没有权利访问这个连接,返回"error: connection illegal for this proces
s"。如果有权利,则返回"error: connection does not exist"。
在LISTEN,SYN-SENT和SYN-RECEIVED状态下
在进入ESTABLISHED状态后,将数据放入队列准备处理。如果队列中没有空间,返回"er
ror: insufficient resources"。
在ESTABLISHED,FIN-WAIT-1和FIN-WAIT-2状态下
如果没有接收到足够的数据段满足请求,将请求放入队列。如果队列中没有空间记录RE
CEIVE,返回"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 proces
s"。如果有权利,则返回"error: connection does not exist"。
LISTEN状态
存在着的任何RECEIVE都会返回"error: closing"的响应。删除TCB,然后进入CLOSED状
态并返回。
SYN-SENT状态
删除TCB并返回"error: closing"响应给任何在队列中的SEND或RECEIVE。
SYN-RECEIVED状态
如果没有发送SEND,而且没有等待发送的数据了,则形成并发送FIN数据段,进入FIN-W
AIT-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"。
 
ABORT调用
CLOSED状态
如果用户没有权利访问这个连接,返回"error: connection illegal for this proces
s"。如果有权利,则返回"error: connection does not exist"。
LISTEN状态
任何存在的RECEIVE都应该返回"error: connection reset",删除TCB,进入CLOSED状态
,然后返回。
SYN-SENT状态
对于所有在队列中的SEND和RECEIVE,都返回"connection reset",删除TCB,进入CLOS
ED状态,然后返回。
在SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2和CLOSE-WAIT状态
发送数据段,对于所有在队列中的SEND和RECEIVE,都返回"co
nnection reset",;所有要进行传送或重新传送的数据段立刻进行,删除TCB,进入CL
OSED状态,然后返回。
在CLOSING,LAST-ACK和TIME-WAIT状态下返回"ok",删除TCB,进入CLOSED状态,然后返
回。
 
STATUS 调用
CLOSED状态
如果用户没有权利访问这个连接,返回"error: connection illegal for this proces
s"。如果有权利,则返回"error: connection does not exist"。
LISTEN状态
返回"state = LISTEN"和TCB指针。
SYN-SENT状态
返回"state = SYN-SEND"和TCB指针。
SYN-RECEIVED状态
返回"state = SYN-RECEIVED"和TCB指针。
ESTABLISHED状态
返回"state = ESTABLISHED"和TCB指针。
FIN-WAIT-1状态
返回"state = FIN-WAIT-1"和TCB指针。
FIN-WAIT-2状态
返回"state = FIN-WAIT-2"和TCB指针。
CLOSE-WAIT状态
返回"state = CLOSE-WAIT"和TCB指针。
CLOSING状态
返回"state = CLOSING"和TCB指针。
LAST-ACK状态
返回"state = LAST-ACK"和TCB指针。
TIME-WAIT状态
返回"state = TIME-WAIT"和TCB指针。
接收到数据段
如果处于CLOSED状态,所有到达的数据都被抛弃。包括RST的也不例外。如果接收到的数
据段不包括RST,则返回一个RST。对于发送TCP要选择它可以认知的确认和序列号。如果
关闭ACK位,则序列号为0,格式如下:如
果打开ACK位,格式如下:。
如果处于LISTEN状态,首先检查RST,接收到的RST应该被忽略。下来应该检查ACK,如果
连接处于LISTEN状态下,任何ACK都是错误的,应该返回RST段,它的格式如下:EG.ACK>。
第三步应该检查SYN,如果SYN位设置了,检查安全性,如果接收数据段中的security/c
ompartment与TCB中的不能匹配,返回RST段,格式如下:。在
SEG.PRC大于TCB.PRC的情况下,如果用户和系统允许,则设置TCB.PRC<-SEG.PRC,如果
用户和系统不允许,发送RST段并返回。其格式如下:。如果S
EG.PRC小于TCB.PRC,继续进行。设置RCV.NXT为SEG.SEQ+1,IRS为SEG.SEQ中的值,其它
控制信息和数据以后处理。应该选择ISS,并发送SYN段,其格式如下:RCV.NXT>。SND.NXT设置为ISS+1,SND.UNA设置为ISS的值,连接状态改为
SYN-RECEIVED。其它控制信息和数据将在SYN-RECEIVED状态中处理,但以于SYN和ACK的
处理不应该重复。如果未完全指定LISTEN域,现在就应该指定了。
第四步是处理其它数据和控制信息。其它的数据段(不包括SYN)应该有ACK,因此不要
对它进行ACK处理。如果接收到RST段,则它是非法的。如果确实接收到了,抛弃它,直
接返回。
如果处于SYN-SENT状态。首先检查ACK位,如果设置了ACK位,而且SEG.ACK =< ISS或SE
G.ACK > SND.NXT,发送RST。(除非设置了RST位,如果这样,抛弃这个数据段直接返回
)。RST段的格式如下:。不用理会收到的数据段,直接返回。
如果SND.UNA =< SEG.ACK =< SND.NXT,那么ACK是可以接受的。
下一步检查RST位。在设置了RST的情况下,如果ACK是可以接受的,通知用户"error: c
onnection reset",抛弃接收到的数据段并进入CLOSED状态,删除TCB并返回。如果ACK
不能接受,抛弃数据段返回。
第三步检查安全性和优先级。如果security/compartment和TCB中的security/compartm
ent不匹配,发送RST段。在发送RST段的时候,如果已经有ACK了,格式为:CK>,如果没有ACK,格式为。
在没有发现不匹配的时候,如果有ACK,段中的优先级必须和TCB中的匹配,如果不匹配
,发送RST,其格式为:;如果未发现不匹配,而且没有ACK的
情况下,如果接收到的数据段中的优先级高于TCB中的优先级,在得到用户和系统许可的
情况下可以将TCB中的优先级升高,如果用户或系统不许可,提高prec,然后以如下格式
发送RST:,如果接收数据段中的优先级
小于TCB中的优先级则继续。在发送了RST后,抛弃数据段并返回。
第四步检查SYN位。只有在ACK位是合法或没有ACK而且数据段中不包括RST的情况下才能
进行这一步。如果设置了SYN位,而且security/compartment和优先级合法,那么RCV.N
XT设为SEG.SEQ+1,IRS设为SEG.SEQ。SND.UNA应该增加和SEG.ACK相等,在重新发送队列
中原来等待确认而现在已经被确认的数据段也被清除。如果SND.UNA > ISS,改变连接状
态为ESTABLISHED,形成下面格式的ACK段并发送: ACK>。队列中用于发送的数据的控制信息也一起发送,如果段中没有数据或控制信息,
则进行第六步,否则返回。如果SND.UNA > ISS不成立,形成SYN,ACK段,格式如下:<
SEQ=ISS>,并发送它。如果在段中没有数据或控制信息,
待进入ESTABLISHED状态后再进行处理。
第五步,如果SYN或RST位没有设置,抛弃数据段返回。
下来我们来看看其它状态。首先应该检查序列号。在下面状态下
SYN-RECEIVED状态
ESTABLISHED状态
FIN-WAIT-1状态
FIN-WAIT-2状态
CLOSE-WAIT状态
CLOSING状态
LAST-ACK状态
TIME-WAIT状态
段按顺序处理,首先抛弃重复的段,对于以后的处理要根据SEG.SEQ的大小进行。如果有
的段内的新老内容重叠在一起,那只用处理新的那一部分。下面是对接收到的数据的可
接受性测试中的四种情况:
段长度
接收窗口
测试
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
如果RCV.WND = 0,除了合法的ACK,URG和RST段外拒绝其它的数据段。如果接收到的数
据段不可接受,应该返回一个应答,格式如下:>。在发送完应答后,抛弃不可接受的数据段,然后返回。
第二步检查RST位。
如果处于SYN-RECEIVED 状态时,而且处于设置了RST的情况下,如果连接以被动OPEN开
始,将连接返回到LISTEN状态,不需要通知用户;如果连接以主动OPEN打开,拒绝连接
,并通知用户"connection refused"。在上面任何一种情况下,所有在重发队列中的数
据都要删除。在主动OPEN的那种情况下,进入CLOSED状态,删除TCB然后返回。
如果处于ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2或CLOSE-WAIT状态时,而且RST已经设
置,那么任何存在的RECEIVE和SEND都会收到"reset"。所有队列中的数据段都应该立即

发送。用户也会收到"connection reset"。进入CLOSED状态,删除TCB并返回。
如果处于CLOSING状态,LAST-ACK状态或TIME-WAIT状态,而且RST已经设置,进入CLOSE
D状态,删除TCB并返回。
检查安全和优先级
在SYN-RECEIVED状态下
如果段中的security/compartment和优先级和TCB中的不匹配,发送RST并返回。
在ESTABLISHED状态下
如果段中的security/compartment和优先级和TCB中的不匹配,发送RST ,所有存在的R
ECEIVE和SEND接收到"reset",立即发送所有队列中的数据段,用户接收到"connection
reset"。进入CLOSED状态,删除TCB并返回。
第四步检查SYN位,如果连接处于以下状态
SYN-RECEIVED
ESTABLISHED状态
FIN-WAIT STATE-1
FIN-WAIT STATE-2
CLOSE-WAIT状态
CLOSING状态
LAST-ACK状态
TIME-WAIT状态
如果SYN在窗口中就是错误,发送RST,任何存在的RECEIVE和SEND收到"reset",所有在
队列中的数据段立即发送,用户也接收到"connection reset",进入CLOSED状态,删除
TCB并返回。如果SYN未在窗口中,这一步不会发生。
第五步检查ACK域
如果ACK位关闭,抛弃数据段返回。如果ACK域打开的情况下,如果连接处于
SYN-RECEIVED状态时
如果SND.UNA =< SEG.ACK =< SND.NXT,进入ESTABLISHED状态。如果段的确认消息不可
接受,形成如下形式的RST并发送:

ESTABLISHED状态时
如果SND.UNA < SEG.ACK =< SND.NXT,设置SND.UNA <- SEG.ACK。因此而对重新传送队
列中数据段的确认也带来了对这些数据段的删除。用户应该接收对缓冲区的主动确认,
如果ACK是重复的(SEG.ACK < SND.UNA)可以忽略这个ACK。如果ACK确认了还未发送的
东西(SEG.ACK > SND.NXT),那么可以发送ACK,抛弃数据段并返回。
如果SND.UNA < SEG.ACK =< SND.NXT,应该更新发送窗口。如果(SND.WL1 < SEG.SEQ)
或(SND.WL1 = SEG.SEQ且SND.WL2 =< SEG.ACK),设置SND.WND <- SEG.WND,SND.WL1
<- SEG.SEQ和SND.WL2 <- SEG.ACK。
FIN-WAIT-1状态
除了对于ESTABLISHED状态的处理外,如果确定了FIN,则进入FIN-WAIT-2状态并在这个
状态下继续处理。
FIN-WAIT-2状态时
除了对于ESTABLISHED状态的处理外,如果重新发送队列为空,确认用户的CLOSE,但不
删除TCB。
CLOSE-WAIT状态时
同ESTABLISHED状态的处理。

CLOSING状态时
除了对于ESTABLISHED状态的处理外,如果确定了FIN,则进入TIME-WAIT状态,如果未确
认,则忽略这个段。
LAST-ACK状态时
在此状态下唯一可能发生的就是重要发送远程FIN。如果确认了FIN,则删除TCB,进入C
LOSED状态并返回。

TIME-WAIT状态时
在此状态下唯一可能发生的就是重要发送远程FIN。确认它,并重新开始2 MSL超时。
第六步检查URG位,如果连接处于ESTABLISHED状态,FIN-WAIT-1状态或FIN-WAIT-2 状态
,而且URG位被设置,那么RCV.UP <- max(RCV.UP,SEG.UP),通知用户远方有紧急数据,
如果用户已经处于紧急状态,不用再多嘴了。连接在此时不会处于CLOSE-WAIT状态,CL
OSING状态,LAST-ACK状态或TIME-WAIT状态,因为还没有从远方获得FIN。
第七步处理段数据
处于ESTABLISHED状态,FIN-WAIT-1 状态或FIN-WAIT-2 状态时,在进入ESTABLISHED状
态后才可能向用户接收缓冲区传送数据。段中的数据可以移向缓冲区,直到缓冲区满或
段为空为止。如果段为空并带有标记PUSH,在返回缓冲区数据后要通知用户接收到PUSH
。TCP传送数据时必须对接收到的数据也发给确认。前面已经说过对RCV.NXT和RCV.WND的
处理,这里不再多说了。发送的确认有如下格式:CK>。
而CLOSE-WAIT状态,CLOSING状态,LAST-ACK状态或TIME-WAIT 状态根本不会发生,因为
还未从远程TCP接收到FIN。
第八步检查FIN位。如果状态是CLOSED,LISTEN或SYN-SENT,不要处理FIN,因为此时的
SEG.SEQ不会的意义,应该直接抛弃数据段返回。如果设置了FIN位,通知用户"connect
ion closing"中止所有正在进行的RECEIVE,增加RCV.NXT超过FIN,对FIN发送确认。
如果此时处于:SYN-RECEIVED状态或ESTABLISHED状态进入CLOSE-WAIT状态。
如果此时处于FIN-WAIT-1 状态
如果确定了FIN段,那么进入TIME-WAIT状态,打开time-wait计数器,关闭其它计数器,
如果没有确认,进入CLOSING状态。
如果此时处于FIN-WAIT-2状态
进入TIME-WAIT状态,关闭其它计数器,打开time-wait计数器。
如果此时处于CLOSE-WAIT状态或CLOSING状态或LAST-ACK状态,保留各自原来的状态。
如果此时处于TIME-WAIT状态,保持在TIME-WAIT状态。重新开始2 MSL time-wait超时。

 
用户超时
对于任何一种状态,用户超时的情况下,发送队列中的数据,返回"error: connection
aborted due to user timeout",删除TCB,进行CLOSED状态并返回。
 
重发超时
在任何状态下,如果重发队列中的数据段发送超时,将它再次放到队列首部重新发送。
 
TIME-WAIT超时
如果time-wait超时,删除TCB,进行CLOSE状态并返回。

【相关文章】

责任编辑: 雪花(TEL:(010)68476636-8008)


共2页: 上一页 [1] 2
【内容导航】
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·路由器设置与口令恢复 (查看61044次)
·常用交换机典型配置 (查看36537次)
·网络管理员考试全真模拟试题(八.. (查看32988次)
·三层交换技术专题 (查看28621次)
·子网掩码教程 (查看25905次)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有