下午,突然收到腾讯的电话面试,心想:“不是3、4月份投的简历吗,,,现在我还有机会被捞,管他,面了再说”
由于腾讯本身不是Java的主场,而且本身是一面,问的都是基础,所以面试基本没有问到Java、JVM等详细的知识。面试大体问题如下:
计算机网络
-
讲下七层协议:讲得还ok,大体说了下每层的功能等
-
三次握手、四次挥手:由于之前认真看过,所以讲得也算流畅,详细说了下过程
面试官问:“四次挥手最后B给A请求的等待时间(是什么时间)”
我:“emmmmmmmm,不知道”
后查询发现还是自己掌握得不好,其实答案也很简单,如下:TCP关闭连接用四次握手来实现,即A--->B Fin, B--->A ACK, B--->A Fin, A--->B ACK,为什么要这样? A--->B Fin, B--->A ACK ,A属于主动关闭方,收到B的ACK后,A到B的方向连接关闭,即half shutown , 这时A不能再发送数据了。这种状态下B还是可以单向发送数据的,B的数据发送完毕,也做关闭动作了:B--->A Fin A--->B ACKB收到ACK,关闭连接。但是A无法知道ACK是否已经到达B,于是开始等待? 等待什么呢?假如ACK没有到达B,B会为FIN这个消息超时重传 timeout retransmit , 那如果A等待时间足够,又再次收到FIN消息,说明刚才A返回的ACK没有到达B,于是再发送ACK, 直到在足够的时间内没有收到FIN,说明ACK成功到达。 这个等待时间至少是:B的timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL。
按照《趣谈网络协议》的形象说法:
断开的时候,我们可以看到,当 A 说“不玩了”,就进入 FIN_WAIT_1 的状态,B 收到“A 不玩”的消息后,发送知道了,就进入 CLOSE_WAIT 的状态。
A 收到“B 说知道了”,就