1、什么是三次握手?
首先机器A发送SYN包,向机器B请求建立TCP连接,并附上自身的接收缓存区信息等,机器A进入SYN_SEND状态,表示请求已经发送,正在等待回复
机器B收到请求之后,根据机器A的信息记录下来,并创建自身的接收缓存区,向机器A发送SYN + ACK组合包,同时自身进去SYN_RECV状态,表示已经准备好了
机器A收到回去之后记录机器B的信息,发送ACK信息,自身进入ESTABLISHED状态,表示已经准备好了,可以进行发送和接收
机器B收到ACK数据后,进入ESTABLISHED状态
2、为什么TCP连接的时候是3次?两次是否可以?
不可以,主要从以下两方面考虑(假设客户端是首先发起连接请求):
假设建立TCP连接仅需要两次握手,那么如果第二次握手时,服务端返回给客户端的确认报文丢失了,客户端这边认为服务端没有和他建立连接,而服务端却以为已经和客户端建立了连接,并且可能向服务端已经开始向客户端发送数据,但客户端并不会接收这些数据,浪费了资源。如果是三次握手,不会出现双方连接还未完全建立成功就开始发送数据的情况。
如果服务端接收到了一个早已失效的来自客户端的连接请求报文,会向客户端发送确认报文同意建立TCP连接。但因为客户端并不需要向服务端发送数据,所以此次TCP连接没有意义并且浪费了资源。
3、为什么TCP连接的时候是3次,关闭的时候却是4次?
因为需要确保通信双方都能通知对方释放连接,假设客服端发送完数据向服务端发送释放连接请求,当客服端并不知道,服务端是否已经发送完数据,所以此次断开的是客服端到服务端的单向连接,服务端返回给客户端确认报文后,服务端还能继续单向给客户端发送数据。当服务端发送完数据后还需要向客户端发送释放连接请求,客户端返回确认报文,TCP连接彻底关闭。所以断开TCP连接需要客户端和服务端分别通知对方并分别收到确认报文,一共需要四次。
4、什么是四次挥手?
机器A发送完数据之后,向机械B请求断开链接,自身进入FIN_WAIT_1状态,表示数据发送完成且已经发送FIN包(FIN标志位为1)
机械B收到FIN包之后,回复ack包,表示已经收到,但此时,机械B可能还有数据没发送完成,自身进入CLOSE_WAIT状态,表示对方已发送完成且请求关闭链接,自身发送完成之后可以关闭链接
机械B发送完数据后,发送FIN包给机器A,自身进入LAST_ACK状态,表示等待一个ACK包即可关闭链接
机器A收到FIN包后,知道机器B也发送完成了,回复一个ACK包。并进入TIME_WAIT状态
机器A等待两个报文存货最大时长之后,机器B接收到ACK报文之后,均关闭链接,进入CLASED状态
5、为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接&