目录
前言
我们知道TCP协议的可靠性其中之一就是通过建立连接保持可靠性,TCP协议在发送数据之前,双方需要建立一条连接,在发送完成后,通信双方需要断开连接,这也就是TCP连接的简历和终止。
TCP的连接总共分为三个后阶段,建立连接->数据传输->以及断开连接这三个阶段。
我们主要讨论的也就是建立连接阶段,接下来是一个非常典型的TCP连接的建立的过程。
三次握手的意思其实就是服务器和客户端之间需要发送三个数据包,交换双方的初始序列号,以及确认双方的接受/发送能力正常,可以建立连接。
TCP建立连接---三次握手
建立连接的过程
TCP三次握手是建立TCP连接的过程,由客户端发起。以下是TCP三次握手的解析:
第一次握手:客户端发送SYN包(SYN=1,ACK=0)给服务器,请求建立连接。客户端随机选择一个初始序列号(ISN),用于后续通信的序列号计数。
第二次握手:服务器收到客户端的SYN包,如果同意建立连接,应该发送一个SYN+ACK包(SYN=1,ACK=1),其中SYN=1表示确认客户端的SYN包,ACK=1表示确认收到了客户端的序列号(即ISN+1),同时也随机选择一个序列号作为服务器的初始序列号。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送一个ACK包(SYN=0,ACK=1),表示确认收到了服务器的SYN+ACK包,同时也确认服务器的序列号(即服务器的ISN+1)。
至此,TCP三次握手完成,TCP连接建立。在建立连接后,数据通信可以开始。
TCP状态的含义
客户端
a. CLOSED:初始状态,表示客户端未发起连接。
b. SYN-SENT:客户端发送了SYN包,等待服务器的确认。
c. ESTABLISHED:客户端和服务器已经完成三次握手,连接已建立,可以进行数据传输。
服务器
a. CLOSED:初始状态,表示服务器未收到客户端的连接请求。
b. LISTEN:服务器正在监听客户端的连接请求。
c. SYN-RECEIVED:服务器收到了客户端的SYN包,等待发送SYN+ACK包确认。
d. ESTABLISHED:服务器和客户端已经完成三次握手,连接已建立,可以进行数据传输。
这是一个典型的三次握手过程,通过上面 3 个报文段就能够完成一个 TCP 连接的建立。三次握手的的目的不仅仅在于让通信双方知晓正在建立一个连接,也在于利用数据包中的选项字段来交换一些特殊信息,交换初始序列号。
一般首个发送 SYN 报文的一方被认为是主动打开一个连接,而这一方通常也被称为客户端。而 SYN 的接收方通常被称为服务端,它用于接收这个 SYN,并发送下面的 SYN,因此这种打开方式是被动打开。
TCP 建立一个连接需要三个报文段,释放一个连接却需要四个报文段。
三次握手的意义
我认为三次握手的意义之一就是可以确认服务器和客户端双方的接受数据和发送数据的能力是正常的,三次握手的“三次”其实是建立连接需要的数据包的最小量,服务器和客户端最少需要三次才可以确认双方的接受/发送能力是没问题的,可以建立连接并且发送数据。
虽然更多的握手次数依然可以的,但是这样冗杂的过程,反而会更加降低数据传输的效率,所以三次握手的“三次”是最佳次数,少于三次,无法建立稳固的连接,少于三次,没必要,会降低传输的效率,故三次握手最好。
如果握手次数减少到两次,可能会导致以下情况:
-
第一次握手时,客户端发送SYN包给服务器,但由于网络延迟等原因,这个SYN包被延迟了,此时客户端认为连接已经建立成功,可以开始发送数据包。
-
第二次握手时,服务器收到客户端的SYN包后,发送SYN+ACK包给客户端,但由于网络延迟等原因,这个SYN+ACK包被延迟了,此时客户端仍然没有收到服务器的回复,会认为连接建立失败,重新发送SYN包。
-
在第三次握手时,客户端收到了服务器的SYN+ACK包,但ACK包丢失了,此时服务器会认为连接建立失败,会重新发送SYN+ACK包,这样就会导致多个连接建立,以及重复发送数据包等问题。
因此,TCP三次握手是为了确保可靠的数据传输连接而设计的,是必要的。