文章目录
- 三次握手
三次握手
首先我们需要明确,三次握手的目的是什么?
是为了通信双方之间建立连接,然后传输数据。
那么建立连接的条件是什么呢?
需要确保通信的双方都确认彼此的接收和发送能力正常,满足这个条件,就可以建立连接了。
那么怎么保证“通信的双方都确认彼此的接收和发送能力正常”?
我们将 TCP 中的这个问题,带入到现实生活中。
假设 A 和 B 打电话,正式谈业务前,一定会先"喂喂"互相确认对方的通信是否正常:
① A:喂喂,能听到我说话吗 【此时 B 知道自己的接收能力ok,也知道 A 的发送能力ok】
② B:我能听到,你能听到我说话吗 【此时 A 知道自己的 接收/发送 能力ok,也知道 B 的 接收/发送 能力ok】
③ A:我能听到你说话 【此时 B 知道了自己的 接收/发送 能力ok,A 的 接收/发送 能力也ok】
以上的三次对话,就确定了双方的通信(接收/发送)能力是正常的,可以建立连接了。
有人会问,第 ② 步,A 已经知道了 " A 的 接收/发送 能力ok,也知道 B 的 接收/发送 能力ok",是不是可以建立连接传输数据了?
其实还不行,因为在第 ② 步的时候,B 还不知道自己的发送能力是否ok,所以还需要第三次询问。
把以上生活中谈业务的场景,再带入到 TCP 三次握手,也是一样的逻辑,只不过 三次握手 多了一些标志位( ACK / SYN )和状态切换。
如下图:
SYN:专门用于建立连接的标志位,n 表示 client 请求中携带的数据包的编号(随机值),数据包大小是 0。
ACK:确认标志位,表示收到了请求。
ACK n + 1 表示 server 端收到了 client 发送的第 n 个数据包,+1 表示也收到了 client 发送的 SYN 标志位。
ACK m + 1 表示 client 端收到了 server 发送的第 m 个数据包,+1 表示也收到了 server 发送的 SYN 标志位。
以上就是 三次握手 的核心思想,始终记住,握手的目的是为了**互相确认双方的 接收/发送 能力是否正常**,为建立连接做准备。