这是传说中面试通常会问到的基础技术问题~
借鉴了多人博客,整合总结了一份易于自己记忆理解的文章,在此记录一下。
三次握手
第一次:客户端向服务端发送SYN同步请求包,请求建立连接;
第二次:服务器向客户端发送ACK响应包,同时发送服务端的SYN同步请求包;
第三次:客户端向服务端发送ACK响应包。
(注意点:第二次中ACK响应包应该是第一次的SYN+1,响应第一次的请求。)
通俗理解:
三次握手的目的是建立可靠的通信信道,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认对方发送正常,自己接收正常
第二次握手:Client 确认:自己发送、接收正常,对方发送、接收正常;Server 确认:对方发送正常;自己接收正常(这里服务端不能确认自己的发送能力和客户端的接受能力是否正常)
第三次握手:Client 确认:自己发送、接收正常,对方发送、接收正常;Server 确认:自己发送、接收正常,对方发送、接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。只有在三次握手结束才可以携带数据。
四次挥手
第一次:客户端向服务端发送FIN关闭连接请求
第二次:服务端向客户端发送ACK响应包,但此时可能服务端还在向客户端发送数据,客户端依然接收。
第三次:服务端向客户端发送FIN关闭连接请求,进入半关闭状态。
第四次:客户端向服务端发送ACK响应包。此时服务端收到后立刻结束TCP连接进入closed状态,客户端要经过最长报文段寿命后才会进入closed状态。