题目
TCP 三次握手的过程
答案
> 三次握手的原文是 `three-way handshake`,整个名词的可以翻译为:**需要三个步骤才能建立握手/连接的机制**。当然,三次握手也可以叫 `three-message handshake`,通过三条消息来建立的握手/连接。 进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的 **初始化序列号(Init Sequense Number, `ISN`)** 为后面的可靠性传输做准备。 三次握手过程如下图: ![TCP 三次握手示例图](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230324163543792.png) 回顾一下图中字符的含义: - `SYN`:SYN = 1 表示这是一个连接请求或连接接受报文 - `seq`:发送的第一个字节的序号 - `ACK`:确认报文段 - `ack`:确认号。希望收到的下一个数据的第一个字节的序号 **刚开始客户端处于 `Closed` 的状态,而服务端处于 `Listen` 状态**: > `CLOSED`:没有任何连接状态 > > `LISTEN`:侦听来自远方 TCP 端口的连接请求(例如:提供 HTTP 服务默认开的是 80 端口,提供 FTP 服务默认的端口为 21,当提供的服务没有被连接时就处于 LISTEN 状态) 1)**第一次握手**(客户端 -> 服务端):客户端会随机初始化序号(`client_isn`),将此序号置于 TCP 首部的「序列号」字段中,同时把 `SYN` 标志位置为 `1` ,表示 `SYN` 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 `SYN-SENT` 状态。 ![三次握手的第一个报文:SYN 报文](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230324214426671.png) 2)**第二次握手**(服务端 -> 客户端):服务端收到客户端的 `SYN` 报文后,首先服务端也随机初始化自己的序号(`server_isn`),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 `client_isn + 1`, 接着把 `SYN` 和 `ACK` 标志位置为 `1`。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 `SYN-RCVD` 状态。 ![三次握手的第二个报文:SYN + ACK 报文](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230324214655414.png) 3)**第三次握手**(客户端 -> 服务端):客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 `ACK` 标志位置为 `1` ,其次「确认应答号」字段填入 `server_isn + 1` ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 `ESTABLISHED` 状态。 ![三次握手的第三个报文:ACK 报文](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230324215619040.png) 服务器收到客户端的应答报文后,也进入 `ESTABLISHED` 状态