点击领取优惠~
574 字
3 分钟
三次握手的一些面试细节
三次握手的一些面试细节
三次握手中每一次没收到报文会发生什么情况?
- 第一次握手服务端未收到 SYN 报文
服务端不会进行任何的动作,而客户端由于一段时间内没有收到服务端发来的确认报文,等待一段时间后会重新发送 SYN 报文,如果仍然没有回应,会重复这个过程,直到发送次数超过最大重传次数限制,就会返回连接建立失败。
- 第二次握手客户端未收到服务端响应的 ACK 报文
客户端会继续重传,直到次数限制;而服务端此时会阻塞在 accept()处,等待客户端发送 ACK 报文
- 第三次握手服务端为收到客户端发送过来的 ACK 报文
服务端同样会采用类似客户端的超时重传机制,如果重试次数超过限制,则 accept()调用返回-1,服务端建立连接失败;而此时客户端认为自己已经建立连接成功,因此开始向服务端发送数据,但是服务端的 accept()系统调用已经返回,此时不在监听状态,因此服务端接收到客户端发送来的数据时会发送 RST 报文给客户端,消除客户端单方面建立连接的状态。
第二次握手传回了 ACK,为什么还要传回 SYN
ACK 是为了告诉客户端传来的数据已经接收无误。 而传回 SYN 是为了告诉客户端,服务端响应的确实是客户端发送的报文。
第 3 次握手可以携带数据吗?
第 3 次握手是可以携带数据的。 此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,它已经建立连接成功,并且确认服务端的接收和发送能力是正常的。 第一次握手不能携带数据是出于安全的考虑,因为如果允许携带数据,攻击者每次在 SYN 报文中携带大量数据,就会导致服务端消耗更多的时间和空间去处理这些报文,会造成 CPU 和内存的消耗 **
三次握手的一些面试细节