阅读导航
- 引言
- 一、TCP的三次握手
- 1. 简介
- 2. 图解三次握手
- 3. 名词解释
- (1)SYN(同步序列编号)包
- (2)SYN-ACK(同步确认)包
- (3)ACK(确认)包
- 4. 三次握手的步骤总结
- 5. 为什么要三次握手,两次或者四次可以吗?
- (1)为什么要三次握手?
- ⭕防止旧的重复连接请求
- ⭕确保连接的双向性
- ⭕确保双方的初始序列号同步
- ⭕避免不必要的连接建立和SYN洪泛攻击
- (2)为什么两次握手不适用?
- 🚩无法确认接收能力
- 🚩无法防止重复连接
- 🚩序列号同步问题
- 🚩无法避免资源浪费
- 🚩安全性问题
- 🚩无法确认双方状态
- (3)为什么四次或多次握手不适用?
- 🍟效率降低
- 🍟资源浪费
- 🍟复杂性增加
- 🍟无额外好处
- 二、TCP的四次挥手
- 1. 简介
- 2. 图解四次挥手
- 3. 名词解释
- 4. 四次挥手的特点
- 5. 为什么 TCP 关闭连接为什么要四次挥手而不是三次挥手?
- 温馨提示
引言
在网络通信的世界里,TCP协议以其可靠性和效率而闻名。今天,我们将更进一步,揭开TCP协议中的两个核心过程:三次握手和四次挥手。这两个过程不仅确立了数据传输的开始和结束,而且确保了连接的稳定性和数据的有序交换。让我们开始这段探索之旅,深入了解TCP协议如何通过这三个简单的步骤来建立一个稳固的通信桥梁,以及如何通过四个优雅的步骤来优雅地结束通信会话。
一、TCP的三次握手
1. 简介
为了确保客户端与服务器之间能够建立一个稳定且可靠的连接,TCP协议在连接建立阶段实施了三次握手过程。这个过程至关重要,因为它通过三次交互来验证双方的发送和接收功能是否正常工作。简而言之,三次握手确保了以下两点:
- 客户端能够发送数据给服务器,并且服务器能够成功接收这些数据。
- 服务器能够发送数据给客户端,并且客户端能够成功接收这些数据。
通过这种确认机制,TCP协议能够建立一个双向通信的可靠通道,为数据传输的稳定性和效率打下基础。
✅举一个生活中的例子大家会更好理解一点,场景:小杨想要将一批文件递交给经理,于是发生了以下对话:
小杨:“经理,您现在有空吗?我这里有一些文件需要您审阅。”(这相当于TCP的第一次握手,小杨询问经理是否准备好接收文件。)
经理:“有空,我在办公室,你可以直接过来。”(这相当于TCP的第二次握手,经理确认自己已经准备好,并且告知小杨可以开始递交文件。)
小杨:“明白了,我马上过来。”(这相当于TCP的第三次握手,小杨确认了经理的回复,并告知自己即将开始递交文件的动作。)
通过这样的对话,双方确认了彼此都准备好进行文件的递交和接收,确保了信息的顺利传递。这个过程与TCP三次握手的原理相似,都是通过一系列的确认来建立一个可靠的通信过程。
2. 图解三次握手
3. 名词解释
(1)SYN(同步序列编号)包
⭕客户端选择一个初始序列号(ISN)并发送一个SYN包到服务器。这个包中,SYN标志位被设置为1,表示希望建立连接,同时客户端的ISN被发送给服务器。
(2)SYN-ACK(同步确认)包
⭕服务器接收到客户端的SYN包后,如果同意建立连接,会发送一个SYN-ACK包作为响应。服务器同样选择一个初始序列号,并在包中设置SYN和ACK标志位为1。ACK标志位表示这是一个对客户端SYN包的应答,并且包含了服务器的确认序列号(ACK),通常是客户端ISN加1。
(3)ACK(确认)包
⭕客户端接收到服务器的SYN-ACK包后,会发送一个ACK包来完成握手过程。这个包中,ACK标志位被设置为1,并且包含服务器ISN加1的确认序列号,表明客户端已经接收到并确认了服务器的SYN-ACK包。
4. 三次握手的步骤总结
- 客户端 发送一个SYN包,告诉服务器:“我准备好了,你可以给我发送数据了。”
- 服务器 收到SYN包后,回复一个SYN-ACK包,表示:“我准备好了,你可以给我发送数据了,这是我的初始序列号。”
- 客户端 收到SYN-ACK包后,发送一个ACK包,表示:“我收到了你的初始序列号,现在我们可以开始通信了。”
5. 为什么要三次握手,两次或者四次可以吗?
(1)为什么要三次握手?
⭕防止旧的重复连接请求
如果网络延迟导致旧的连接请求在新的连接请求之后到达,三次握手可以确保旧的连接请求由于序列号不匹配而被忽略,从而避免建立不必要的连接。
⭕确保连接的双向性
三次握手确保了连接是双向的,即客户端可以向服务器发送数据,服务器也可以向客户端发送数据。
⭕确保双方的初始序列号同步
TCP通信依赖于数据包的序列号来保证数据的顺序和完整性。三次握手过程中,客户端和服务器交换初始序列号,确保双方对数据传输的起始点达成共识:
- 序列号同步:通过三次握手,双方可以确认对方的序列号,保证数据传输的正确性和顺序性。
⭕避免不必要的连接建立和SYN洪泛攻击
TCP的三次握手还有助于避免不必要的连接建立,节约资源,并防止SYN洪泛攻击:
- 资源节约:三次握手确保只有在双方都准备好时才建立连接,避免了因误判而创建的不必要连接。
- 防止SYN洪泛攻击:通过确保连接请求的有效性,三次握手机制减少了服务器资源的不必要消耗,提高了安全性。
(2)为什么两次握手不适用?
两次握手不足以建立一个稳定和可靠的TCP连接,因为它不能确保双方的接收和发送能力,也不能有效防止重复连接和资源浪费,同时还增加了受到网络攻击的风险。
🚩无法确认接收能力
- 在两次握手中,客户端发送SYN包以发起连接请求,服务器响应SYN-ACK包以确认接收到请求并准备好发送数据。然而,这个过程并没有给服务器一个机会来确认客户端是否已经准备好接收数据。
🚩无法防止重复连接
- 如果客户端的连接请求因为网络延迟而没有及时到达服务器,客户端可能会重新发送一个SYN包。如果两次握手,服务器可能会对每个SYN包都建立一个连接,导致多个不必要的连接建立。
🚩序列号同步问题
- TCP使用序列号来确保数据包的顺序和完整性。三次握手允许客户端和服务器交换各自的初始序列号,而两次握手则无法完成这一同步过程。
🚩无法避免资源浪费
- 如果服务器在两次握手后开始发送数据,但客户端由于某些原因(如网络问题或客户端故障)未能接收到这些数据,服务器可能会浪费资源在无效的连接上。
🚩安全性问题
- 两次握手可能使服务器更容易受到SYN洪泛攻击,攻击者可以发送大量的SYN包,使服务器创建大量半开放连接,消耗服务器资源。
🚩无法确认双方状态
- 两次握手无法确保双方都处于活跃状态并准备好进行通信。三次握手提供了双方确认对方状态的机会。
(3)为什么四次或多次握手不适用?
🍟效率降低
- 增加握手次数会延长连接建立的时间,导致通信效率降低。TCP协议追求的是快速建立连接并开始数据传输。
🍟资源浪费
- 每次握手都需要消耗网络资源和处理能力。额外的握手会增加服务器和客户端的负载,尤其是在高并发场景下,这可能导致资源的不必要浪费。
🍟复杂性增加
- 增加握手次数会使得协议更加复杂,这不仅增加了实现的难度,也增加了出错的可能性。
🍟无额外好处
- 三次握手已经能够确保双方的接收和发送能力,以及序列号的同步,额外的握手步骤并不会带来额外的好处。
综上所述,TCP的三次握手是一个经过精心设计和优化的过程,它平衡了效率、可靠性和安全性,而四次或多次握手则会带来不必要的复杂性和资源消耗,没有明显的益处。
二、TCP的四次挥手
1. 简介
🚨建立TCP连接需要三次握手,终止TCP连接需要四次挥手,连接的终止通常需要四次握手,这个过程被称为TCP的"四次挥手"。
-
第一次挥手:主动关闭方(可以是客户端或服务器)发送一个FIN(结束)标志位被设置为1的TCP段,用来关闭主动方到被动方的数据传输。这表示主动方已经没有数据要发送了,但仍然可以接受数据。
-
第二次挥手:被动关闭方接收到FIN后,发送一个ACK(确认)标志位被设置为1的TCP段,作为对FIN的确认。这表示被动方已经知道主动方没有数据要发送了。
-
第三次挥手:被动关闭方发送一个FIN标志位被设置为1的TCP段,请求关闭其到主动方的数据传输。
-
第四次挥手:主动关闭方接收到这个FIN后,发送一个ACK标志位被设置为1的TCP段作为对被动方FIN的确认。至此,TCP连接被完全关闭。
在整个过程中,每个FIN和ACK都需要被对方确认,确保双方都清楚连接即将关闭。这个过程确保了TCP连接的可靠性和数据传输的完整性。四次挥手是TCP协议的一个重要特性,它允许双方在关闭连接时都能清楚地知道对方的意图,从而避免数据丢失或错误。
✅举一个生活中的例子大家会更好理解一点,场景:小杨已经将一批文件递交给经理准备辞职离开公司的时候,发生了以下对话:
小杨的辞职意向(第一次挥手):
小杨对经理说:“经理,这些文件的内容您也已经看完了,我决定离开公司。” 这相当于TCP连接中的主动方发送一个FIN(结束)标志位,表示小杨已经完成了他的工作,并且希望结束与公司的联系。
经理的初步回应(第二次挥手):
经理回答:“好的,我知道了,你离开吧。” 这相当于TCP连接中的被动方发送一个ACK(确认)标志位,表示经理已经收到了小杨的辞职意向,并同意结束当前的工作关系。
经理的再次考虑请求(第三次挥手):
经理随后说:“你不再考虑一下吗?” 这相当于TCP连接中的被动方发送另一个FIN标志位,表示经理希望重新评估当前的情况,可能是出于对小杨离职可能带来的影响的考虑。
小杨的最终决定(第四次挥手):
小杨坚定地回答:“我已经考虑好了。” 这相当于TCP连接中的主动方发送最后一个ACK标志位,表示小杨已经坚定了自己的决定,双方都同意结束工作关系,可以正式关闭连接。
2. 图解四次挥手
四次挥手的目的是确保双方都能完全接收到对方的数据,并且在双方都准备好关闭连接时,才正式关闭TCP连接。这个过程中,每个FIN都需要一个ACK作为确认,确保了连接的可靠关闭。
3. 名词解释
-
第一次挥手(FIN):
- 客户端完成数据发送后,决定关闭连接,并向服务器发送一个FIN(结束)标志位被设置为1的TCP段。这表示客户端已经完成发送数据,请求关闭连接。
-
第二次挥手(ACK):
- 服务器接收到客户端的FIN后,发送一个ACK(确认)标志位被设置为1的TCP段作为响应。这个ACK是对客户端FIN的确认,表示服务器已经知道客户端准备关闭连接。
-
第三次挥手(FIN):
- 服务器在发送完剩余数据后,也决定关闭连接,向客户端发送一个自己的FIN标志位被设置为1的TCP段。这表示服务器也完成了数据发送,请求关闭连接。
-
第四次挥手(ACK):
- 客户端接收到服务器的FIN后,发送最后一个ACK标志位被设置为1的TCP段作为响应。这个ACK是对服务器FIN的确认,表示客户端已经知道服务器准备关闭连接,并且双方都同意关闭连接。
4. 四次挥手的特点
-
不同步关闭:客户端和服务器可以几乎同时开始关闭连接,但这不是必须的。一方可能在另一方发送FIN之前就已经准备好发送自己的FIN。
-
TIME_WAIT状态:在客户端发送最后一个ACK之后,它会进入TIME_WAIT状态,等待足够的时间以确保服务器接收到最终的ACK。这是为了防止服务器由于网络延迟而未能接收到最终的ACK,导致它重新发送FIN。
-
半关闭状态:在服务器接收到客户端的FIN但还没有准备好发送自己的FIN时,连接会进入半关闭状态。在这种状态下,客户端已经不能发送数据,但服务器仍然可以发送数据。
5. 为什么 TCP 关闭连接为什么要四次挥手而不是三次挥手?
当TCP服务器接收到来自客户端的FIN(结束)报文段时,它可能还有剩余的数据需要发送给客户端。因此,服务器不能立即关闭连接。作为对客户端FIN报文的响应,服务器首先会发送一个ACK(确认)报文段,表示它已经接收到了客户端的关闭请求。
尽管已经开始关闭过程,服务器仍然可以继续向客户端发送任何剩余的数据。在所有待发送的数据都成功传输之后,服务器会向客户端发送自己的FIN报文段,这表明服务器已经完成数据传输,并准备关闭它的发送通道。
客户端接收到服务器的FIN报文后,会发送一个ACK报文作为应答,确认它已经接收到服务器的关闭请求。这个过程确保了客户端有机会接收和确认服务器发送的所有数据。
总结来说,TCP连接的关闭需要四次挥手,以确保数据的完整传输和确认,以及连接的有序关闭。这个过程允许服务器在关闭连接之前完成数据的发送,同时允许客户端确认接收到所有数据,并最终同意关闭连接。
温馨提示
感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!
再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!