计算机网络——三次握手四次挥手

301 阅读4分钟

简介

最近一直在学计算机网络,而计算网络在前端面试中也是一大热门考点,其中TCP协议又是重中之重,而了解TCP对应的三握四挥,有助于帮我们在前端的领域走的更广,也是提高自身的计算机科学素养,下面就来简述下相关的一些知识。

三次握手

什么是三次握手?也就是TCP建立连接时,客户端和服务端一共会发送3个包
三次握手的作用是什么?双方确保自身和对方的接收和发送的能力都是正常的
这句话通俗的来说也就是
客户端角度下:确保客户端(自身)的收,发能力正常 确保服务端(对方)的收发能力正常。
服务端角度下:确保服务端(自身)的收,发能力正常 确保客户端(对方)的收发能力正常。

于是有了以下的过程
第一次握手客户端向服务端发送一个包,服务端接收到了,这可以说明,在服务端的角度下:客户端的发送和服务端的接收能力是正常的。
第二次握手服务端向客户端发送一个包,客户端接收到了,这可以说明,在客户端的角度下:客户端的发送和接收和服务端的发送和接收是正常的。
第三次握手客户端向服务端发送一个包,服务端接收到了,这可以说明,在服务端的角度下:客户端的发送和接收能力是正常的,服务端的接收能力是正常的
转化为表格如下图 image.png

为什么第二次握手就已经让客户端确认完成了?

按理来说,第二次握手,在客户端的角度下不应该只有客户端的接收和服务端发送是正常的吗?。
为什么还能确认客户端的发送和服务端的接收是正常的呢?
因为,在第二次握手时,第一次握手已经完成,也就说明客户端发送的包已经被服务端成功接收了,在此基础下进行了第二次握手。

为什么一定要三次握手?两次行不行?四次行不行?

在经历了两次握手之后,我们可以明显的看出此时在服务端的角度下还不确认客户端的接收和服务端的发送能力是正常的,所以至少需要3次握手,大于三次的话又造成性能的浪费所以没有必要。

更详细的描述

下图 image.png 第一次握手:客户端向服务端发送SYN(同步请求位)=1,并带上客户端分配的seq序列号(s_client) 第二次握手:服务端向客户端发送SYN=1,并带上服务端分配的seq序列号(s_server),同时在接收到客服端的seq(s_cilent)后,在此基础+1,生成的ACK报文(s_client+1)
第三次握手:客户端向服务端发送SYN=0,此时的seq序列号被设置成服务端的序列号+1(s_client+1),同时在接收到服务端的seq(s_server)后,在此基础+1,生成的ACK报文(s_server+1)

四次挥手

第一次挥手:客户端发送断开连接的请求(FIN报文)给服务端,告知服务端,自身不会再发送请求了。

第二次挥手:服务端此时可能还需要发送请求,因此先发送给客户端ACK报文,告诉客户端,它收到了客户端想要断开请求的通知了,避免客户端因为没有收到确认,还会继续发送。

第三次挥手:服务端在处理完自身的发送请求后,便发送断开连接的请求(FIN)给客户端。

第四次挥手:客户端在接收到服务端的FIN之后,知道可以断开连接了,便发送ACK确认连接中断。

为什么要进行四次挥手不是三次挥手?

因为TCP是全双工通信的,为了确保数据能够完成传输,服务端可能需要处理自身的数据请求,此时需要挥一次手(发送ACK),而处理完自身的数据请求之后,需要告诉客户端断开连接的请求,此时需要挥一次手(发送FIN),相应的客户端在收到FIN报文之后,需要再挥一次手发送ACK

image.png

结尾

至此三次握手,四次挥手过程分析完毕。欢迎小伙伴们一起交流~

文献参考

“三次握手,四次挥手”你真的懂吗?
TCP/IP三次握手过程及原因
TCP三次握手四次挥手详解
TCP挥手为什么是4次?
为什么TCP握手是3次,挥手确是4次?