TCP 三次握手与四次挥手

2022年8月1日大约 3 分钟

TCP(Transmission Control Protocol,传输控制协议 )是一种基于连接的、可靠的传输层协议。TCP 协议建立连接的本质是交换双方的状态(比如序号)
UDP(User Datagram Protocol,用户数据报协议)是一种基于非连接的、不可靠的传输层协议

TCP 与 UDP 的区别:

  • TCP 基于连接(类比打电话),稳定。常用于文件传输、网页浏览等
  • UDP 基于非连接(类比写信),速度快,但不稳定会丢包。常用于语音通话、视频直播。

提示

DDOS(distributed denial of service):分布式拒绝服务。比如 SYN 攻击:通过向服务端不停发送 SYN 请求,但不响应SYN+ACK 报文,从而消耗服务端的资源。

TCP 报文

TCP被封装在IP数据报中

序号(seq):在初次建立连接的时候,客户端和服务端都会为本次的连接随机初始化一个序号(解决网络包乱序的问题)

确认号(ack):表示「接收端」告诉「发送端」对上一个数据包已经成功接收(解决网络包丢失的问题)

标志位:SYN/FIN/ACK。SYN 用来同步建立连接,FIN 断开连接,ACK 应答

三次握手

握手过程:

  1. 客户端向服务端发送 SYNseq = x (x 是客户端随机生成的初始序号 ISN
  2. 服务端接收到客户端的 SYN 后,向客户端发送 SYNACKseq = yack = x + 1。 (y 是服务端随机生成的初始序号 ISN,确认号 ack = 对方的序号 + 1)
  3. 客户端接收到服务端的 SYNACK 后,向服务端发送 ACKack = y + 1。完成握手。

简单理解:

  • A:我要跟你通信,你听得到吗?
  • B:可以听到,你听得到吗?
  • A:我可以听到

为什么需要至少三次握手

为了防止失效的连接请求报文段被服务端接收,从而产生错误。为了在不可靠的信道上建立起可靠连接,必须至少握手三次

假设两次握手后,建立连接:

  1. 客户端发送的 SYN 可能在某个网络节点滞留,长时间未收到服务端的 ACK
  2. 客户端会再次重发 SYN,服务端成功接收到后,返回 SYN + ACK,此时成功建立连接,双方进入数据传输状态。
  3. 但是如果第一次发送的 SYN 因为网络恢复正常,又送达到服务端。服务端会误认为是客户端又发起了一个新的连接,返回 SYN + ACK,服务端进入等待数据状态。
  4. 最终导致双方状态不一致。

四次挥手

挥手过程:

  1. 客户端发送 FIN,表示释放连接
  2. 服务端收到客户端的 FIN 后,回复 ACK
  3. 服务端可能还有数据要发送给客户端,等服务端确认自己已经没有数据需要发送给客户端之后,就发送 FIN 给客户端
  4. 客户端收到服务端的 FIN 之后,回应 ACK

简单理解:

  • A:我要跟你断开通信
  • B:知道了,等一下,我还有东西要发给你
  • B:好了,我发完了
  • A:好的,我知道了

为什么需要四次挥手

服务端接收到客户端的 FIN,并回复 ACK 之后,可能还有数据要发送,确认没有数据要发送后再发送 FIN

为什么需要超时等待 2MSL

MSL:Maximum Segment Lifetime 最大报文寿命,超过这个时间报文将被丢弃。

原因:

  1. 保证服务端能够收到 ACK(如果收不到,服务端会重发 FIN
  2. 确保在下次创建新连接时,不会出现先前连接的报文。

参考资料