TCP的三次握手和四次挥手常见面试题

1.为什么连接时是三次握手,而关闭时是四次挥手?

因为客户端在和服务器端连接时发送请求报文段,可以直接发送SYN+ACK报文(其中ACK是确认应答报文,SYN是同步状态报文),而在关闭连接时,当服务器端收到客户端FIN报文时,很有可能会因为自身数据没有发送完毕,而先发送给客户端一个ACK报文表示自己收到了,只有等到服务器端将数据传输完毕后才会向客户端回复FIN报文,因此不能一起发送ACK报文和FIN报文,所以需要四次挥手。

2.为什么服务器端在TIME-WAIT状态需要2MSL(最大报文段生存时间)才能进入CLOSED状态?

在断开连接式发送了四次报文,发送完毕后本应该直接进入CLOSED状态,但是网络是不可靠的,在最后客户端发送给服务端的ACK确认报文有可能是会丢失的,如果客户端没有等待2MSL时间,直接在发送确认报文后直接进入CLOSED,而服务器端实际上是没有收到确认报文,则会不断的重发确认报文段,此时的A已经关闭并不会有理睬,这就会导致服务器端关闭异常,所以客户端不能在发送ACK报文段后立即关闭,需要再发送后进入TIME-WAIT状态,客户端设置一个计时器,等待2MSL时间,如果在此事件内收到重发的FIN报文,客户端会重新发送ACK报文与服务器端进行确认在此等待2MSL,而等待的MSL时间就是在网络中一个报文段生存的最长时间,2MSL就是一次发送一次回复所需的最大时间,直到在2MSL时间断内没有收到重发的报文才会进入CLOSED状态,结束TCP连接。

3.为什么建立连接需要三次握手而不是两次?

假设使用两次握手建立连接,如果在一次TCP连接中,客户端发送了第一次请求只是在网络中因为某些原因滞留了并没有丢失,客户端在时间内没收收到服务器端的确认报文,则认为服务器没有收到刚刚发送的请求,便会重新发送这条报文,而这次重发使得客户端和服务器端经过两次连接建立正确连接,传输数据后释放连接。此时之前滞留的那一次请求正常到达服务器端,而这个报文应该不应该再次生效,但是因为两次握手的机制会使客户端和服务器端在此建立连接,则会导致不必要的错误和资源浪费。

如果是三次握手机制,当这条失效的报文传达到服务器端后,服务器接收到后虽然回复了确认报文给客户端,但是客户端查看了确认报文不会再次发送确认,这次连接不会再进行下去,则不会造成不必要的错误和资源浪费。

4.如果在已经建立了连接时,客户端突然发生故障了怎么办?

TCP设有一个保活计时器,当客户端出现故障时,服务器不会一直等者浪费资源。正常情况下,服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若在两小时内没有收到客户端的任何数据 ,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

5.第三次握手失败了怎么办?

当客户端与服务器端的三次握手失败了以后,即在客户端发送至服务器端的确认建立连接报文段未能到达服务器端,服务器在等待客户端回复确认报文的过程中超时了,那么服务器会向客户端发送一个RST报文段并进入关闭状态,即并不等待客户端第三次握手的ACK包重传,直接请求关闭连接,这一行为是为了防止泛洪攻击。

 

发布了19 篇原创文章 · 获赞 16 · 访问量 3644

猜你喜欢

转载自blog.csdn.net/O9A0MA/article/details/95460299
今日推荐