高可靠性的包交换传输协议完美分析(12)


返回"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段,它的格式如下:
第三步应该检查SYN,假如SYN位设置了,检查安全性,假如接收数据段中的security/compartment与TCB中的不能匹配,返回RST段,格式如下: 。在SEG.PRC大于TCB.PRC的情况下,假如用户和系统答应,则设置TCB.PRC<-SEG.PRC,假如用户和系统不答应,发送RST段并返回 。其格式如下: 。假如SEG.PRC小于TCB.PRC,继续进行 。设置RCV.NXT为SEG.SEQ 1,IRS为SEG.SEQ中的值,其它控制信息和数据以后处理 。应该选择ISS,并发送SYN段,其格式如下: 。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或SEG.ACK > SND.NXT,发送RST 。(除非设置了RST位,假如这样,抛弃这个数据段直接返回) 。RST段的格式如下: 。不用理会收到的数据段,直接返回 。
假如SND.UNA =< SEG.ACK =< SND.NXT,那么ACK是可以接受的 。
下一步检查RST位 。在设置了RST的情况下,假如ACK是可以接受的,通知用户"error: connection reset",抛弃接收到的数据段并进入CLOSED状态,删除TCB并返回 。假如ACK不能接受,抛弃数据段返回 。
第三步检查安全性和优先级 。假如security/compartment和TCB中的security/compartment不匹配,发送RST段 。在发送RST段的时候,假如已经有ACK了,格式为:,假如没有ACK,格式为
在没有发现不匹配的时候,假如有ACK,段中的优先级必须和TCB中的匹配,假如不匹配,发送RST,其格式为:;假如未发现不匹配,而且没有ACK的情况下,假如接收到的数据段中的优先级高于TCB中的优先级,在得到用户和系统许可的情况下可以将TCB中的优先级升高,假如用户或系统不许可,提高prec,然后以如下格式发送RST:,假如接收数据段中的优先级小于TCB中的优先级则继续 。在发送了RST后,抛弃数据段并返回 。
第四步检查SYN位 。只有在ACK位是合法或没有ACK而且数据段中不包括RST的情况下才能进行这一步 。假如设置了SYN位,而且security/compartment和优先级合法,那么RCV.NXT设为SEG.SEQ 1,IRS设为SEG.SEQ 。SND.UNA应该增加和SEG.ACK相等,在重新发送队列中原来等待确认而现在已经被确认的数据段也被清除 。假如SND.UNA > ISS,改变连接状态为ESTABLISHED,形成下面格式的ACK段并发送: 。队列中用于发送的数据的控制信息也一起发送,假如段中没有数据或控制信息,则进行第六步,否则返回 。假如SND.UNA > ISS不成立,形成SYN,ACK段,格式如下:

推荐阅读