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

2024-08-24 13:12

本文主要是介绍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连接建立的三次握手过程是为了确保连接的稳定性和可靠性,避免历史连接的混乱和资源浪费,同时保证双方都具备接收和发送数据的能力。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

这篇关于TCP连接的关键之谜:揭秘三次握手的必要性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102578

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

无线领夹麦克风什么牌子好用?揭秘领夹麦克风哪个牌子音质好!

随着短视频行业的星期,围绕着直播和视频拍摄的电子数码类产品也迎来了热销不减的高增长,其中除了数码相机外,最为重要的麦克风也得到了日益增长的高需求,尤其是无线领夹麦克风,近几年可谓是异常火爆。别看小小的一对无线麦克风,它对于视频拍摄的音质起到了极为关键的作用。 不过目前市面上的麦克风品牌种类多到让人眼花缭乱,盲目挑选的话容易踩雷,那么无线领夹麦克风什么牌子好用?今天就给大家推荐几款音质好的

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品,常闻有言称存在无需考量负债与查询记录之奇品,此等说法十有八九为中介诱人上钩之辞。轻信之下,恐将步入连环陷阱。除非个人资质出类拔萃,如就职于国央企或事业单位,工龄逾年,五险一金完备,还款能力卓越,或能偶遇线下产品对查询记录稍显宽容,然亦非全然无视。宣称全然不顾者,纯属无稽之谈。 银行非慈善机构,不轻易于困境中援手,更偏爱锦上添花之举。若无坚实资质,即便求助于银行亦难获青睐。反

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A