tcp三次握手为什么不是两次(面试必考题你还不会?)

无线路由器-网关-dtu

 

面试官:你好,看到你简历上写着了解tcp协议,你知道【为什么握手三次,而不是二次或者四次呢?】

内心OS:

面试官:你以为我会问你三次握手和四次挥手的过程?那显得我多low啊~

你:卧槽上来就放大招,不讲武德啊,还好老子提前背了一下

你: 这个问题我当时学习的时候也纠结过,所以上网查了一些资料

首先说为什么不能两次?网上有的人这样说:

1. 当客户端首个syn包,假设seq为1,由于各种原因在网络上延迟被滞留时,客户端会重新发起一个不同的syn包假设seq为2

2. 如果只有两次握手的话,在上面的场景中,服务端如果收到了两个包,服务端立即发送ack并置为连接状态

3. 而客户端只知道自己发送了seq为2的包,并将其至为连接状态,由于seq为1的包在客户端已经失效,所以收到服务端ack时,会直接抛弃

此时的后果就是服务端资源浪费,我发现上面的原因太过牵强!!(划重点考试必考:说明你有独立思考精神)

多增加一次握手也是浪费了资源,而且每次建连都增加了一个环节,浪费的资源只会更多,所以我找到了RFC文档(划重点考试要考:一定得说看过RFC,主要证明你有主动思考、刨根问底的精神)

1. tcp每发送一个包都会有一个唯一的seq号,所以通过ack的机制可以保证数据传输的可靠性

2. 三次握手的核心原因是需要确认双方的seq号,如果是两次,只能确认客户端的seq号,而这种情况会导致服务端主动向客户端发送数据时,无法保证可靠性

3. 二次握手仅当只有客户端给服务端发送数据时才可以

至于为什么不是4次,肯定是在保证可靠的基础上最大限度节约资源,所以总结来说,tcp为了保证传输可靠性,必须通过三次握手来确认双方的seq号。我总结出来了这个原因(划重点考试必考:说明你有总结能力)

面试官内心OS:牛逼牛逼,这小子可以啊,我特么又学到了。这次没白来。赶紧给让hr给offer,可不能让他跑咯!!