三次握手中每一次没收到报文会发生什么情况?
三次握手中每一次没收到报文会发生什么情况?
- 第一次握手时,服务端未收到客户端发送的SYN报文。
在这种情况下,服务端不会执行任何动作。客户端会等待一段时间,如果在超时时间内没有收到服务端的确认报文,客户端会重新发送SYN报文。如果仍然没有响应,客户端会重复这个过程,直到达到最大重传次数限制。如果超过最大重传次数,客户端会返回连接建立失败的信息。
- 第二次握手时,客户端未收到服务端发送的ACK报文。
客户端会继续重传ACK报文,直到达到重传次数限制。而此时服务端会阻塞在accept()
函数处,等待客户端发送ACK报文。
- 第三次握手时,服务端未收到客户端发送的ACK报文。
服务端也会采用类似客户端的超时重传机制,如果重试次数超过限制,服务端的accept()
调用会返回-1,表示建立连接失败。然而,客户端会认为自己已经成功建立连接,因此开始向服务端发送数据。但是服务端的accept()
调用已经返回,不再处于监听状态。因此,当服务端接收到客户端发送的数据时,会向客户端发送复位(RST)报文,以消除客户端单方面建立连接的状态。