tcp真得需要三次握手才能建立连接吗
2021-05-06 本文已影响0人
银角代王
从网上一搜一大把的三次握手流程图示
image.png首先我们来看一下tcp主要实现的功能
- 在两端之间建立一条全双工连接
- 保证连接之间的数据包不丢、不重、有序
- 控制连接之间数据流量(窗口控制)
建立连接时首要保证两端可以互相通信
首先是保证两端之间是可以相互发送、接收数据的
A:你听见了吗?
B:我听见了,你听见了吗?
A:我也听见了
B:好的
假设只有一次握手,既A——>B,就像你给暗恋的女生写了一份情书,没有给你任何回复,你就一厢情愿得认为她已经是你的女朋友了,强行暗送秋波,人家是不会回应的。
如果有两次握手,既A——>B——>A,这回有戏了,女生答应你了(也可能是惨遭拒绝),如果真是谈对象,关系基本就确立了。
确保历史连接不被处理
在网络世界里,事情有一点点变化。这次回到真实的网络环境,正常的连接情况如下:
Client:填写IP:PORT,填写SEQ,发送连接请求
Server:收到请求,将收到的SEQ加一填入ACK返回给Client
Client:收到回复,判断ACK中的值是否为之前发送的SEQ加一,如果是,建立连接并回执给Sever,如果不是则发送RST通知Server连接无效
Server: 收到回执,建立或者丢弃连接
思考一种情况:
A发起连接后很久没有收到B的回复,A又重新发起了一次对B的连接;
接着B收到了A的前一次连接请求并回复;
这个时候A就可以通过B返回的ACK中的值与自己当前的SEQ值对比,如果对比失败,就可以认为是无效连接,并通知到B丢弃无效连接。
为什么不是一次或者二次握手
我们前面讨论了只有一次握手肯定是不行的(单相思);
那么如果只进行二次握手呢?也就是没有了A回执给B的那一步,这个时候连接建立的时机就变成了B收到A的请求的时刻,因为B并不清楚收到的请求是新的请求还是已经因为超时被A放弃的请求,B只能被动地建立连接进行初始化,当收到新的请求后,又需要断开之前建立的连接,造成资源浪费。