阿里巴巴内推面试一面——搜索事业部
2、在函数前面,返回值不可修改
如果两次,那么B无法确定B的信息A是否能收到,所以如果B先说话,可能后面的A都收不到,会出现问题 。
为什么不能2次握手?
这里我们用一个现实的例子来解释.就拿大家都喜欢的约会来解释.发送端相当一个男生,接收端是一个女生.一开始,男生发送一条微信告诉女生,今天晚上九点在公园见面呗,然后这条消息因为不可抗力,没有发送到女生的手机上,这时,这条消息有两个去路,一个是彻底消失,另一个是它迷失在网络中,没有找到方向.回来继续说,男生看女生没有回应,就又发了一条一样的微信,这次微信顺利的发过去了,男生女生也顺利的见面了,这一天也就这么过去了.到了第二天,那条迷失在网络中的微信重新找到了方向(真正的网络信息不可能滞留这么久,例子而已),发到了女生的手机上,女生一看,很高兴,毕竟昨天玩的很开心,以为今天又可以开心一次,就又去了,男生昨天玩了一晚上,身体跟不上,就在家躺着,也早忘了那条迷失的微信.就这样,女生在公园等了很久,很难受.
其实上面的例子已经说的很明白了,保险起见,再在具体连接里说一下.如果是两次连接,很可能发生上面的问题,如果有消息在一次tcp连接完成后才到达接收端,那么接收端以为是新的连接,就会发确认报文到接收端确认并建立连接,但发送端可能已经关闭,即使没关闭,在没有到达SYN-SENT状态时,也不会响应接收端的确认信息,接收端可能就这样等待,这在网络中就浪费了资源.
3次握手就一定安全吗?为什么不进行4次握手?
即使是三次握手也不能保证百分百的连接确定,想象一下这样的场景,两军对阵,A军分两部分位于两个山头,B军在两山之间,只有两个A军联合才能战胜B军,但是两个A军之间的路径就只有经过B军的一条线路.任何送信人都有可能被拦截杀掉.
这个时候,如果两A军想联合出击,必须派出密探传送进军指令,这就有一个问题存在,假设第一次送信成功,A2知道了A1的计划,那他必须再发一一封信告诉A1自己知道了,不然A1怎么知道A2收没收到,万一信被拦截了,自己明天一个人去,不是找死.再假设A2给A1的表明自己收到信息的信也顺利发到A1了,那就安全了吗,这个时候A2就担心自己的信送没送到,万一没送到,那明天自己去,不也是找死.显然A1也知道这个问题,所以又要发送第三封信,告诉A2自己收到信了,我们再一次假设,A2收到了这第三封信,但是同样的问题又发生了,A1还是担心这第三封信送没送到,毕竟关乎生死,A2当然也知道,就只能再送信,
可以看到,这样其实是没有止境的,也是无解的,在TCP协议中,我们不使用四次,五次握手,是因为达到的效果是一样的,但是消耗更多的资源,得不偿失为什么要4次挥手不能两次呢?
因为服务器在接收到客户端的FIN,表示停止发送以后,服务器可能还要信息需要发送给客户端,所以先发ACK同意客户端的FIN,防止客户端重传FIN,然后服务器将消息发完后,再发FIN表示自己也要断开连接。
Time_wait2为什么会等2MSL?
客户端收到服务器的FIN后会再等一个2MSL,是为了保证服务器能收到客户端发的ACK,客户端发送ACK给服务器需要一个1MSL的时候,这时服务器要是没收到这个ACK,则会重传一个FIN,而重传的这个FIN到达客户端所用的时间也是1MSL,加一起就是2MSL,所以如果客户端等了2MSL并没有收到服务器重传的FIN的话,说明服务器已经收到客户端的ACK.。