TCP连接的关键之谜:揭秘三次握手的必要性

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 在这篇文章中,我们将深入探讨TCP连接建立过程中的关键步骤——三次握手。三次握手是确保客户端和服务端之间建立可靠连接的重要过程。通过三次握手,双方可以确认彼此的接收和发送能力,并同步双方的初始序列号,从而确保连接的稳定性和可靠性。文章还解释了三次握手的原因,它可以避免历史重复连接的初始化,确保双方都收到可靠的初始序列号,并避免资源浪费和消息滞留的问题。通过三次握手,TCP连接可以保证数据的准确性和完整性,确保通信的可靠性。

TCP 连接建立

当我们浏览网页、发送电子邮件或者进行在线游戏时,我们常常不会想到背后复杂的网络连接过程。然而,正是这些看似不起眼的步骤,确保了我们与服务器之间的稳定通信。其中最重要的步骤之一就是TCP连接的建立,而其中的核心环节就是三次握手。

本文将详细探讨三次握手的原理、过程以及其重要性。我们将一步步解析为什么需要三次握手,它如何保证连接的稳定性和可靠性,以及它对于数据传输的重要作用。通过深入理解三次握手,我们将更好地理解网络通信的底层机制,并对TCP连接的可靠性有更清晰的认识。

TCP 三次握手过程和状态变迁

TCP是一种面向连接的传输层协议,它在进行数据传输之前需要先建立连接。这个连接的建立过程是通过三次握手来完成的。

image

我们根据这幅图详细讲解,每次连接中所发送的TCP报文。

在最开始,客户端和服务端都处于CLOSED状态。首先,服务端主动监听某个端口,处于LISTEN状态,即服务器必须处于启动状态。接下来,客户端准备开始访问网页,需要与服务器建立连接。第一次连接报文的格式如下:

image

客户端在发起连接时,会随机生成一个初始序号(client_isn),并将其放置在TCP首部的"序号"字段中。同时,客户端将SYN标志位置为1,表示发出的报文是SYN报文。客户端通过发送第一个SYN报文给服务端,表明它希望与服务端建立连接。该报文不包含应用层数据(也就是发送的数据)。此时,客户端的状态被标记为SYN-SENT。

image

当服务端收到客户端的SYN报文时,首先服务端会随机初始化自己的序号(server_isn),然后将该序号填入TCP首部的"序号"字段中。接着,服务端将"确认应答号"字段填入client_isn + 1,并将SYN和ACK标志位都设置为1。最后,服务端将该报文发送给客户端,该报文不包含应用层数据(此时服务器也没数据可发)。此时,服务端处于SYN-RCVD状态。

image

一旦客户端收到服务端的报文,它需要做以下优化来回应最后一个应答报文:首先,客户端将该应答报文的TCP首部的ACK标志位设置为1;其次,客户端在"确认应答号"字段中填入server_isn + 1的值;最后,客户端将报文发送给服务端。此次报文可以携带客户端到服务器的数据。完成这些操作后,客户端将进入ESTABLISHED状态。

一旦服务器收到客户端的应答报文,它也会切换到 ESTABLISHED 状态。

从上面的过程可以发现,在进行三次握手时,第三次握手是可以携带数据的,而前两次握手则不可以。这也是面试中经常被问到的问题。一旦完成三次握手,双方都会进入ESTABLISHED状态,表示连接已经成功建立,此时客户端和服务端就可以开始相互发送数据了。

为什么是三次握手?不是两次、四次?

相信大家通常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。”这个回答没错,但它只是表面上的原因,并没有提出主要的原因。下面我将从三个方面分析三次握手的原因,加深我们对这个问题的理解。

  • 三次握手可以有效地避免历史重复连接的初始化(主要原因)
  • 三次握手可以保证双方都收到了可靠的初始序列号。
  • 三次握手可以避免资源浪费。

原因一:避免历史重复连接

简单来说,三次握手的主要原因是为了避免旧的重复连接初始化造成混乱。在复杂的网络环境中,数据包的传输并不总是按照规定时间发送到达目标主机,可能会因为网络拥堵等原因导致旧的数据包先到达目标主机。为了避免这种情况,TCP使用三次握手的方式来建立连接。

image

当客户端连续发送多个SYN建立连接的报文时,在网络拥堵等情况下,可能会出现以下情况:

  • 旧的SYN报文比最新的SYN报文先到达服务端。
  • 服务端收到旧的SYN报文后会回复一个SYN + ACK报文给客户端。
  • 客户端收到SYN + ACK报文后,根据自身的上下文判断这是一个历史连接(序列号过期或超时),然后发送RST报文给服务端,表示中止这次连接。

如果是两次握手的连接方式,就无法判断当前连接是否是历史连接。而三次握手可以在客户端准备发送第三次报文时,根据上下文判断当前连接是否是历史连接:

  • 如果是历史连接(序列号过期或超时),则第三次握手发送的报文是RST报文,以中止历史连接。
  • 如果不是历史连接,则第三次发送的报文是ACK报文,通信双方成功建立连接。

因此,TCP使用三次握手的主要原因是为了防止历史连接初始化了连接。

原因二:同步双方初始序列号

TCP协议的通信双方都必须维护一个序列号,这是确保可靠传输的关键因素。序列号在TCP连接中扮演了重要角色,它具有以下作用:

● 接收方可以消除重复的数据,确保数据的准确性。

● 接收方可以按照序列号的顺序接收数据包,保证数据的完整性。

● 序列号可以标识已经被对方接收的数据包,实现可靠的数据传输。

因此,在建立TCP连接时,客户端发送带有初始序列号的SYN报文,并需要服务器回复一个ACK报文,表示成功接收了客户端的SYN报文。然后,服务器发送带有初始序列号的SYN报文给客户端,并等待客户端的应答,这样一来一回,才能确保双方的初始序列号能够可靠地同步。

image

虽然四次握手也可以实现可靠地同步双方的初始序列号,但由于第二步和第三步可以合并为一步,所以最终演变成了三次握手。而两次握手只能保证一方的初始序列号被对方成功接收,无法保证双方的初始序列号都能被确认接收。因此,三次握手是为了确保TCP连接的稳定性和可靠性而采取的最佳选择。

原因三:避免资源浪费

如果只有"两次握手"的话,当客户端的SYN请求在网络中被阻塞时,客户端无法接收到服务器发送的ACK报文,因此会重新发送SYN。然而,由于没有第三次握手,服务器无法确定客户端是否收到了建立连接的ACK确认信号。因此,服务器只能在收到每个SYN请求后主动建立一个连接。这将导致以下情况的发生:

资源浪费:如果客户端的SYN请求被阻塞,导致重复发送多个SYN报文,服务器在收到请求后将建立多个冗余的无效连接。这将导致服务器资源的不必要浪费。

消息滞留:由于缺乏第三次握手,服务器无法知道客户端是否正确接收到了建立连接的ACK确认信号。因此,如果消息在网络中出现滞留,客户端将一直重复发送SYN请求,导致服务器不断建立新的连接。这将增加网络拥塞和延迟,并对整个网络性能产生负面影响。

image

因此,为了确保网络连接的稳定性和可靠性,TCP使用了三次握手来建立连接,以避免以上问题的发生。

总结

TCP连接建立是通过三次握手来完成的。在三次握手过程中,客户端首先发送一个带有SYN标志的报文给服务器,表示希望建立连接。服务器接收到客户端的请求后,回复一个带有SYN和ACK标志的报文给客户端,表示接受连接请求,并发送自己的初始序列号。最后,客户端再回复一个带有ACK标志的报文给服务器,表示连接建立成功。这样,双方就进入了ESTABLISHED状态,可以开始相互发送数据。

总的来说,TCP连接建立的三次握手过程是为了确保连接的稳定性和可靠性,避免历史连接的混乱和资源浪费,同时保证双方都具备接收和发送数据的能力。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
网络协议
TCP 三次握手:工作原理及重要性
【8月更文挑战第25天】
158 0
|
4月前
|
负载均衡 监控 网络协议
TCP四次挥手:为什么四次?原理大揭密!
**TCP四次挥手详解**:客户端发送FIN进入FIN-WAIT-1,服务器回ACK进CLOSE-WAIT;服务器发送FIN,客户端回ACK进TIME-WAIT,等待2MSL确保数据传输完毕,防止新旧连接混淆。四次挥手确保双方完全关闭连接,解决数据丢失问题。过多TIME-WAIT可通过负载均衡、优化关闭顺序或调整系统参数缓解。关注“软件求生”获取更多技术内容!
123 0
|
4月前
|
网络协议 程序员
为什么TCP需要三次握手?一文讲透!
**TCP三次握手摘要** TCP三次握手是建立可靠TCP连接的过程,包括: 1. 客户端发送SYN包,进入SYN_SENT状态。 2. 服务端回应SYN和ACK包,进入SYN_RCVD状态。 3. 客户端再次发送ACK包,双方进入ESTABLISHED状态,连接建立。 三次握手确保双方都能发送和接收数据,防止失效请求导致的资源浪费,并同步序列号以确保可靠性。
51 0
|
6月前
|
存储 网络协议 Java
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
【TCP 连接手段】C++编程视角下的TCP:短连接与长连接深度解析
180 1
|
6月前
|
网络协议
【掰开揉碎】WebSocket与TCP/IP
【掰开揉碎】WebSocket与TCP/IP
|
网络协议
07 tcp三次握手、四次挥手、十种状态
07 tcp三次握手、四次挥手、十种状态
266 0
|
网络协议 算法 测试技术
TCP 拥塞控制详解 | 5. 回避算法
TCP 拥塞控制详解 | 5. 回避算法
285 1
TCP 拥塞控制详解 | 5. 回避算法
|
网络协议 网络性能优化
重新认识 TCP 三次握⼿ 和 四次挥⼿
重新认识 TCP 三次握⼿ 和 四次挥⼿
65 0
|
存储 网络协议 算法
《我要进大厂》- 计算机网络夺命连环20问,你能坚持到第几问?(应用层协议 | TCP三次握手、四次挥手 | TCP可靠传输 | Cookie&Session)(下)
《我要进大厂》- 计算机网络夺命连环20问,你能坚持到第几问?(应用层协议 | TCP三次握手、四次挥手 | TCP可靠传输 | Cookie&Session)
《我要进大厂》- 计算机网络夺命连环20问,你能坚持到第几问?(应用层协议 | TCP三次握手、四次挥手 | TCP可靠传输 | Cookie&Session)(下)
|
网络协议 安全 机器人
《我要进大厂》- 计算机网络夺命连环20问,你能坚持到第几问?(应用层协议 | TCP三次握手、四次挥手 | TCP可靠传输 | Cookie&Session)(上)
《我要进大厂》- 计算机网络夺命连环20问,你能坚持到第几问?(应用层协议 | TCP三次握手、四次挥手 | TCP可靠传输 | Cookie&Session)
《我要进大厂》- 计算机网络夺命连环20问,你能坚持到第几问?(应用层协议 | TCP三次握手、四次挥手 | TCP可靠传输 | Cookie&Session)(上)