真相系列

tcp真得需要三次握手才能建立连接吗

2021-05-06  本文已影响0人  银角代王

从网上一搜一大把的三次握手流程图示

image.png

首先我们来看一下tcp主要实现的功能

  1. 在两端之间建立一条全双工连接
  2. 保证连接之间的数据包不丢、不重、有序
  3. 控制连接之间数据流量(窗口控制)

建立连接时首要保证两端可以互相通信

首先是保证两端之间是可以相互发送、接收数据的

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只能被动地建立连接进行初始化,当收到新的请求后,又需要断开之前建立的连接,造成资源浪费。

上一篇下一篇

猜你喜欢

热点阅读