网站首页 > 博客文章 正文
前言很早以前,去面试,面试官问我,tcp连接一共有多少种状态以及各状态的含义。我一脸懵逼,我知道一些状态,如LISTEN、TIME_WAIT等,但没有关注过总共有多少种状态,更别说每种状态的意义了,后面为了面试详细看了下tcp协议状态,虽然当时记住了(其实也只是粗略的知道),后面总是会忘记,又去搜索,现在将其记下
TCP三次握手和四次挥手
tcp11中状态及变迁其实基本包含在正常的三次握手和四次挥手中,除开CLOSING
tcp正常三次握手
从图片流程看,正常的三次握手从服务端打开监听监听(LISTEN)->客户端先发起SYN主动连接标识->服务端回复SYN及ACK确认->客户端再确认即三次握手TCP连接成功
而三次握手里面也包含tcp其中四种状态及变迁
LISTEN服务端状态,应用程序打开监听端口,处理来自客户端TCP端口的连接
SYN_SENT客户端状态,当客户端通过应用程序connect()连接时,客户端TCP发送SYN标记主动建立连接,此时状态为SYN_SENT
SYN_RECV服务端状态,当收到客户端SYN封包后,服务端会发送一个SYN及ACK确认到客户端,再等待对方连接确认,这时状态为SYN_RECV,如果发现有很多SYN_RCVD状态,可能受到了SYN FLood的Dos攻击
ESTABLISHED当客户端回复正确的ack值后,就建立一个打开的连接,客户端和服务端就都进入ESTABLISHED状态,此时便可以PSH数据
tcp正常四次挥手
从图片流程看,正常的四次握手包含6种tcp状态变迁如主动发起关闭方为客户端客户端发送FIN进入FIN_WAIT1 -> 服务端发送ACK确认并进入CLOSE_WAIT(被动关闭)状态->客户端收到ACK确认后进入FIN_WAIT2状态 -> 服务端再发送FIN进入LAST_ACK状态 -> 客户端收到服务端的FIN后发送ACK确认进入TIME_WAIT状态 -> 服务端收到ACK确认后进入CLOSED状态断开连接 -> 客户端在等待2MSL的时间如果期间没有收到服务端的相关包,则进入CLOSED状态断开连接
FIN_WAIT1客户端调用close()关闭连接后,TCP发出FIN标记主动关闭连接,然后进入FIN_WAIT1状态,等待远程TCP连接中断或者确认
CLOSE_WAIT被动关闭状态,TCP接收到FIN后,就发送ack回应客户端的FIN标识封包,然后就进入了CLOSE_WAIT状态
FIN_WAIT2半关闭状态,主动关闭端(也就是客户端调用close()后)接收到ack确认后,此时进入FIN_WAIT2状态,该状态下,客户端应用程序依然能接收数据
LAST_ACK服务端发送确认中断后,也发送FIN关闭,然后进入LAST_ACK最后确认关闭状态
TIME_WAIT在主动关闭端接收到FIN后,TCP就发送ACK,并进入TIME-WAIT状态,该状态持保持由内核参数默认等待2MSL,之后主动关闭方也进入CLOSED状态关闭连接
CLOSEDTCP连接关闭,被动关闭端在接收到ack包后,进入CLOSED状态关闭TCP连接
CLOSING状态
CLOSING状态一般较少出现,这种是客户端和服务端同时发起了FIN主动关闭。如客户端发送FIN主动关闭,但是没有收到服务端发来的ACK确认,而是先收到了服务端发来的FIN关闭连接,所以必须是同时
在进入CLOSING状态后,只要收到了对方对自己发送的FIN的ACK,收到FIN的ACK确认就进入TIME_WAIT状态,因此,如果RTT(Round Trip Time TCP包的往返延时)处在一个可接受的范围内,发出的FIN会很快被ACK从而进入到TIME_WAIT状态,CLOSING状态持续的时间就特别短,因此很难看到这种状态
阅读 2.5k更新于 2019-08-13
猜你喜欢
- 2025-05-03 什么是TCP?什么是UDP?它们有什么区别?
- 2025-05-03 Linux:TCP 大量连接状态为CLOSE_WAIT
- 2025-05-03 面试常问!TCP 三次握手与四次挥手详解
- 2025-05-03 TCP可靠传输的一点知识(简述tcp可靠传输的工作原理)
- 2025-05-03 图解TCP、UDP,流量控制,拥塞控制,一次看懂
- 2025-05-03 一篇文章读懂HTTPS及其背后的加密原理
- 2025-05-03 TCP三次握手和四次挥手详解(tcp三次握手的作用)
- 2025-05-03 面试必备TCP(二):四次挥手(四次挥手面试题)
- 2025-05-03 简述:TCP四次挥手(断开连接)(tcp 4次挥手)
- 2025-05-03 腾讯云国际站:为什么需要调整TCP内核参数?
你 发表评论:
欢迎- 368℃用AI Agent治理微服务的复杂性问题|QCon
- 364℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 347℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 343℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)