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

TCP连接的建立和释放(三次握手和四次握手)

2016-07-21 16:30 507 查看
总体来说,可以用下边的图来概括:



重点解释下两个问题:(以下客户端用A表示,服务器用B表示)

1.连接建立的时候,为什么A还要发送一次确认呢?

 答:这主要是为了防止已失效的连接请求报文段突然又传送了B,因而产生错误。

         所谓“”已经失效的连接请求报文段“是这样产生的。考虑一种正常情况。A发出连接请求,但因连接请求报文丢失儿未收到确认。于是A再重传一次连接请求。后来收到了确认。建立了连接。数据传输完毕后,就释放了连接。A供发送了了两个连接请求报文段,其中第一个丢失,第二个到达了B。没有“”已失效的连接请求报文段“。

        现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络节点长时间滞留了。一直延误到连接释放以后的某个时间才到达B。本来这事一个早已经失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。

      由于A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样白白浪费了。

    采用三次握手的办法可以防止上述现象的发生。例如在刚才的情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。

2.为什么A在TIME-WAIT状态必须等待2MSL的时间呢?这又两个理由。

答:第一,为了保证A发送的最后一个ACK报文段能够到达 B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间而是再放碗ACK报文段后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常步骤进入CLOSED状态。

        第二,防止上一届提到的“”已失效的连接请求报文段“出现在本连接中。A在发送完最后一个ACK报文段后,在经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: