此为面经第五谈!可以关注我,每日带你深入浅出一个新面经。
我们要了解面经要如何“说”!
很重要!很重要!很重要!
我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)
码农不易,各位学者学到东西请点赞支持支持!
开始部分:
总:TCP四次挥手总览图(刻画在脑海里面!重要)。TCP四次挥手其实就是两个过程,互相发送FIN包和ACK包。
分:
首先是服务端收到客户端的发送的FIN包,然后回复ACK包,再进入CLOSE_WAIT状态。
如果此时应用程序还有数据要发送,则发送数据后再发送FIN包到客户端。
双端关闭都需要一个FIN包和一个ACK包回复的过程。
(挥手其实没什么难度)
那为什么需要四次挥手呢?
1.网络应用程序可能还有数据要发送,比如说缓存区的一些数据,所以不能将ACK包和FIN包合成一起发送(变为三次挥手,不合理),不然容易导致数据丢失。
2.将发送FIN包的控制权交由网络应用程序来处理。
是不是只可以调用close或shutdown来发送FIN包?
不是的,程序退出的时候,内核网络协议栈都会发送FIN包来完成四次挥手。
四次挥手的过程中,数据包丢失会发生什么?(两个流程其实都是类似的)
第一次挥手丢失FIN包,会进行多次超时重传FIN包,重传失败,超时后双方都会直接进入CLOSED状态。
第二次挥手丢失ACK包,ACK不会超时重传,直到超时,双方进入CLOSED状态。
第三次挥手丢失FIN包,会进行多次超时重传FIN包,重传失败,超时后双方都会直接进入CLOSED状态。
第四次挥手丢失ACK包,ACK不会超时重传,直到超时,双方进入CLOSED状态。
总:四次挥手的过程其实就是两个互相发送FIN包和ACK包的流程,一些细节在以上已经讲解到了。