概念
- 标志位
- ACK - 确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
- SYN - 连接请求序号标志,用于建立连接,SYN=1表示请求连接
- FIN - 结束标志,用于释放连接,为1表示关闭本方数据流
- 序号 - 表示发送的数据字节流,确保TCP传输有序,对每个字节编号
- seq - x (123123123)
- ack - x+1 (123123124)
三次握手
- 第一次
- 发送请求建立连接报文, SYN = 1,seq = x,等待服务端确认, 客户端进入 SYN_SENT状态
- 白话版 - 我要和你建立连接
- 第二次
- 服务端收到请求,向客户端发送验证 ack = x + 1, 同时自己发送一个验证包 seq = y, 服务端进入SYN_RECV状态
- 白话版 - 我收到了,确定要连接吗(还在吗)
- 第三次
- 客户端收到请求,向服务器发送确认 ack = y + 1, 服务端和客户端同时进入ESTABLISHED状态,完成连接
- 白话版 - 我还在,咱们建立连接吧
四次挥手
- 第一次
- 客户端发送断开连接请求, FIN = 1, seq = u, 客户端进入FIN-WAIT-1状态
- 白话版 - 我的数据传完了,咱们断开吧
- 第二次
- 服务端收到断开请求, 发送确认 ACK=1,ack=u+1, 同时发送一个验证包 seq = v,进入 CLOSE-WAIT状态
- 客户端收到请求确认, 进入 FIN-WAIT-2 状态,等待服务器发送断开请求
- 白话版 - 好的,我知道了,我还有数据没传完,请稍等
- 第三次
- 服务器传输完成,发送断开请求 FIN = 1, ACK = 1, seq = w, ack = u + 1, 服务端进入 LAST-ACK 状态
- 白话版 - 我的数据已经传输完了,咱们可以断开了
- 第四次
- 客户端收到断开请求,向服务端发出确认 ACK = 1, seq = u + 1, ack = w + 1, 客户端进入TIME-WAIT状态, 服务端立即进入CLOSED状态, 客户端在 TIME-WAIT 状态结束后(2MSL),进入 CLOSED 状态
- 白话版 - 我收到了,可以断开了
参考:
https://www.cnblogs.com/jainszhang/p/10641728.html
https://blog.csdn.net/qq_38950316/article/details/81087809