TCP为何三次握手和四次挥手

来源:互联网 发布:哇嘎连接不到网络 编辑:程序博客网 时间:2024/06/07 00:12

这个是个面试常见的问题,也是考察你真的是否懂和理解了TCP的连接和释放过程,下面我来解释下这两个问题:
1.为何要三次握手,两次握手行不行?
假设A要与B建立连接,
a.A向B发送SYN 连接请求,说我要跟你建立连接可以吗?
b.B收到后发送ACK后,同时加上自己的SYN包,你准备发送数据了吗?
c.A再次发送ACK的确认包,OK,我准好好了(服务器收到确认就知道数据要来了,开辟资源等数据)

注意等到三次握手完毕,B才会来等待A发来的数据

那么两次握手会有什么问题?
想想如果简单两次握手就可以,意味着服务器B收到A的连接请求,发回确认,就开启资源等待A的数据了,万一A的连接是过时的怎么办?(比如恰好A的连接请求超时了,后面重新发了连接请求,隔了段时间开始的连接请求又到了。。)
这时就是浪费B的服务器资源啊,毕竟能接收的连接数是有限的
而三次握手,如果老的连接到了B,B就发个确认,但是A一看不对,这个是旧的
就不发送确认包,这时服务器B收不到确认自然就不分配资源

2.为何要进行四次挥手?
a. A发送FIN给B ,告诉B我没有数据发给你了
b. B发回确认.(服务器B就不接收A了,但B可能还有数据要发)
c. B发送FIN给A,告诉A我也没数据发给你了(B没数据发了就发FIN给A)
d. 这时A收到回复确认ack给B(两端的连接数据流都没数据了,B就调用close)
所以是经过场景的实际考虑来设计协议的,保证了灵活度

关于time_wait(2MSL,最大生存时间)的作用:
1.保证全双工的连接性(要保证服务器B最终closed就要保证能处理任何一个分节丢失,包括最后一个ACK,所以设定time_wait保证可以重发ack)
2.保证双方在建立新的连接的时候,旧的连接在网络中消逝
这样限定处在time_wait过程的连接启动新化身,就不会出现新建立的连接和老连接被混为一谈,无法区分。(2MSL保证某方向的分组最多存活MSL,同样另一个方向的应答也是)那么新连接建立,来自该链接先前化身的老重复分组都在网络中消逝了。

0 0
原创粉丝点击