TCP建立连接和断开连接的过程

213 阅读3分钟

概念:TCP是传输控制协议, 是一种面向连接的,可靠的,基于字节流的传输层通信协议

tcp建立连接的过程需要进行三次握手, 何为三次握手, 就是通过发送三个数据包的过程来建立连接, 图解如下

image.png

  1. 准备: 客户端和服务端均处于CLOSED状态, 等待进一步操作
  2. 服务端进入LISTEN状态, 来监听客户端建立连接的请求
  3. 第一次握手: 客户端向服务端发起建立连接的请求, 携带SYN(同步序列号),自身进入SYN-SENT状态
  4. 第二次握手: 服务端接收到客户端的请求, 服务端向客户端发送确认消息, 携带SYN(同步序列号)+ACK(ACK确认有效), 自身进入SYN-RCVD状态
  5. 第三次握手: 客户端向服务端发送最终确认消息携带ACK(确认有效), 自身进入ESTAB-LISHED状态, 表示可以进行数据传输

注意: 这里有个重要的点就是为什么要有第三次握手, 明明前两次请求就可以实现数据的传输, 为什么还要进行第三次握手再去确认一下进行数据传输?

原因是: 假如第一次握手的话因为某种网络原因导致请求滞留或者被挂起未发送给服务端, 我们就会再次发送第一次握手请求, 然后进行第二次第三次握手最后在进行数据传输, 当我们传输完数据之后, 第一次被挂起的请求因为网络好了又被重新发送给服务端了, 服务端接收到请求又再次向客户端进行第二次握手, 假如没有第三次握手的话是不是又重新建立数据传输了, 所以这就是为什么要有第三次握手向服务端发送最终确认了

那么tcp断开连接的过程也叫释放, 需要进行四次挥手过程, 先看图解

image.png

  1. 准备: 客户端和服务端都处于ESTABISHD状态, 等待进行下一步操作
  2. 第一次挥手: 客户端向服务端发送链接拆除的请求(携带FIN(终止连接)), 自身就进入FIN-WAIT-1状态
  3. 第二次挥手: 服务端收到客户端的请求, 单向关闭客户端的连接, 向客户端发送响应消息携带ACK(确认有效), 自身进入CLOSE-WAIT状态
  4. 第三次挥手: 服务端剩余的数据传输完毕, 向客户端发送拆除请求携带FIN(终止连接)和ACK(确认有效), 自身就进入LAST-ACK状态
  5. 第四次挥手: 客户端收到服务端的请求, 向服务端发送响应消息携带ACK(确认有效), 自身进入TIME-WAIT状态
  6. 服务端断开连接: 服务端收到客户端的的响应消息, 断开连接, 自身进入CLOSED状态
  7. 客户端断开连接: 客户端等待一段时间后, 自行断开连接, 自身进入CLOSED状态

注意: 为什么最后进行第四次挥手之后客户端还要等待一段时间再关闭服务器?

原因是: 假如第四次挥手服务端没有接收到客户端响应的话, 服务端会认为是自己发送的第三次挥手请求客户端没有收到, 会再一次进行发送第三次挥手请求, 然后客户端接收到服务端的再一次请求就知道第四次挥手服务端没有收到, 客户端就会再一次向服务端发送第四次挥手请求, 服务端接收到响应就断开本次连接, 进入CLOSED状态, 客户端也进入CLOSED状态