27-三次握手&四次挥手

Zoella Lv3

三次握手

一、概念

1、TCP 协议

TCP(Transmission Control Protocol),即传输控制协议。
TCP 协议是一个 面向连接的、可靠的、基于字节流传输层协议

TCP 连接可以用于 保证可靠性流量控制机制,包括 Socket、序列号及窗口大小。

其中 Socket 是由 IP 加端口组成的,序列号是用来解决乱序问题的,而窗口大小则是用来做流量控制的。

2、TCP 的特点

  • 面向连接:TCP 是通过服务端和客户端进行连接的协议。
  • 面向字节流:TCP 服务端和客户端之间的数据通讯是通过 字节流数据 传输的。
  • 可靠的:TCP 传输的可靠性得益于 TCP 会记录 信息的发送状态数据的接收与否,对于丢包等发送不成功的情况,TCP 会重新发包,进而保证 TCP 的可靠性。

3、TCP 三次握手

图1

  • SYN:Synchronize Sequence Numbers,同步序列号,表示发起一个新连接。
  • ACK:确认收到一个新连接。
  • SEQ:序列号。

TCP 三次握手执行过程:

(1)第一次握手(在吗?)

Client 将 SYN 发给 Server。
Client 进入 SYN_SENT 状态,等待 Server 确认。

(2)第二次握手(在的,有事?)

Server 收到 SYN,将 SYN+ACK 发给 Client。
Server 进入 SYN_RCVD 状态,等待 Client 确认。

(3)第三次握手(需要数据传输)

Client 收到 SYN+ACK,将 SYN 发给 Server。
连接成功,Client 与 Server 进入 ESTABLISHED 状态,可以传输数据。

TCP 为什么需要三次握手?

为了防止已失效的请求报文段传送到服务端而产生连接的误判。

假设是两次握手:

当 A 发送一个连接请求给 B,但是该请求由于网络原因被阻塞了,一段时间后,A 未收到回复,会认为该消息丢失了,就会重新发送消息。

当 A 和 B 通信完成后,这个被 A 认为已经丢失的请求到达了 B,B 会认为这是一个新的请求连接消息,就向 A 发送确认。

但是 A 认为自己没有给 B 再次发送消息,所以不会理睬 B 的确认,但是 B 会一直等待 A 的消息,导致 B 的资源被浪费。

这就是为什么不能两次握手。

设计成三次握手的情况,客户端在接收到服务端 SEQ+1 的返回消息后,就会知道该连接是历史连接,接着发送报文告诉服务端。

为了节省资源,也没必要设计成更多次的握手。

四次挥手

图2

四次挥手的 6 种状态

(1)FIN_WAIT_1

主动方在 ESTABLISHED 状态的时候,想要主动关闭连接,向对方发送 FIN 报文,并进入 FIN_WAIT_1 状态。

(2)FIN_WAIT_2

当主动方收到被动方回复的 ACK 报文后,就进入了 FIN_WAIT_2 状态。

当主动方进入 FIN_WAIT_2 时,表示半连接状态,即被动方还有数据要发过来。

(3)CLOSE_WAIT

当被动方接收到 FIN 时,会回复一个 ACK,并进入 CLOSE_WAIT 状态。

在该状态中,被动方如果还有数据要发送,就继续发送,如果没有,就关闭连接,并发送一个 FIN 给对方。

(4)TIME_WAIT

当主动方接收到了 FIN 报文,就回复一个 ACK 报文,并进入 TIME_WAIT 状态。

如果主动方在 FIN_WAIT_1 状态下,收到了对方的 FIN+ACK 报文,可以跳过 FIN_WAIT_2 直接进入 TIME_WAIT 状态。

(5)LAST_ACK

被动方发送了 FIN 报文后,最后等待对方的 ACK 报文时进入的状态。收到ACK报文后就可以进入CLOSED状态了。

(6)CLOSED

主动方进入 TIME_WAIT 状态后,再等待 2MSL 就会进入 CLOSED 状态。
被动方在收到 ACK 报文后,立即进入 CLOSED 状态。

TIME_WAIT 的意义

如果没有 TIME-WAIT,主动方会直接进入 CLOSED 状态。
此时如果因为网络原因最后一次 ACK 丢失了,服务端会重复发送 FIN 请求给客户端,所以就需要主动方发送最后一次 ACK 之后进入 TIME_WAIT 状态,等待 2MSL(两个报文最大生命周期),等待这段时间就是为了如果接收到了重发的 FIN 请求能够进行最后一次 ACK 回复。

  • Title: 27-三次握手&四次挥手
  • Author: Zoella
  • Created at : 2024-11-04 14:26:53
  • Updated at : 2024-11-04 14:37:42
  • Link: https://zoella-w.github.io/2024/11/04/27-三次握手&四次挥手/
  • License: This work is licensed under CC BY-NC-SA 4.0.