TCP 连接状态及相关命令学习

在平时的开发工作中,我们都使用被封装完好的 TCP/HTTP 库去完成需求开发,很少关心底层 TCP 的连接状态,但是一旦遇到较难定位的线上事故,往往都是因为 TCP 连接参数或者使用姿势不对导致的,本文对 TCP 连接状态以及相关命令做一下梳理总结:

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

想了解 TCP 的连接状态,必须先理清楚 TCP 的三次握手和四次挥手是怎么回事,下图关于 TCP 三次握手和四次挥手的状态转换图(图片来自于知乎文章 《“三次握手,四次挥手”你真的懂吗?》):

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

TCP 的三次握手

三次握手为了使 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 后关闭连接
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 关闭连接后的状态

正常情况下,客户端的状态转换流程如下:

CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

正常情况下,服务端的状态转换流程如下:

CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
关于 TCP 三次握手和四次挥手状态转换中的一些问题
  • 什么是 MSL ?
- MSL 全称是 maximum segment lifetime,报文最大生存时间
- MSL 是任何 IP 数据报能够在因特网存活的最长时间,超过这个时间报文将被丢弃
- MSL 的具体值通常为 30 秒或者是 2 分钟
  • 什么是 TTL ?
- TTL(time to live) 通常表示在数据传输中,包在被丢弃前最多能经过的路由器个数
- 每经过一个路由器都至少要把 TTL 减 1,当记数到 0 时,路由器决定丢弃该包,并发送一个 ICMP 报文给最初的发送者(表示不可达)
- TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环
- TTL 的值可以修改,但是不能超过 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值