TCP三次握手及四次挥手

一、 三次握手

起初A和B都处于CLOSED状态——B创建TCB,处于LISTEN状态(监听某个端口),等待A的连接请求——A创建TCB,向B发出连接请求(SYN=1,seq=x),进入SYN-SENT状态——B收到A的连接请求,向A发出确认(SYN=1,ACK=1,seq=y,ack=x+1),进入SYN-RCVD状态——A收到B的确认后,再次向B发送确认(ACK=1,seq=x+1,ack=y+1),进入ESTABLISHED状态——B收到A的确认后,进入ESTABLISHED状态。

问题:为什么A还要发送一次确认呢?可以二次握手吗?

答:主要为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误A发出连接请求,但因连接请求报文段丢失而未收到确认,于是A再重传一次连接请求,收到了确认,建立了连接。数据传输完毕后,就释放了连接。A一共发出了两个连接请求报文段,其中第一个丢失,第二个到达了B。但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认,同意建立连接。若不采用三次握手,只要B发出确认,就建立新的连接了,而此时A认为自己没有发出连接请求,所以不会理睬B的确认,也就不会向B发送数据,导致B一致等待A发送数据,浪费资源。

二、四次挥手

起初A和B处于ESTABLISHED状态——A向B发出FIN报文段并进入FIN-WAIT-1状态(FIN=1,seq=u)——B收到A的FIN报文段后,向A发出AKC报文段并进入CLOSE-WAIT状态(AKC=1,seq=v,ack=u+1)——A收到B的AKC报文段后,进入FIN-WAIT-2状态,等待B的FIN报文段——B如果没有要向A发送的数据,则向A发出FIN报文段并进入LAST-ACK状态(FIN=1,ACK=1,seq=w,ack=u+1)——A收到B的FIN报文段后,向B发出AKC报文段并进入TIME-WAIT状态(ACK=1,seq=u+1,ack=w+1)——B收A的到AKC报文段后进入CLOSED状态——A经过等待计时器时间2MSL后,进入CLOSED状态。

问题:为什么A在TIME-WAIT状态必须等待2MSL的时间?

答:第一,为了保证A发送的最后一个ACK报文段能够到达B,使B能按照正常步骤进入CLOSED状态。A向B发送的最后一个ACK报文段有可能丢失,如果丢失B就会因为收不到A发送的ACK报文段而超时重传FIN报文段,而A就能在等待时间内收到这个重传的FIN报文段,接着A向B重传一次ACK报文段,重新启动等待计时器。如果没有等待时间,A向B发送完ACK报文段就立即释放连接的话,如果这个ACK报文段丢失,A就无法收到B超时重传的FIN报文段,因此B就无法按照正常步骤进入CLOSED状态。 第二,防止已失效的连接请求出现在本连接中。首先MSL是最大报文段寿命,即任何报文段在网络上的存在时间超过MSL将被丢弃。经过2MSL时间,能够确保本次连接发出的所有报文段都已经失效,避免影响下次连接。

问题:如果在双方通信过程中,客户端突然消失了(如客户端断电、断网等),服务器端怎么得知呢?

答:TCP为每一个连接设有一个保活计时器。服务器端每收到一次客户端的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时没有收到客户端的数据,服务器端就发送一个探测报文段,以后则每隔75秒钟发送一次。若一连发送10个探测报文段后仍无客户端的响应,服务器端就认为客户端出了故障,接着就关闭连接。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值