三次握手中每一次没收到报文会发生什么情况?

  • 第一次握手时,服务端未收到客户端发送的SYN报文。

在这种情况下,服务端不会执行任何动作。客户端会等待一段时间,如果在超时时间内没有收到服务端的确认报文,客户端会重新发送SYN报文。如果仍然没有响应,客户端会重复这个过程,直到达到最大重传次数限制。如果超过最大重传次数,客户端会返回连接建立失败的信息。

  • 第二次握手时,客户端未收到服务端发送的ACK报文。

客户端会继续重传ACK报文,直到达到重传次数限制。而此时服务端会阻塞在accept()函数处,等待客户端发送ACK报文。

  • 第三次握手时,服务端未收到客户端发送的ACK报文。

服务端也会采用类似客户端的超时重传机制,如果重试次数超过限制,服务端的accept()调用会返回-1,表示建立连接失败。然而,客户端会认为自己已经成功建立连接,因此开始向服务端发送数据。但是服务端的accept()调用已经返回,不再处于监听状态。因此,当服务端接收到客户端发送的数据时,会向客户端发送复位(RST)报文,以消除客户端单方面建立连接的状态。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题, 计算机网络, 计算机网络面试题