> For the complete documentation index, see [llms.txt](https://maxwell.gitbook.io/way-to-architect/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://maxwell.gitbook.io/way-to-architect/wang-luo/tcp-san-ci-wo-shou-he-si-ci-hui-shou.md).

# TCP三次握手和四次挥手

## TCP三次握手

所谓三次握手(Three-way Handshake)，是指建立一个 TCP 连接时，需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口，建立 TCP 连接，并同步连接双方的序列号和确认号，交换 TCP 接收窗口大小信息。在 socket 编程中，客户端执行 connect() 时。将触发三次握手。

* 第一次握手(SYN=1， 初始序列号=x，不携带应用程序数据):\
  客户端发送一个 TCP 的 SYN 标志位置1的包，指明客户端打算连接的服务器的端口，以及初始序号 X，保存在包头的序列号字段里。\
  发送完毕后，客户端进入 SYN\_SEND 状态。
* 第二次握手(SYN=1， ACK=1， 初始序列号=y， 确认号=x+1，不携带应用程序数据):\
  服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己初始序列号y，放到序列号字段中，同时将确认序号设置为客户的初始序列号加1，即x+1。 发送完毕后，服务器端进入SYN\_RCVD 状态。
* 第三次握手(ACK=1，确认号=y+1，可以携带应用程序数据)\
  客户端再次发送确认包(ACK)，SYN 标志位为0，ACK 标志位为1，并且把服务器发来的初始序号字段+1，即y+1，放在确定号字段中发送给对方\
  发送完毕后，客户端进入ESTABLISHED 状态，当服务器端接收到这个包时，也进入 ESTABLISHED 状态，TCP 握手结束。

## TCP四次挥手

TCP 的连接的拆除需要发送四个包，因此称为四次挥手(Four-way handshake)，也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作，在 socket 编程中，任何一方执行 close() 操作即可产生挥手操作。

* 第一次挥手(FIN=1，seq=x)\
  假设客户端想要关闭连接，客户端发送一个 FIN 标志位置为1的包，表示自己已经没有数据可以发送了，但是仍然可以接受数据。\
  发送完毕后，客户端进入 FIN\_WAIT\_1 状态。
* 第二次挥手(ACK=1，确认号=x+1)\
  服务器端确认客户端的 FIN 包，发送一个确认包，表明自己接受到了客户端关闭连接的请求，但还没有准备好关闭连接。\
  发送完毕后，服务器端进入 CLOSE\_WAIT 状态，客户端接收到这个确认包之后，进入 FIN\_WAIT\_2 状态，等待服务器端关闭连接。
* 第三次挥手(FIN=1，seq=y)\
  服务器端准备好关闭连接时，向客户端发送结束连接请求，FIN 置为1。\
  发送完毕后，服务器端进入 LAST\_ACK 状态，等待来自客户端的最后一个ACK。
* 第四次挥手(ACK=1，确认号=y+1)\
  客户端接收到来自服务器端的关闭请求，发送一个确认包，并进入 TIME\_WAIT状态，等待可能出现的要求重传的 ACK 包。\
  服务器端接收到这个确认包之后，关闭连接，进入 CLOSED 状态。\
  客户端等待了某个固定时间（两个最大段生命周期，2MSL，2 Maximum Segment Lifetime）之后，没有收到服务器端的 ACK ，认为服务器端已经正常关闭连接，于是自己也关闭连接，进入 CLOSED 状态。

内容来自：\
[网络基础：协议分层、TCP](https://www.jianshu.com/p/820b6ecd25df)
