专栏文章 TCP 三次握手四次挥手与十种状态

飞天小子的性能课堂 · 2020年07月27日 · 最后由 飞天小子的性能课堂 回复于 2020年07月28日 · 6133 次阅读

概述

tcp 在建立连接的过程中,有三次握手和四次挥手的过程。在这个流程中,产生了十种状态。入下图

三次握手
第一次握手:客户端向服务器发出连接的请求(SYN)。此时客户端进程进入了 SYN-SENT状态,表示客户端想要和服务端建立连接

第二次握手:服务端接收到客户端的请求后,如果同意连接,则发出确认连接(SYN+ACK)的报文。此时服务端进程进入SYN-RECV(同步收到)状态。询问客户端是否准备好
第三次握手: TCP 客户进程收到确认后,还要向服务器给出确认(ACK)。客户端进入ESTABLISHED(连接就绪)状态,表示我已经准备好

四次挥手
第一次挥手:客户端发送一个 FIN(结束),用来关闭客户到服务端的连接。此时客户端进入 FIN-WAIT-1(终止等待 1)状态
第二次挥手:服务端收到这个 FIN,返回一个确认,询问客户端是否关闭?服务端就进入了 CLOSE-WAIT(关闭等待)状态。客户端收到服务器的确认请求后,客户端进入 FIN-WAIT-2
第三次挥手:服务端发送一个 FIN(结束) 到客户端,服务端关闭客户端的连接。服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认
第四次挥手:客户端确认关闭,客户端就进入了 TIME-WAIT(时间等待)状态,服务器收到了客户端发出的确认,进入 CLOSED 状态

tcp 状态分析

这张图上,
绿色的部分表示刚刚创建的新进程;
白色部分表示建立连接已经完成,但是可能是挥手结束的 ESTABLISHED,也可能是挥手结束的 TIME-WAIT
黄色部分表示进程之间的状态正在转换;
红色的部分表示进程已经结束连接,被删除;

注 1:如果大量的连接处于 TIME-WAIT 状态,表示连接关系来不及释放掉,堵在了队列里面
注 2:如果大量的连接是黄色,表示连接状态转换的时间过长,可能是 tcp 缓存有问题
解决方案
减小 net.ipv4.tcp_fin_timeout 和 net.netfilter.nf_conntrack_tcp_timeout_time_wait ,让系统尽快释放所占用的资源。
开启端口复用 net.ipv4.tcp_tw_reuse。让被 TIME_WAIT 状态占用的端口可以用到新建的连接中。
增大本地端口的范围 net.ipv4.ip_local_port_range 。支持更多连接,提高整体的并发能力。

下一篇准备详细聊一聊三次握手和四次挥手的优化

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

结合实际来说明,简单明了👍

喜欢的点个关注吧

simple 回复

向大佬问好

飞天小子的性能课堂 关闭了讨论 09月20日 15:31
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册