TCP/IP协议中的三次握手
我们首先来了解一下TCP
TCP(Transmission Control Protocol,传输控制协议) 是一个面向连接的、可靠的、基于字节流的传输层通信协议。以下是 TCP 的一些主要特点:
面向连接:在数据传输之前,TCP 必须先建立连接(三次握手),在数据传输结束后,还要终止这个连接(四次挥手)。
可靠性:TCP 通过序列号、确认和重传机制来确保数据的可靠传输。如果数据包在传输过程中丢失或损坏,接收方会请求发送方重传该数据包。
流量控制:TCP 使用滑动窗口机制来实现流量控制,确保发送方不会发送过多的数据,以至于接收方无法处理。
拥塞控制:TCP 通过慢开始、拥塞避免、快重传和快恢复等算法来避免网络拥塞。
全双工通信:TCP 允许通信双方的应用程序在任何时候都能发送和接收数据。
TCP 的三次握手机制
- 最开始,客户端和服务端都处于CLOSE状态,服务端监听客户端的请求,进入LISTEN状态
- 客户端端发送连接请求, 第一次握手 (SYN=1, seq=x),发送完毕后,客户端就进入 SYN_SENT 状态服务端确认连接, 第二次握手 (SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端就进入 SYN_RCV 状态。
- 客户端收到服务端的确认之后,再次向服务端确认,这就是 第三次握手 (ACK=1,ACKnum=y+1),发送完毕后,客户端进入ESTABLISHED状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态.
可以这样去理解
-
第一次握手,客户端正常去发送信息.服务器确认到了客户端发送能力没有问题.
-
第二次握手,当服务器能够接收到了客户端的信息,说明服务器的接受信息没有问题,所以发出消息让客户端知道自己的接受信息能力没有问题,同时也能让客户端知道它的发送能力没有问题.这一步客户端确认了服务器端接收消息和发送消息都没有问题,也确认自己第一次握手发出的消息能够正常发送,说明自己的发送能力没有问题.
-
第三次握手,客户端接收到信息,知道服务端发送能力和接受能力都没有问题,但是服务器端还不知道客户端能不能够正常的接受信息.所以此时客户端第三次握手就是为了让服务器端知道,客户端能够正常接受信息.
也就是三次握手的目的是让客户端知道服务器端接收和发送都没有问题,通过服务器的反馈也知道自己的接收和发送没有问题.同样服务器端知道客户端接收和发送没有问题,通过客户端的反馈也知道自己的接收和发送没有问题
那为什么不能是两次呢?
-
确认双方的发送和接收能力 :在两次握手的情况下,只有客户端向服务器发送请求建立连接的SYN包,服务器收到后确认即可建立连接。但是这种情况下,客户端无法确认服务器是否能够接收到自己的请求,也无法确认服务器是否具备发送能力。因此,需要进行第三次握手,以确保双方都具备发送和接收数据的能力。
-
防止已失效的连接请求建立 :如果客户端发送了连接请求后,由于网络问题或其他原因导致该请求在某个网络节点长时间滞留,而客户端并未收到服务器的响应。此时,客户端可能会再次发送连接请求,而服务器可能已经建立了一个旧的连接。如果握手只进行两次,那么服务器将无法区分这是一个新的连接请求还是一个旧的连接请求,从而可能导致数据混乱。通过进行三次握手,可以避免这种情况的发生。
-
同步双方初始序列号:
三次握手的第二个重要原因是同步双方的初始序列号。TCP是一个字节流协议,它使用序列号来确保数据的按序到达。在三次握手的过程中,双方会交换初始序列号,以便在后续的数据传输中能够正确地识别和处理接收到的数据。
那为什么不是四次呢?
简单说,就是三次挥手已经足够创建可靠的连接,没有必要再多一次握手导致花费更多的时间建立连接。
标签:面试题,IP,握手,TCP,发送,接收,连接,客户端 From: https://blog.csdn.net/m0_65013257/article/details/139723797