赞
踩
在平时的开发工作中,我们都使用被封装完好的 TCP/HTTP 库去完成需求开发,很少关心底层 TCP 的连接状态,但是一旦遇到较难定位的线上事故,往往都是因为 TCP 连接参数或者使用姿势不对导致的,本文对 TCP 连接状态以及相关命令做一下梳理总结:
想了解 TCP 的连接状态,必须先理清楚 TCP 的三次握手和四次挥手是怎么回事,下图关于 TCP 三次握手和四次挥手的状态转换图(图片来自于知乎文章 《“三次握手,四次挥手”你真的懂吗?》):
这里不要把图里的 Client/Server 和项目里的客户端服务器端混淆,主动发起连接的一方或者主动关闭连接的一方就是 Client,被动的一方便为 Server。一个服务既可以充当 Client 的角色,也可以充当 Server 的角色。
三次握手为了使 Client 和 Server 都确认是否有接受对方的数据和发送数据给对方的能力:
四次挥手主要是为了让 Client 和 Server 双方都可以正常关闭连接,保证关闭连接前不丢失数据:
在 TCP 的三次握手、数据传输以及四次挥手的过程中,我们给 Client 和 Server 定义了很多状态用于描述整个流程,结合上面的状态转换图来理解这些状态定义:
正常情况下,客户端的状态转换流程如下:
CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
正常情况下,服务端的状态转换流程如下:
CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
- MSL 全称是 maximum segment lifetime,报文最大生存时间
- MSL 是任何 IP 数据报能够在因特网存活的最长时间,超过这个时间报文将被丢弃
- MSL 的具体值通常为 30 秒或者是 2 分钟
- TTL(time to live) 通常表示在数据传输中,包在被丢弃前最多能经过的路由器个数
- 每经过一个路由器都至少要把 TTL 减 1,当记数到 0 时,路由器决定丢弃该包,并发送一个 ICMP 报文给最初的发送者(表示不可达)
- TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环
- TTL 的值可以修改,但是不能超过
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。