“什么是三TCP次握手、四次断开?”
这个问题很经典,如果你在面试中只被问到了一个关于 TCP 的问题,那大概率就是关于三次握手的问题。TCP 的重要特性之一就是面向连接,连接双方在发送数据之前必须经历握手的阶段,具体的过程我将展示出来。咱往下看。
三次握手
建立连接的过程称为握手,握手需要在客户端和服务器之间交换三个TPC报文段。
举一个简单的例子,每扇门都有属于自己的特定钥匙,钥匙丢了,你就无法打开它们了。
虽然此例子并不那么恰当,但是可以类比到三次握手的原因上。如果客户端和服务端有一方出现了
问题,那么它们之间的通讯、资源传输必定会出问题
因此, TCP三次握手的作用就是使客户端和服务端双方都明确自己的责任,保证双方都具有资源接收和发送的能力
为了方便理解,下面我将结合图片进行讲解
字符释意:
- ACK: 确认报文段
- ack: 确认号
- SYN: 发送连接请求 / 接收报文段
- seq: 发送数据的第一个字节的序号
- 图例中的Ss、Sa分别表示 Server send、Server accept(服务端发送能力、服务端接收能力);Cs、Ca分别表示 Client send、Client accept(客户端发送能力、客户端接收能力)
客户端与服务端资源收发的三次握手过程:
1.第一次握手
第一次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:
服务端接收、客户端发送服务正常
2.第二次握手
第二次握手由服务端发送资源包给到客户端,若该过程正常,则得出结论:
服务端发送、客户端接收服务正常
3.第三次握手
第三次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:
服务端接收、客户端发送服务正常
(可能会有小伙伴问了,为什么还要进行第三次握手,前两次不是已经得出服务端客户端接收都正常了吗。其实不是的,第一、二次握手只是在单独的过程中得出服务正常的结论,但是在第二次握手结束后,服务端的接收能力和客户端的发送能力未知,这时候便有了TCP的第三次握手过程)。
然后通过这三次的握手过程我们可以知道:第二次其实是对第一次握手的补充,而第三次是对第二次握手的补充,最终才能使客户端和,服务端都确认自己的接收、发送能力正常,之后方可进行通信。
(这就跟我们打电话一样,拨通之后不还得先喂两声确定通没通嘛。)
并且,要完成两者状态的监测,这之间至少需要三次过程,两次并不足以判断自身的服务态。每一个步骤都相互关联,下一次握手的“响应”由上一次“请求“触发,每次握手得出的结论都是对上一次结果的补充,从而得出最终结果
三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(ack)”实现的。
四次挥手
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它可以让计算机释放不再使用的资源。如果连接不能正常断开,会造成数据传输错误,而且持续占用资源。
而关闭连接时,服务端收到客户端的FIN报文时,仅表示对方不再发送数据,但仍然能够接收数据。注意,此时服务端不一定将全部数据都发送给了客户端
因此服务端关闭有两种方式:
-
立即关闭
-
继续发送一些数据给客户端后,再发送FIN报文给客户端(表示同意关闭连接),是否立刻关闭发送数据通道,需交由上层应用决定
所以,客户端的ACK和FIN一般都会分开发送,这里就会导致次数增加一
数据传输完毕后,双方均可释放连接。起初,客户端和服务端均处于ESTABLISHED状态,然后是客户端主动关闭,服务器被动关闭
整个过程差不多如下图:
字符释意:
-
FIN:连接终止位
-
seq:发送的第一个字节的序号
-
ACK:确认报文段
-
ack:确认号
四次挥手过程:
1.第一次挥手
-
客户端发送第一次挥手,之后由ESTABLISHED状态转为FIN-WAIT-1状态
-
服务器收到客户端的第一次挥手之后,发送第二次挥手给服务器,服务器进入CLOSE-WALT状态
2.第二次挥手
-
客户端收到服务器的第二次挥手,进入FIN-WAIT-2状态,等待服务器关闭
3.第三次挥手
-
服务器发送第三次挥手,然后进入LAST-ACK状态客户端收到第三次挥手,发送第四次挥手,客户端进入TIME-WAIT状态;
4.第四次挥手
-
服务器收到第四次挥手,进入CLOSED状态,随后客户端也进入CLOSED状态
我举一个例子:(只是一个大概,方便理解)
- A:“任务处理完毕,我希望断开连接。”
- B:“哦,是吗?请稍等,我准备一下。”
- 等待片刻后……
- B:“我准备好了,可以断开连接了。”
- A:“好的,谢谢合作。”
最后TCP的 状态转换过程就跟下面这张图差不多: