您的位置:首页 > 理论基础 > 计算机网络

SCTP关联终止和TCP四次挥手

2016-05-02 13:51 344 查看
TCP从建立连接到连接关闭的流程图如下:


从主动关闭(FIN_WAIT_1)状态到CLOSED状态总共经过四次挥手,特别注意的是在TIME_WAIT的时候主动关闭端会提留2MSL再关闭,MSL是Maximum
Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,2MSL也就是2倍MSL,大约在1分钟到4分钟之间。

为什么TIME_WAIT需要2MSL呢?

TIME_WAIT状态的存在有两个理由:(1)让4次握手关闭流程更加可靠;4次握手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去。

(2)防止lost duplicate对后续新建正常链接的传输造成破坏。lost duplicate在实际的网络中非常常见,经常是由于路由器产生故障,路径无法收敛,导致一个packet在路由器A,B,C之间做类似死循环的跳转。IP头部有个TTL,限制了一个包在网络中的最大跳数,因此这个包有两种命运,要么最后TTL变为0,在网络中消失;要么TTL在变为0之前路由器路径收敛,它凭借剩余的TTL跳数终于到达目的地。但非常可惜的是TCP通过超时重传机制在早些时候发送了一个跟它一模一样的包,并先于它达到了目的地,因此它的命运也就注定被TCP协议栈抛弃。另外一个概念叫做incarnation
connection,指跟上次的socket pair一摸一样的新连接,叫做incarnation of previous connection。lost duplicate加上incarnation connection,则会对我们的传输造成致命的错误。大家都知道TCP是流式的,所有包到达的顺序是不一致的,依靠序列号由TCP协议栈做顺序的拼接;假设一个incarnation connection这时收到的seq=1000, 来了一个lost duplicate为seq=1000, len=1000, 则tcp认为这个lost
duplicate合法,并存放入了receive buffer,导致传输出现错误。通过一个2MSL TIME_WAIT状态,确保所有的lost duplicate都会消失掉,避免对新连接造成错误。

SCTP从建立连接到连接关闭的流程图如下:


SCTP没有2MSL问题,为什么呢?

因为

1.SCTP使用验证标志,该标志在建立连接的时候确定,图中Ta Tz就是其验证标志,有了验证标志就可以解决TCP中lost duplicate问题。

2.但是SCTP在发送shutdown complete主动关闭端就已经进入了closed状态,主动关闭端的生命周期意外着结束了!要是由于网络原因被动关闭端没有接收到shutdown
complete,由于主动关闭端生命周期已经结束,无法重发hutdown complete,那被动关闭端岂不是无法进入closed吗?

对于第2点遇到的问题该怎么解答呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: