文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

为什么TCP需要三次握手?一文讲透!

2024-11-29 21:16

关注

哈喽,小伙伴们!今天小米要给大家带来的是网络基础中的一颗明珠——TCP三次握手。作为程序员的你,是不是常常听到这个词,却又对它的具体过程和原理有些模糊呢?别担心,今天我们就来深入浅出地聊聊这个话题,让你彻底搞清楚TCP三次握手的奥秘!

什么是TCP三次握手?

TCP三次握手是TCP协议建立连接的过程。简单来说,它是客户端和服务端在正式传输数据之前,进行的一种“握手”操作,通过这种操作,双方能够确认彼此的存在,并同步彼此的状态。具体来说,TCP三次握手分为以下三个步骤:

1. 第一次握手:客户端发送SYN包

首先,客户端向服务端发送一个带有SYN(Synchronize)标志的数据包,这个包用来表示客户端希望建立连接,并且在包中包含了一个初始序列号(Sequence Number)。发送这个包之后,客户端进入SYN_SENT状态,等待服务端的响应。

2. 第二次握手:服务端发送SYN/ACK包

当服务端收到客户端的SYN包后,会发送一个带有SYN和ACK(Acknowledgment)标志的数据包作为响应,这个包中包含了服务端自己的初始序列号,同时对客户端的序列号进行确认(ACK)。发送这个包后,服务端进入SYN_RCVD状态,等待客户端的确认。

3. 第三次握手:客户端发送ACK包

最后,客户端收到服务端的SYN/ACK包后,会发送一个带有ACK标志的数据包,表示确认收到了服务端的SYN包,同时也带上了自己对服务端序列号的确认。发送这个包后,客户端进入ESTABLISHED状态,服务端收到这个ACK包后,也进入ESTABLISHED状态,此时,连接正式建立,双方可以开始数据传输了。

为什么需要三次握手?

可能有的小伙伴会问了,为什么要这么复杂,要三次握手呢?两次握手不行吗?这里,小米就来详细解释一下。

建立可靠的通信信道:首先,TCP协议是一种面向连接的、可靠的传输协议。在通信过程中,为了保证数据的完整性和可靠性,TCP需要确保客户端和服务端双方都具备发送和接收数据的能力。三次握手正是为了达到这个目的。

防止已失效的请求报文:假设只进行两次握手,那么会存在一种情况:假如客户端发出的第一个SYN包由于网络问题延迟到达,当这个包到达服务端时,客户端可能已经不再需要建立连接了。如果此时服务端收到这个SYN包,并且返回一个ACK包,连接就会建立起来,但实际上客户端并不需要这个连接,从而浪费了资源。而三次握手可以有效避免这种情况。

确认双方序列号:在TCP通信中,序列号是非常重要的。它用于标识数据包,并且在数据传输过程中起到跟踪和确认的作用。通过三次握手,客户端和服务端可以相互告知各自的初始序列号,并确认对方已经收到了这个序列号,从而确保双方的通信是可靠和同步的。

为什么两次握手不行?

两次握手的问题主要体现在以下几个方面:

防止已失效的请求报文:如上所述,两次握手无法有效防止已失效的请求报文导致的资源浪费问题。而三次握手通过客户端的最后一个ACK包来确认服务端的SYN/ACK包,从而避免了这种情况的发生。

确保双向通信的可靠性:两次握手只能保证单向通信的可靠性。TCP通信要求双方都能确认对方的初始序列号,从而实现可靠的数据传输。如果只进行两次握手,只有连接发起方的初始序列号能被确认,而对方的序列号无法确认,这样就无法保证双向通信的可靠性。

确保连接的同步:三次握手的过程确保了连接的同步。客户端和服务端通过三次握手可以确认彼此的存在,并且同步各自的状态和序列号,从而为后续的数据传输打下坚实的基础。

TCP三次握手的过程详解

第一次握手:SYN包的发送和接收

当客户端希望与服务端建立连接时,会发送一个SYN包,这个包中包含了客户端的初始序列号。这个序列号用于标识客户端即将发送的数据包,并且在后续的通信中起到跟踪和确认的作用。发送SYN包后,客户端进入SYN_SENT状态,等待服务端的响应。

服务端收到SYN包后,会分配资源来处理这个连接请求,并生成一个自己的初始序列号。然后,服务端会发送一个SYN/ACK包给客户端,这个包中包含了服务端的初始序列号,以及对客户端序列号的确认。发送SYN/ACK包后,服务端进入SYN_RCVD状态,等待客户端的确认。

第二次握手:SYN/ACK包的发送和接收

客户端收到服务端的SYN/ACK包后,会检查其中的确认信息,以确保服务端正确接收了自己的序列号。同时,客户端也会生成一个ACK包来确认服务端的序列号。这个ACK包表示客户端已经收到了服务端的SYN/ACK包,并且确认了其中的序列号。发送ACK包后,客户端进入ESTABLISHED状态,等待服务端的确认。

服务端收到ACK包后,会检查其中的确认信息,以确保客户端正确接收了自己的序列号。此时,服务端进入ESTABLISHED状态,表示连接已经建立,双方可以开始数据传输了。

第三次握手:ACK包的发送和接收

在第三次握手中,客户端发送的ACK包包含了对服务端序列号的确认。这个包表示客户端已经收到了服务端的SYN/ACK包,并且确认了其中的序列号。发送ACK包后,客户端进入ESTABLISHED状态,表示连接已经建立。

服务端收到ACK包后,会检查其中的确认信息,以确保客户端正确接收了自己的序列号。此时,服务端也进入ESTABLISHED状态,表示连接已经建立,双方可以开始数据传输了。

END

通过三次握手,TCP协议确保了客户端和服务端双方都具备发送和接收数据的能力,从而建立了可靠的通信信道。这种设计不仅避免了已失效的请求报文导致的资源浪费问题,还确保了双向通信的可靠性和连接的同步。

来源:软件求生内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯