TCP 可靠连接的状态简介


文章目录



什么是TCP协议

  • 位于 OSI 模型中的传输层(第四层),是一种端对端的传输协议
  • 面向连接的、可靠的协议
  • 通过校验、序列化、确认应答、重发控制、窗口控制等机制实现可靠传输
  • 由建立连接、数据传输和连接释放三个阶段组成
  • 采用三次握手建立连接,采用四次挥手关闭连接

OSI
Open Systems Interconnection
网络堆栈中协议的分层结构,TCP在此结构的第四层位置.


TCP三次握手

三次握手为了使 Client 和 Server 都确认是否有接受对方的数据和发送数据给对方的能力:

这里不要把图里的 Client/Server 和项目里的客户端服务器端混淆,主动发起连接的一方或者主动关闭连接的一方就是 Client,被动的一方便为 Server。一个服务既可以充当 Client 的角色,也可以充当 Server 的角色。

第一次握手:Client 先发送一个 SYN(j) 包作为建立连接的请求,确认自己的发送能力是否正常
第二次握手:Server 针对 Client 的 SYN 包回复一个 ACK(j + 1) 包确认应答,同时发送 SYN(k) 包给 Client 表示要求建立连接,在明确自己有接收能力的同时确认一下自己的发送能力
第三次握手:Client 收到 SYN + ACK 包后发送 ACK(k + 1) 包确认应答,表示自己的接收能力正常,此时完成三次握手建立可靠的连接


TCP四次挥手

四次挥手主要是为了让 Client 和 Server 双方都可以正常关闭连接,保证关闭连接前不丢失数据:

第一次挥手:Client 先发送一个 FIN 包表示请求断开连接
第二次挥手:当 Server 收到 FIN 包后,立即回复 ACK 进行确认应答,表示我已经收到你关闭连接的请求,此时 Server 还有接收数据的能力
第三次挥手:一段时间后,当 Server 端确认 Client 端的数据已经接受完毕,发送一个 FIN 包表示关闭连接,不再接收数据
第四次挥手:当 Client 收到 FIN 后,立即回复一个 ACK 进行确认,然后等待 2MSL 后关闭连接

MSL:
在Linux 系统中,MSL 被定义成30 秒, 2MSL 就是60 秒


TCP连接状态

在 TCP 的三次握手、数据传输以及四次挥手的过程中,我们给 Client 和 Server 定义了很多状态用于描述整个流程,结合上面的状态转换图来理解这些状态定义:

  • LISTEN(Server): 正在侦听来自远方的 TCP 端口的连接请求,服务端启动后处于 LISTEN 状态用于监听不同客户端的 TCP 请求并建立连接
  • SYN-SENT(Client): 三次握手时,Client 在发送 SYN 以请求后处于等待建立连接的状态
  • SYN_RCVD(Server):三次握手时,当 Server 收到 Client 的 SYN 信号时,将标志位 ACK 和 SYN 发送给 Client 后到建立连接之间,Server 处于 SYN_RCVD 状态
  • ESTABLISHED(Server And Client):三次握手成功以后,Client 和 Server 处于数据传输的状态
  • FIN-WAIT-1(Client):四次挥手时,Client 端发送中断请求 FIN 到收到 Server 端的中断确认的过程
  • CLOSE_WAIT(Server):四次挥手时,Client 接收到 Client 的 FIN 请求响应后回复 ACK 确认到发送 FIN 包的状态
  • FIN-WAIT-2(Client):四次挥手时,当 Client 接收到 Server 对于 FIN 的响应 ACK 后到收到 Server 端的 FIN 包的状态
  • LAST_ACK(Server):四次挥手时,Server 发送 FIN 请求关闭连接到关闭连接前的状态
  • TIME_WAIT(Client):四次挥手时 Client 对于 Server 的 FIN 回复 ACK 到连接关闭前的状态,又称 2MSL 状态
  • CLOSE(Server And Client):Server 和 CLient 关闭连接后的状态

SOCKET

socket 就是一个标准的 tcp 协议连接.

  • 一个 TCP 连接对应一个 Socket
  • 一个 Socket 的唯一标识是: {SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL}
  • 一个处于监听状态的 TCP 服务可以同时接口来自多个客户端的 Socket
  • 不同进程可以监听同一个端口,如果他们的协议(TCP/UDP)不同
  • 一个进程可以打开和关闭多个 Socket
  • 子进程可以继承所有的文件描述符(FD)从父进程上,所以不同的进程或者线程之间如果有父子关系,可以使用同一个Socket
  • 一个处于监听状态的 TCP 服务只需要一个监听端口,但可以建立多个 Socket
  • 服务器一个端口可以创建的 socket 连接数理论上是没有上限的,取决于系统的内存大小和可以创建的文件描述符的上限,可以通过修改文件描述符上限进行设置

出自:TCP 可靠连接的状态简介

回到顶部