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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: **TCP三次握手摘要**TCP三次握手是建立可靠TCP连接的过程,包括:1. 客户端发送SYN包,进入SYN_SENT状态。2. 服务端回应SYN和ACK包,进入SYN_RCVD状态。3. 客户端再次发送ACK包,双方进入ESTABLISHED状态,连接建立。三次握手确保双方都能发送和接收数据,防止失效请求导致的资源浪费,并同步序列号以确保可靠性。

哈喽,小伙伴们!今天小米要给大家带来的是网络基础中的一颗明珠——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协议确保了客户端和服务端双方都具备发送和接收数据的能力,从而建立了可靠的通信信道。这种设计不仅避免了已失效的请求报文导致的资源浪费问题,还确保了双向通信的可靠性和连接的同步。

希望通过这篇文章,大家能够对TCP三次握手有一个更清晰的了解。如果你有任何疑问或想了解更多相关知识,欢迎在评论区留言,我们一起讨论交流!下次见啦,小伙伴们!

以上就是小米今天为大家带来的TCP三次握手的详细讲解。希望这篇文章对你有所帮助,如果你觉得有用,请点个赞或者转发给更多的朋友哦!让我们一起进步,成为更优秀的程序员!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
负载均衡 监控 网络协议
TCP四次挥手:为什么四次?原理大揭密!
**TCP四次挥手详解**:客户端发送FIN进入FIN-WAIT-1,服务器回ACK进CLOSE-WAIT;服务器发送FIN,客户端回ACK进TIME-WAIT,等待2MSL确保数据传输完毕,防止新旧连接混淆。四次挥手确保双方完全关闭连接,解决数据丢失问题。过多TIME-WAIT可通过负载均衡、优化关闭顺序或调整系统参数缓解。关注“软件求生”获取更多技术内容!
35 0
|
9月前
|
网络协议
八股文-TCP的四次挥手
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它的连接的建立和关闭过程都是经过精心设计的。在TCP连接关闭时,使用四次挥手来保证数据的完整传输和连接的正常终止。
78 3
八股文-TCP的四次挥手
|
3月前
|
网络协议
怎么回答TCP的三次握手问题
怎么回答TCP的三次握手问题
21 0
|
9月前
|
网络协议
八股文-TCP的三次握手
TCP协议是一种面向连接、可靠传输的协议,而建立连接的过程就是著名的三次握手。这个过程保证了通信的双方能够同步信息,确保后续的数据传输是可靠和有序的。本文将深入解析TCP三次握手的步骤及其意义。
60 1
|
3月前
|
缓存 网络协议 算法
深入理解Linux网络——TCP协议三次握手和四次挥手详细流程
• 找到套接字:创建内核对象的时候,fd会跟file对象做通过fd_install关联起来,通过进程的fd_table就可以找到对应的file,而file的private指针就指向了socket对象,所以根据fd即可找到套接字 • 判断当前套接字的状态:只有SS_UNCONNECTED状态(刚创建的套接字就是该状态)才会继续,其他状态都会报错 1. 注意此处是socket的状态,而不是sock的状态 2. 会将socket状态更改为SS_CONNECTING • 更改sock状态为TCP_SYN_SENT
|
缓存 网络协议 安全
TCP三次握手四次挥手及常见问题解决方案
TCP三次握手四次挥手及常见问题解决方案
TCP三次握手四次挥手及常见问题解决方案
|
存储 网络协议 网络安全
TCP三次握手四次挥手(三国版)
TCP的三次握手四次挥手 TCP的三次握手和四次挥手不管是我们自己使用还是面试都是需要掌握的,本文先将原理,然后以三国为例讲个小栗子帮助理解。
164 0
TCP三次握手四次挥手(三国版)
|
网络协议
大白话tcp三次握手、四次挥手
TCP是一个全双工协议,想要断开就必须单独拆除每一条信道,4次挥手的目的是终止数据传输,并回收资源
328 0
|
域名解析 缓存 网络协议
第五章 运输层(UDP和TCP三次握手,四次挥手分析)
通过这章,可以知道其实三次握手和四次挥手其实真的好简单,通过这章的学习,我相信你也会同样的认为,以后在也不需要听到别人问三次握手的过程而自己一脸懵逼了,觉得人家好屌,其实也就是他懂你不懂,仅此而已,不懂就去学。学了你就会觉得其实也就那样,没有什么厉害的,这让我回想以前刚学习编程的时候,那时候刚学C,别人就说会写java的helloworld,真TM觉得屌啊,我连helloworld是什么度不知道。一直羡慕人家,怎么这么厉害,然后自己心里很虚,自己这么菜啊,其实不然,不懂的就去学习,学懂了你也就没觉得什么了不起,所以说,不与他人相比,但求超越自己。希望能帮到现在迷茫的同学。
119 0
|
网络协议 程序员 Linux
白话TCP为什么需要进行三次握手
喂 , 听到了吗 ? 听到了 , 你听到了吗 ? 听到了听到了 …
884 0