网站设计代做,交互做的不好的网站,网站建设平台设备,企业信息平台登录常见面试题
为什么TCP连接的时候是3次#xff1f;2次不可以吗#xff1f;
因为需要考虑连接时丢包的问题#xff0c;如果只握手2次#xff0c;第二次握手时如果服务端发给客户端的确认报文段丢失#xff0c;此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据…常见面试题
为什么TCP连接的时候是3次2次不可以吗
因为需要考虑连接时丢包的问题如果只握手2次第二次握手时如果服务端发给客户端的确认报文段丢失此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据而客户端一直没收到服务端的确认报文所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功)这种情况下客户端不会给服务端发数据也会忽略服务端发过来的数据。
如果是三次握手即便发生丢包也不会有问题比如如果第三次握手客户端发的确认ack报文丢失服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手也就是服务端会重发SYN报文段客户端收到重发的报文段后会再次给服务端发送确认ack报文。
为什么TCP连接的时候是3次关闭的时候却是4次
因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了但我服务端还有一些数据没发完等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端就是这里多出来了一次)。
为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接
这里同样是要考虑丢包的问题如果第四次挥手的报文丢失服务端没收到确认ack报文就会重发第三次挥手的报文这样报文一去一回最长时间就是2MSL所以需要等这么长时间来确认服务端确实已经收到了。
如果已经建立了连接但是客户端突然出现故障了怎么办
TCP设有一个保活计时器客户端如果出现故障服务器不能一直等下去白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器时间通常是设置为2小时若两小时还没有收到客户端的任何数据服务器就会发送一个探测报文段以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应服务器就认为客户端出了故障接着就关闭连接。
为什么是三次握手而不是两次
第一次握手客户端发送网络包服务端收到了。
服务端就能得出结论客户端的发送能力、服务端的接收能力是正常的。 第二次握手服务端发包客户端收到了。这样客户端就能得出结论
服务端的接收、发送能力客户端的接收、发送能力是正常的。
不过此时服务器并不能确认客户端的接收能力是否正常 第三次握手客户端发包服务端收到了。
这样服务端就能得出结论
客户端的接收、发送能力正常服务器自己的发送、接收能力也正常。 因此需要三次握手才能确认双方的接收与发送能力是否都正常。
面试加分的描述回答三次握手的作用和过程 刚开始客户端处于 closed 的状态服务端处于 listen 状态。然后 1、第一次握手客户端给服务端发一个 SYN 报文并指明客户端的初始化序列号 ISNc。此时客户端处于 SYN_SenT 状态。 SYN-SENT -在发送连接请求后等待匹配的连接请求 2、第二次握手服务器收到客户端的 SYN 报文之后会以自己的 SYN 报文作为应答并且也是指定了自己的初始化序列号 ISN(s)同时会把客户端的 ISN 1 作为 ACK 的值表示自己已经收到了客户端的 SYN此时服务器处于 SYN_REVD 的状态。
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认 3、第三次握手客户端收到 SYN 报文之后会发送一个 ACK 报文当然也是一样把服务器的 ISN 1 作为 ACK 的值表示已经收到了服务端的 SYN 报文此时客户端处于 establised 状态。 4、服务器收到 ACK 报文之后也处于 establised 状态此时双方以建立起了链接。