1.三次握手的概述
我们在学网络的概念时,每当讲到TCP都会听到三次握手和四次挥手,一直以来可能都对这个概念模糊不清,那么什么是三次握手和四次挥手呢?简单的举一个例子,如果我们和朋友打游戏,我们要和朋友往往都是连麦打游戏,那么我们和朋友之间需要相互确认我们都开麦了。这个过程我会发出一个信号说我开麦了,与此同时呢,朋友会确认他能够听到我的说话声,同时给我发一个信号,让我能够知道他开麦了,最后我也返回一个信号说好的我能听到你也开麦了。其实这个过程就与三次握手的过程类似,主要是进行一个测试的操作,对连麦进行一个测试,而不是在打游戏,可以说不涉及到核心业务的操作,不携带业务数据的数据报,只是用来“打个招呼”。这里的确认能听到就类似于TCP传输过程中的确认应答的特性,能够保证TCP的可靠传输,我们的相互回答就对应了TCP传输过程中的ACK标志位设置为1。
2.三次握手的讲解
三次握手就是建立连接的过程:其实就是通信双方,各自保存对端的信息
具体完成上述过程需要经过三次网络的交互。
这里 SYN代表同步报文,而ACK是应答报文。
三次握手的第一次,一定是由客户端先发起的,谁先发起谁就是客户端。
SYN数据报的一些作用
SYN数据报不携带任何业务数据。在网络通信中,SYN(Synchronize)是TCP三次握手中的第一步,用于建立TCP连接。SYN数据报仅包含TCP头部,用于在客户端和服务器之间进行连接的初始化。它不携带任何实际的业务数据,只包含一些必要的控制信息,如源端口、目的端口、序号等。SYN数据报的目的是在发送端和接收端之间同步序号和其他连接参数,以确保双方能够正确地建立连接并开始数据传输。一旦建立了连接,后续的数据传输将使用带有有效业务数据的数据报。因此,SYN数据报本身不携带任何业务数据。
实质上三次握手第二步合并了客户端所发来的信息,本来是四次传输,但是三次传输能带来更高的效率,因此把接收方的回复合并在一起。而我也用一个暗恋对象的例子帮助大家理解这个过程
这真是个悲伤的故事😭
总结:三次握手的时候,通信双方让各自对方保存好自己的信息,得是两边都把对方的信息保存好,连接才算是真正建立完成!而上述操作其实就是把第二步的ACK和SYN合并成一个网络数据!三次握手相当于投石问路,在正式传输业务数据之前,先确认一下通信链路是否畅通。相当于TCP可靠传输的一种保证方式,但是这只是辅助机制,最核心的还是确认应答和超时重传。与此同时,TCP三次握手的过程中,还需要协商一些必要的参数,比如说TCP通信时使用的序号,可能序号不是从0或1开始。发送序号还会有一个确认序号,这个确认序号和序号之间往往不会差很多,因为是一个连接过程,如果差的多说明出现了异常。
3.经典面试题
为什么TCP要进行三次握手?两次行不行,四次行不行?
两次:不行,因为服务器这边对于通信双方的发送能力和接收能力的验证还没有完成。
四次:行,但是没有必要,拆开中间的这次交互,虽然不影响TCP的正常功能,但是性能会有所损失。
如果在服务器这边见到了大量的CLOSE_WAIT状态说明了什么?说明代码大概率有bug了,代码很有可能忘记调用socket.close了 或则说socket.close调用的不够及时
4.TCP常见状态
Listen状态
listen:是服务器出现的状态,当服务器绑定端口成功后,就会进入到listen状态。这时候就意味着随时可以有客户端可以过来连接。这里类比接电话的过程,就是手机开机了,信号还不错,随时可以有人打电话过来了。
Established状态
Established:客户端喝服务器都会出现的状态,表示建立完成,可以随时进行后续的通信了。
CLOSE_WAIT状态
CLOSE_WAIT状态:被动一方进入的状态:等待代码调用close,代码中调用的越及时,越看不到这个状态。
5.四次挥手是为了释放资源
FIN结束报文就是finish的缩写。与三次握手不一样的是,三次握手一定是客户端第一次发起请求,而四次挥手就不一定了,有可能是客户端发起,也有可能是服务器发起请求。类比来说,谈恋爱之前,一般男追女,分手的时候双方都有可能提出。断开连接是客户端和服务器通信双方删除对方的信息。在实际的代码中,客户端可以调用socket.close方法或者客户端进程结束。
6. ACK、SYN、FIN和RST标识位
下面是对ACK、SYN、FIN和RST这些TCP标志的作用的简要总结:
-
ACK(Acknowledgment):用于确认接收方已经成功接收到数据。ACK标志在数据包中被设置为1时,表示该数据包是一个确认数据包,用于确认对方发送的数据已经成功接收。
-
SYN(Synchronize):用于建立连接的同步标志。当客户端希望与服务器建立连接时,它会发送一个带有SYN标志的数据包,其中包含自己选择的初始序列号。这样可以告知服务器客户端的初始序列号,并请求服务器分配自己的序列号。
-
FIN(Finish):用于结束连接的标志。当一方希望关闭连接时,它会发送一个带有FIN标志的数据包,表示它已经完成了数据传输,并要求对方确认关闭连接。
-
RST(Reset):用于重置连接的标志。当发生某种错误或异常情况时,一方可以发送一个带有RST标志的数据包,用于中断连接并强制对方重置连接。
这些TCP标志位在TCP协议中起着重要的作用,用于控制连接的建立、终止和异常情况处理。它们的正确使用和处理对于建立可靠的连接和确保数据传输的正确性至关重要。