本文图解讲述 TCP 三次握手、四次挥手流程,扩展添加了对应的高频面试题。文中所有的网格图都使用 draw.io 制作。

先看看 TCP 报文格式:

TCP FLAG 位由 bit 组成,分别代表 ACK、SYN、FIN、URG、PSH、RST ,都以置 1 表示有效。在三次握手和四次挥手中我们重点关注 SYN、ACK、FIN。

  • SYN ( Synchronize Sequence Numbers )用作建立连接时的同步信号;
  • ACK (Acknowledgement )用于对收到的数据进行确认,所确认的数据由确认序列号表示;
  • FIN ( Finish )表示后面没有数据需要发送,通常意昧着所建立的连接需要关闭了。

在三次握手中,流程如下:

  • A 机器发出一个数据包并将 SYN 置为 1,表示希望建立连接。这个包中的序列号假设是 x。
  • B 机器收到 A 机器发过来的数据包后,通过 SYN = 1 得知这是一个建立连接的请求,于是发送一个响应包并将 SYN ACK 标记都置为 1。假设这个包中的序列号是 y,而确认序列号必须是 x+1 ,表示收到了 A 发过来的 SYN。在 TCP 中, SYN 被当作数据部分的一个字节。
  • A 收到 B 的响应包后需进行确认,确认包中将 ACK 置为 1 ,并将确认序列号置为 y + 1,表示收到了来自 B 的 SYN。

为什么需要三次握手?如果是两次握手又会有什么问题?

  • 信息对等
  • 脏连接

四次挥手:
四次挥手释放连接时,等待2MSL的意义?

  • 确认被动关闭方能够顺利进入 CLOSED 状态
  • 防止失效请求