TCP 握手两次不行吗?
有个小伙伴出去面试被问到这个问题,回来发微信问松哥,一起来聊一聊这个话题。
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它主要用于从网络的一个主机向另一个主机提供数据传输服务。TCP 协议的”三握四挥”通常指的是 TCP 连接的建立和终止过程中的三次握手和四次挥手。
一 三握
SYN(同步序列编号):客户端发送一个带有 SYN 标志位的 TCP 段给服务器,以开始一个连接。这个段还包含一个随机生成的序列号(ISN)。
SYN-ACK(同步-确认):服务器收到客户端的 SYN 段后,如果同意建立连接,会发送一个带有 SYN 和 ACK(确认)标志位的 TCP 段作为响应。服务器的 SYN 段也包含一个序列号,并且对客户端的序列号进行确认。
ACK(确认):客户端收到服务器的 SYN-ACK 段后,会发送一个带有 ACK 标志位的 TCP 段作为最终响应。这个段对服务器的序列号进行确认。
完成这三次握手后,TCP 连接就建立起来了,数据可以开始在客户端和服务器之间传输。
二 四挥
FIN(结束):当客户端或服务器想要关闭连接时,它会发送一个带有 FIN 标志位的 TCP 段,表示它已经完成发送数据。
ACK(确认):服务端接收到 FIN 段会发送一个 ACK 段作为响应,确认已经收到了客户端的 FIN 段。
FIN(结束):服务端在发送完 ACK 后,如果它也完成了数据发送,会发送自己的 FIN 段给客户端。
ACK(确认):客户端收到这个 FIN 段后,会发送最后一个 ACK 段给服务端作为最终确认。
这四次挥手确保了 TCP 连接的双方都能安全地关闭连接,并且双方都确认了数据的发送和接收。
三 为什么三握
三次握手主要是考虑下面一些问题:
初始化序列号:三次握手允许客户端和服务器交换初始序列号(ISN),这是 TCP 连接中数据传输的基础。每个方向上的通信都需要一个序列号来确保数据包的顺序和完整性。
避免已失效的连接请求突然传输:假设没有三次握手,客户端发送了一个 A 请求,但因为某些原因 A 请求在网络中延迟了,然后客户端重新发送了一个 B 请求并成功建立了连接。如果服务器后来又收到 A 请求并建立了连接,那么这个连接就是无效的,因为客户端已经放弃了它。三次握手确保了服务器对客户端的连接请求进行了确认,并且客户端也确认了服务器的确认。
确保双方都准备好进行数据传输:第一次握手:客户端发包,服务端收到了。服务端就知道客户端的发送能力、服务端的接收能力正常;第二次握手:服务端发包,客户端收到了。客户端就知道服务端的接收、发送以及客户端的接收、发送是正常的;第三次握手:客户端发包,服务端收到了。服务端就知道客户端的接收、发送正常,服务端自己的发送、接收也正常。
防止资源浪费:如果没有三次握手(比如两次握手),服务器可能会在没有客户端确认的情况下分配资源,这可能导致资源浪费,因为客户端可能并没有准备好或者已经不再需要连接。
防止重复连接:在某些情况下,客户端可能会因为网络问题或其他原因多次发送相同的连接请求。如果没有三次握手,服务器可能会为每个请求分配资源,导致资源的不必要分配。通过三次握手,服务器可以确认客户端的意图,并避免为重复的请求分配资源。
全双工通信的确认:TCP 是一个全双工协议,这意味着数据可以在两个方向上独立传输。三次握手确保了两个方向上的通道都已经被建立和确认。
简而言之,三次握手是 TCP 协议确保连接的可靠性和数据传输的完整性的关键机制。它通过交换序列号和确认信息,确保了连接的双方都准备好进行通信,并且连接是有效和活跃的。
四 为什么四挥
需要四次挥手,则主要是考虑到下面一些问题:
确保数据传输完成:在 TCP 连接中,数据传输是双向的。当一方完成数据发送并准备关闭连接时,它需要确保另一方也完成了数据的发送和接收。四次挥手允许双方独立地关闭各自的发送通道。
防止数据丢失:当一方发送 FIN 标志位来表示它已经完成发送数据时,它可能还在接收来自另一方的数据。四次挥手确保了即使在关闭连接的过程中,接收方也可以继续接收和处理来自发送方的数据,直到它也发送了 FIN。
防止数据重复:在网络中,数据包可能会因为各种原因被重复发送。如果一方在没有收到另一方的确认就关闭连接,那么可能会丢失或重复处理数据。四次挥手通过确保双方的确认,减少了数据重复的可能性。
防止资源泄露:TCP 连接使用系统资源,如内存和缓冲区。四次挥手确保了在连接不再需要时,这些资源可以被正确释放,防止资源泄露。
确认双方的关闭意图:四次挥手允许双方独立地确认它们都同意关闭连接。这确保了连接的关闭是双方协商的结果,而不是单方面的决定。
处理延迟或丢失的确认:在网络通信中,确认消息可能会因为网络问题而延迟或丢失。四次挥手通过发送额外的确认消息,确保即使在确认消息丢失的情况下,连接也能够被正确关闭。
处理不同步的关闭请求:在某些情况下,客户端和服务器可能几乎同时发送 FIN 来关闭连接。四次挥手允许处理这种情况,确保双方都能够完成关闭过程。
允许半关闭状态:在 TCP 中,可以存在半关闭状态,即一方已经停止发送数据,但仍然可以接收数据。四次挥手允许这种状态的存在,直到双方都准备好完全关闭连接。
四次挥手是 TCP 协议确保连接能够安全、可靠地关闭的关键机制。四次挥手能够确保客户端和服务端都有机会完成数据传输、确认关闭意图,并正确释放资源,从而避免了数据丢失、重复和资源泄露等问题。