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

简介: TCP三次握手是TCP协议建立连接的关键步骤,确保客户端和服务端同步状态并确认彼此的存在。过程分为三步:1) 客户端发送SYN包请求连接;2) 服务端回应SYN/ACK包确认收到并提供初始序列号;3) 客户端发送ACK包确认服务端的序列号,双方进入连接状态。此机制确保了双向通信的可靠性和资源的有效利用,避免了失效请求导致的问题。

今天和大家分享的是网络基础中的一颗明——TCP三次握手,作为程序员,经常可以听到这个词,却又对它的具体过程和原理有些模糊呢?别担心今天我们就来深入浅出的聊聊这个话题,让你彻底明白TCP三次握手的奥秘。

 

1.什么是TCP三次握手

TCP三次握手是TCP协议建立连接的过程。简单来说,它是客户端和服务端在正式传输数据之前进行的一种握手操作。

image.png

通过这种操作,双方能够确认彼此的存在,并同步彼此的状态。具体来说,TCP三次握手分为以下三个步骤:


1.1第一次握手

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

image.png

1.2第二次握手

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


1.3第三次握手

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

 

2.为什么需要三次握手

image.png

为什么需要三次握手呢?两次握手不行吗?下面进行详细解释一下:

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

image.png

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


而三次握手可以有效避免这种情况。确认双方序列号在TCP通信中,序列号是非常重要的,它用于标识数据包,并且在数据传输过程中起到跟踪和确认的作用。


通过三次握手,客户端和服务端可以相互告知各自的初始序列号,并确认对方已经收到了这个序列号,从而确保双方的通信是可靠和同步的。


为什么两次握手不行?两次握手的问题主要体现在以下几个方面:


2.1防止已失效的请求报文

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


2.2确认对方的初始序列号

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


2.3确保连接的同步

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

 

3.TCP三次握手的详解

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

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


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


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

客户端收到服务端的SYN/ACK包后会检查其中的确认信息,以确保服务端正确接收了自己的序列号。同时,客户端也会生成一个ACK包来确认服务端的序列号,这个ACK包表示客户端已经收到了服务端的SYN/ACK包,并且确认了其中的序列号。发送ACK包后,客户端进入established状态,等待服务端的确认。服务端收到包后会检查其中的确认信息,以确保客户端正确接收了自己的序列号。此时服务端进入established状态,表示连接已经建立,双方可以开始数据传输了。


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

在第三次握手中,客户端发送的ACK包含了对服务端序列号的确认,这个包表示客户端已经收到了服务端的SYN/ACK包,并且确认了其中的序列号。发送ACK包后,客户端进入established状态,表示连接已经建立。服务端收到ACK包后会检查其中的确认信息,以确保客户端正确接收了自己的序列号。此时服务端也进入established状态,表示连接已经建立,双方可以开始数据传输了。

image.png

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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
存储 JSON 算法
无懈可击的身份验证:深入了解JWT的工作原理
无懈可击的身份验证:深入了解JWT的工作原理
2016 0
|
算法 C语言 网络架构
Cisco Packet Tracer入门篇
文章目录 一、什么是Packet Tracer? 二、操作界面 1.连接线 2.交换机 3.路由器 4.终端设备 三、接口分类 四、简单案例入门 1.建立拓扑 2.配置pc端ip 3.Ping测试
|
网络协议 算法 程序员
第十问:TCP协议是怎么做到可靠性的?它的可靠指的是到哪一层的可靠?
TCP(传输控制协议)是一种面向连接的传输层协议,其核心特性是可靠性。TCP通过数据分片与排序、确认机制(ACK)、超时重传、流量控制、拥塞控制、校验和等机制,确保数据从发送方到接收方的完整性和有序性。这些机制共同作用,使TCP能够在复杂网络环境中实现稳定的数据传输。TCP的可靠性主要指的是从传输层到传输层的可靠性,传输层之上的可靠性则由应用程序负责。
|
存储 缓存 安全
ConcurrentHashMap的实现原理,非常详细,一文吃透!
本文详细解析了ConcurrentHashMap的实现原理,深入探讨了分段锁、CAS操作和红黑树等关键技术,帮助全面理解ConcurrentHashMap的并发机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
ConcurrentHashMap的实现原理,非常详细,一文吃透!
|
存储 安全 Java
String StringBuffer StringBuilder 区别详解与对比分析
本文详细解析了Java中String、StringBuffer和StringBuilder的区别,从可变性、线程安全性和性能三个方面进行对比,并结合具体应用场景分析了三者的适用范围。通过性能测试示例展示了它们在字符串拼接时的效率差异,同时提供了实际代码案例帮助理解。总结指出,String适合少量操作或线程安全场景,StringBuffer适用于多线程环境,而StringBuilder则在单线程下性能最优。开发者应根据需求选择合适的类以优化程序性能。文末还附有相关面试资料供参考。
1425 2
|
网络协议
通俗易懂理解三次握手、四次挥手(TCP)
这篇文章用通俗的语言解释了TCP协议中的三次握手和四次挥手过程,通过比喻和详细的状态变化描述,帮助读者理解建立和断开连接的原理和原因。
通俗易懂理解三次握手、四次挥手(TCP)
|
SQL 关系型数据库 MySQL
MySQL 中的全文索引:强大的文本搜索利器
MySQL 的全文索引是一种用于快速搜索大量文本数据的特殊索引。它通过对文本内容进行分析(如分词、去除停用词等)并构建倒排索引,实现高效查找。创建全文索引使用 `CREATE FULLTEXT INDEX`,搜索时使用 `MATCH AGAINST` 语句。适用于 `CHAR`、`VARCHAR`、`TEXT` 等字段,但需注意性能影响和正确使用搜索语法。
801 22
|
消息中间件 NoSQL 架构师
招行面试:亿级秒杀,超卖问题+少卖问题,如何解决?(图解+秒懂+史上最全)
45岁资深架构师尼恩在读者交流群中分享了如何系统化解决高并发下的库存抢购超卖少买问题,特别是针对一线互联网企业的面试题。文章详细解析了秒杀系统的四个阶段(扣库预扣、库存扣减、支付回调、库存补偿),并通过Redis分布式锁和Java代码示例展示了如何防止超卖。此外,还介绍了使用RocketMQ延迟消息和xxl-job定时任务解决少卖问题的方法。尼恩强调,掌握这些技术不仅能提升面试表现,还能增强实际项目中的高并发处理能力。相关答案已收入《尼恩Java面试宝典PDF》V175版本,供后续参考。
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
2658 2

热门文章

最新文章