三次握手
ACK = 收到的SYN + 1
- 客户端发出连接消息(SYN)并且获得SYN_SENT状态
- 服务端收到连接消息并且获得SYN_RCVD状态,然后向客户端回复消息(SYN+ACK) SYN
- 客户端收到回复消息斌并且获得ESTABLISHED状态, 然后向服务端发送消息(ACK)
Q: 为什么不用二次握手
- 当客户端发出消息时,因为网络原因,导致连接消息迟迟没有发送到服务端
- 客户端又重新发了连接消息给服务端,这次服务端马上回复消息建立了连接
- 之前第一次没有发送过去的连接消息,突然又被发送到了服务端并且服务端也回复了消息,因为是二次握手。所以也建立了连接,但是这个客户端已经不用了。所以造成了资源浪费
为了防止已经失效的连接请求报文段突然有传送到了服务端,造成资源浪费
四次挥手
MSL(报文最大生命周期)
- 客户端发送FIN报文, 客户端进入FIN_WAIT_1状态, 服务端进入CLOSE_WAIT状态
- 服务端回复ACK报文,客户端进入FIN_WAIT_2状态
- 服务端处理完所有的数据,返回FIN报文给客户端, 服务端进入LAST_ACK状态
- 客户端接收到FIN报文之后,进入TIME_WAIT状态,发送ACK报文给服务端,服务端进入CLOSED状态, 客户端等待2MSL, 进入CLOSED状态,
Q: 为什么要等待2MSL
如果第三阶段时,客户端重启,服务器接收不到ACK报文,将会重新发送FIN报文,这样会有问题,等待是为了让重发的FIN报文可以进行回复ACK报文
Q: 为什么连接是三次断开是四次
因为连接时,服务端接收到客户端SYN请求之后,可以直接回复SYN+ACK
断开时,服务端接收到客户端FIN报文时,服务端可能并没有处理好所有的请求,只能先回复ACK,等都处理好了才能回复FIN。