TCP三次握手四次挥手

TCP通信

TCP三次握手

 第一次握手

      客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状

态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。

  第二次握手

      TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己随机初始化一个序列号 seq=y,此

时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。这个报文带有SYN(建立连接)和ACK(确认)标志,询问客户端

是否准备好。

  第三次握手

      TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。

TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。这里客户端表示我已经准备好。

TCP三次握手的目的是什么?为什么不用俩次或者四次?

TCP三次握手的主要目的是防止失效的链接请求报文被服务器端接收到。如果只有俩次握手,假设当客户端发送第一次链接请求,由于网络阻塞的原因迟迟没有没服务端接收,客户端未接收到确认报文,认为服务端没有收到,预售重新发送请求报文并与服务端建立链接,等这个链接断开,之前滞留的请求报文又到达了服务端,就会让服务端与客户端再次链接成功,这时服务端就会一直等待客户端发送请求,但这个链接已经是失效链接,苦苦等待没有任何的请求,造成了资源的浪费。

俩次握手只能保证单向链路是可以通信的,理论上要保证双向链路可以通信需要四次握手,但实际上服务端给客户端的SYN和ACK数据包可以合为一次握手,所以实际上需要三次握手即可。

四次挥手

 

第一次挥手  

    TCP发送一个FIN(结束),用来关闭客户到服务端的连接。

    客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),

此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

第二次挥手

    服务端收到这个FIN,他发回一个ACK(确认),确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。

    服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器

通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个

状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

 

客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

第三次挥手

      服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。

      服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,

此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手

     客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。

     客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时

TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

为啥挥手需要四次,三次为啥不行?

挥手阶段中服务端的ACK和FIN数据包不能合为一次,因为挥手阶段客户端发送FIN表示自己发完了,服务端立即回复CK表示自己已经知道了,此时客户端到服务端的连接已经释放了。客户端不会再发送数据,但服务端还可以继续向客户端发送数据,等到服务端也完成了数据发送,才会发送FIN,这时客户端回复ACK就可以结束通信

TCP在四次挥手的过程中为什么客户端最后还要等待2MSL?

客户端要保证ACK包顺利到达服务端,如果客户端额ACK数据包丢失,则服务端或重新发送FIN包到客户端,这俩个过程最长时间为1MSL,加起来为2MSL,如果2MSL后客户端没有收到服务端重发的FIN包,则说明ACK包顺利到达,就可以关闭连接。

TCP长连接和短连接有什么区别?

TCP 短连接是指客户端与服务端连接后只进行一次读写就关闭连接,一般是客户端关闭。
而长连接则是指在进行完一次读写后不关闭连接,直到服务端压力过大则选择关闭一些长时间为进行读写的连接。

TCP 短连接的优点在于管理简单,而且不会对服务端造成太大的压力,而缺点是每次读写都需要连接耗时较长。

TCP 长连接的优点是可以迅速进行多次读写,缺点是对服务端压力大,且容易被恶意连接影响服务。

长短连接的区别就在于客户端和服务端选择的关闭策略不同,具体需要根据应用场景来选择合适的策略

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值