- 客户端 -> SYN=1, Seq=X -> 服务器
- 服务器 -> SYN=1, ACK=1, Seq=Y; ACKnum=X+1 -> 客户端
- 客户端 -> ACK=1 ,ACKnum=y+1
| 握手 | 客户端 | 服务端 |
|---|---|---|
| 第一次握手 | 【客户端】发送✅/接收❓【服务端】发送❓/接收❓ | 【客户端】发送✅/接收❓ 【服务端】发送❓/接收✅ |
| 第二次握手 | 【客户端】发送✅/接收✅ 【服务端】发送✅/接收✅ | 同上 |
| 第三次握手 | 同上 | 【客户端】发送✅/接收✅ 【服务端】发送✅/接收✅ |
主动方假设客户端 被动方假设服务端
- 主动发送 -> Fin=1, Seq=X 报文, 主动方进入FIN_WAIT_1
- 被动方发送 -> ACK=1, ACKnum=X+1-> 报文,被动方进入CLOSE_WAIT, 主动方进入FIN_WAIT_2
- 被动方发送 -> Fin=1, Seq=Y -> 报文 被动方进入LAST_ACK
- 主动发送 -> ACK=1 ACKnum=Y+1 -> 报文 主动方进入TIME_WAIT状态, 被动方进入CLOSED 状态,主动方等待某个固定时间触发CLOSED 状态
- (主动方)FIN_WAIT_1: 表明这是最后一个数据传输,但可以接受数据
- (被动方)CLOSE_WAIT: 等待TCP传输关闭状态
- (主动方)FIN_WAIT_2: 等待被动方关闭连接确认
- (被动方)LAST_ACK: 等待来自客户端的最后一个ACK
- (主动方)TIME_WAIT: 等待可能出现的要求重传的关闭确认ACK包,等待了某个固定时间,没有收到服务器端的ACK ,认为服务器端已经正常关闭连接,关闭连接
| 挥手 | 客户端 | 服务端 |
|---|---|---|
| 第一次挥手 | 【发送】【客户端】最后一次数据,不会再有数据(未确认服务端是否接收)(FIN_WAIT_1) | 【接收】【客户端】最后一次数据,不会再有数据(确认收到),准备关闭TCP(CLOSE_WAIT) |
| 第二次挥手 | 【接收】确认收到上一条信息,等待服务端关闭确认信息(FIN_WAIT_2) | 同上 |
| 第三次挥手 | 同上 | 【发送】服务端已经准备好关闭(未确认客户端是否接收)(LAST_ACK) |
| 第四次挥手 | 【接收】确认收到上一条信息(确认已收到)【发送】客户端确认信息(无需服务端确认),倒数n秒后关闭TCP连接(TIME_WAIT) | 【接收】客户端确认信息,立即关闭TCP连接 |
- SYN: 在建立连接时使用,用来同步序号
- Seq: 发送的这个包中第一个字节的序号
- ACK: TCP的报文到达确认(ACK)是对接收到的数据的最高序列号的确认,并向发送端返回一个下次接收时期望的TCP数据包的序列号