1、三次握手
首先客户端发送一个带有SYN标志的数据包给服务端;服务器收到之后,会回传一个带有SYN和ACK标志的数据包给客户端,确认信息;最后客户端发再送一个带有ACK标志的数据包给服务器,代表握手结束,链接成功。
为什么需要三次握手呢?为了防止已失效的连接请求报文突然又传送到了服务器,从而产生错误。
可以给面试官举个例子:假如只有前面2次握手,那么服务端来收到SYN并且发出SYN+ACK包之后就会处于工作状态。如果服务端在某一时刻突然收到了一个来自客户端的SYN包,在发出ACK之后,服务端处于工作状态。但是可能这个包是卡了很久已经被客户端给丢弃了。客户端收到SYN+ACK之后,表示情绪淡定不予理会,但是服务端已经处于工作状态了,会造成资源的浪费。
2、四次挥手
四次握手是取消客户端与服务端TCP链接的方式。以客户端发起请求为例,四次握手的过程是这样的:首先客户端发送一个带有FIN标志的数据包给服务端,表示它没有数据要发送了;服务端收到之后,首先会回传一个带有ACK标志的数据包表示服务器收到信息了,接着会回传一个带有FIN标志的数据包,表示服务器也没有数据要发送了。最后客户端再发送一个带有ACK标志的数据包给服务器,表示确认信息,代表握手结束,连接关闭。
为什么需要四次握手?
根据状态流程图,我们可以看出服务端响应断开连接的请求时,其ACK和FIN包并不是一起发送给客户端的,因为第一次由客户端->服务端的FIN信号表示的是客户端想要断开连接。服务端先给出ACK确认信号,表示已经收到FIN请求,然后当自己也可以结束的时候,再次发送FIN信号,所以需要挥手交互需要四次。