TCP三次握手四次挥手

一、为什么需要三次握手?

    假设有这样的一个场景,client发出的第一个请求链接报文段没有丢失,而是因为在网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才打到sever,这个报文本应该是失效的,如果不是三次握手而是两次握手,会让客服端和服务端再次建立连接,导致不必要的错误和资源的浪费。如果采用的是三次握手,就算是失效的那个报文段发送过来了,服务端收到了那个失效的报文并回复了确认报文,由于client不会再次发出确认,由于服务器收不到确认,就知道客户端并没有请求连接。

二、何为三次握手?

    1、客户端发送一个SYN标志的报文到服务器,这是三次握手的第一个报文;

    2、服务端接收到请求,回应一个ACK标志和SYN标志的报文给客户端,询问客户端是否准备好传输数据。这是三次握手的第二个报文;

    3、客户端回应服务端一个ACK标志的报文,表示可以传输了,这是第三个报文;


三、为什么需要四次挥手?

    由于TCP连接是全双工的,因此需要每个方向独立的关闭,当一方完成它的数据传送任务后就能发送一个FIN信号来终止这个方向上的连接,收到一个FIN仅仅是意味着这一个方向上没有数据的流动,但任然可以传输数据。首先进行的是关闭一方的主动关闭,而另一方执行被动关闭。那为什么在握手的时候ACK和SYN可以一起发送,而这里是分开的呢?再次强调TCP是全双工模式,接受到FIN意味着没有数据发来,但可以继续发送数据。

四、何为四次挥手?

    1、客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN-WAIT-1终止等待1状态;

    2、服务端接受到FIN信号,并回应一个ACK,此时,客户端进入CLOSE-WAIT等待关闭状态;

    3、客户端收到服务端的确认信号后,客户端进入FIN-WAIT-2终止等待2状态;服务端将最后的数据发送完以后,发出FIN信号报文,进入LAST-ACK最后确认状态;

    4、客户端收到服务端发送的FIN信号,发出ACK确认信号,客户端进入TIME-WAIT时间等待状态。此时TCP连接并没有释放,必须经过2*MSL(最长报文段寿命)的时间后,才进入close状态。服务端只要接受到客户端的确认信息,立即进入CLOSE状态。等撤销TCB之后,结束这次的TCP连接。可以看到服务端结束TCP的时间比客户端早一些。


五、为什么客户端还需等待2MSL?

    1、保证客户端最后发送的ACK报文能达到服务器,因为这个报文肯能会丢失。在服务端看来,客户端如果没有回应ACK报文的话,应该是发送的请求断开的报文没有收到,于是服务器又会重新发送一次,而客户端就能在2MSL时间段内收到这个重传的报文。接着给出回应的报文,并重启2MSL的计时器。

    2、防止已经失效的报文段出现在本次的连接中,客户端发送完最后一个确认报文后,在2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,这样新的连接中不会出现旧的连接的请求报文。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值