通俗易懂的TCP三次握手和四次挥手

本文详细介绍了TCP的三次握手和四次挥手过程。三次握手是为了确保双方的发送和接收能力,而四次挥手则因TCP的半关闭特性,确保数据完整传输并断开连接。挥手过程中,由于可能存在的丢包情况,需要四次交互来确保双方都能得知对方的状态。
摘要由CSDN通过智能技术生成

1 三次握手

        三次握手的主要目的时建立一个TCP连接,过程中需要客户端和服务器总共发生三个包,进行三次握手的目的是为了确认双方的通信能力和发送能力是否正常,并指定初始化序列号,为后面传输的可靠性做准备。

         上图太过抽象,可以形象的理解为:

为什么要三次握手呢?

        若只客户端发送一次报文(一次握手),客户端对服务器说话,但客户端不知道服务器收没收到。

        若只有前两次报文(两次握手),客户端知道了服务器已经收到了信息,但是服务器还不知道客户端有没有收到自己的反馈。

        第一次握手可以让服务器知道客户端有发送能力而自己有接收能力。第二次握手能让客户端知道服务器有接收能力和发送能力。第三次握手能让服务器知道客户端有接收能力而自己有发送能力。

        综上,三次握手之后,双方都知道了对方和自己有发送能力和接收能力。

2 四次挥手

        建立一个连接需要三次握手,而终止一个连接要经过四次挥手。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。图中FIN=1就是一个关闭连接请求。

        TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。

        通俗图:

为什么要四次挥手呢,二三次能不能合并?

        因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

第三次握手如果丢失,则服务器不会收到第四次握手,会有间隔的发送第三次握手的信息。第四次握手如果丢失,那客户端还会收到第三次握手,则继续发送第四次握手。

番外:

TCP由于上述交互机制,所以是可靠的。而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。

UDP协议是不可靠的,UDP协议并不管这个发送任务能否成功,它将这个发送的结果抛给上层传输层处理了。数据包在传输时经常要做一个拆分,如下图所示,拆分发送给服务器,再由服务器做一个汇总,这个过程中由于在复杂的网络环境中,网络拥塞,负载过高等经常发生,IP分组发送失败也是每时每刻都在发生的。所以有可能会丢包。

本文部分参考:

[1] https://zhuanlan.zhihu.com/p/86426969

[2] https://www.bilibili.com/video/BV1Ff4y147WP?t=1135&p=306

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值