读懂TCP状态转移

读懂TCP状态变换的过程,对于理解网络编程颇有帮助,本文将对TCP状态转移过程进行介绍,但各个状态(总共11个)的含义不在本文介绍的范围。

内容来源:《UNIX网络编程》第一卷第二章2.6节,若是读者对某个知识点不太理解,请参考原文。

TCP状态转换图(state transition diagram)

1. 建立连接(three-way hand shake)

  • 主动打开(passive open):服务器必须准备好接受外来的连接,通常通过socket、bind和listen完成。

  • 被动打开(active open):客户端通过connect发起主动打开。

插句话,该文介绍的性能分析工具(sar -n TCP,ETCP 1)命令可以对主动打开和被动打开的数目进行统计,在一定程度上可以反应服务器端的繁忙程度。

下图给出客户端与服务器端的三次握手过程:

  1. 服务器准备好接受外来连接,通常通过socket、bind和listen完成。(服务器:CLOSED->LISTEN)

  2. 客户端通过connect连接服务器,客户端TCP将发送一个SYN分解,告诉服务器,客户将在待建立连接发送数据的初始序列号。(客户端:CLOSED->SYN_SENT)
  3. 服务器端必须ACK客户的SYN,同时发送一个SYN,告诉客户,服务器将在待建立连接发送数据的初始序列号。(服务器:SYN_RECV)
  4. 客户必须ACK服务器的SYN。(客户端:SYN_SENT->ESTABLISHED)
  5. 服务器接收到客户的ACK。(服务器:SYN_RECV->ESTABLISHED)

下图三次握手对应的状态转移图:

2. 建立连接(同时打开simultaneous open)

参考《TCP/IP详解》卷一第18章18.8节。这种情况发生在两端几乎同时发送SYN并且这两个SYN在网络中交错的情形。这种情况可能发生,但是非常罕见。这要求客户/服务双方使用“两个相同的端口”互相连接,这样双方才能主动向彼此连接。

例如,主机A中的一个应用程序使用本地端口7777,并与主机B的端口8888执行主动打开。主机B中的应用程序则使用本地端口8888,并与主机A的端口7777执行主动打开。

下图给出同时打开过程:

下图给出同时打开的状态转移图:

说明:从目前个人经验来看,这种场景没有遇到过,但从理解TCP状态转移图来说是不可避免的一部分。但《TCP/IP详解》卷一第18章18.8节中支出,许多伯克利版的TCP实现都不能正确地支持打开。

3. 建立连接失败(1)

考虑场景:客户端尚未接到服务器的ACK+SYN,异常退出。这时,当客户端再接收到来自服务器端的ACK+SYN时,客户端回复RST(reset)。服务器处于SYN_RECV状态,这是接收到客户端的RST时,则从SYN_RECV转移到LISTEN状态。

具体过程:

  1. 服务器准备好接受外来连接,通常通过socket、bind和listen完成。(服务器:CLOSED->LISTEN)

  2. 客户端通过connect连接服务器,客户端TCP将发送一个SYN分解,告诉服务器,客户将在待建立连接发送数据的初始序列号。然后客户端crash。(客户端:CLOSED->SYN_SENT,然后突然crash,则退出SYN_SENT)
  3. 服务器端必须ACK客户的SYN,同时发送一个SYN,告诉客户,服务器将在待建立连接发送数据的初始序列号。(服务器:SYN_RECV)
  4. 客户找不到ACK+SYN对应的SYN_SENT状态的socket,则响应RST。(服务器:SYN_RECV->LISTEN)

下图给出建立连接失败的状态转移图:

4. 建立连接失败(2)

考虑场景1:服务器的进程异常退出,客户端不知道。那么客户端发送SYN后,服务器端响应RST,则客户端建立连接失败。

考虑场景2:服务器的机器关闭,服务器IP不可达。那么客户端发送SYN后,超时重发,超过重试次数,最终TIMEOUT,则客户端建立连接失败。

具体过程:

  1. 假设服务器进程退出。(服务器:LISTEN->CLOSED)

  2. 客户端通过connect连接服务器,客户端TCP将发送一个SYN分解,告诉服务器,客户将在待建立连接发送数据的初始序列号。(客户端:CLOSED->SYN_SENT)
  3. 服务器端收到客户端SYN,响应RST(服务器:CLOSED)
  4. 客户收到RST。(客户端:SYN_SENT->CLOSED)

下图给出建立连接失败的状态转移图:

5. 断开连接(四次挥手)

  • 主动关闭(active close):某个应用程序首先调用close,发送一个FIN包。

  • 被动关闭(passive close):接收到FIN的对端执行被动关闭。

下图给出客户端与服务器的四次挥手过程:

  1. 某个应用程序首先调用close,该端发送一个FIN包,表示数据发送完毕,该应用程序再无更多数据发送给对端。(例如HTTP服务器发送Reponse数据给client后,再无多余数据发送,则Server可以执行主动关闭)(主动端:ESTABLISHED->FIN_WAIT_1)

  2. 接受到FIN的对端执行被动关闭。首先ACK这个收到的FIN包。该FIN包的接收也作为一个文件结束符(EOF)传递给应用程序(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN包意味着接收端应用进程在相应的连接上再无额外数据可接收。(被动端:ESTABLISHED->CLOSE_WAIT,主动端:FIN_WAIT_1->FIN_WAIT_2)
  3. 一段时间后,接收到这个EOF的应用进程将调用close关闭他的socket。这导致它的TCP也发送一个FIN包。(被动端:CLOSE_WAIT->LAST_WAIT)
  4. 接收这个最终FIN的执行主动关闭的那一端ACK这个FIN。(被动端:LAST_WAIT->CLOSED,主动端:FIN_WAIT_2->TIME_WAIT(2MSL之后,TIME_WAIT->CLOSED))

下图给出四次挥手的状态转移图:

6. 断开连接(同时关闭simultaneous close)

参考《TCP/IP详解》卷一第18章18.9节。我们在以前讨论过一方(通常但不总是客户方)发送第一个FIN执行主动关闭。双方都执行主动关闭也是可能的, TCP协议也允许这样的同时关闭(simultaneous close)。

下图给出同时关闭过程:

下图给出同时关闭的状态转移图:

7. 断开连接(在FIN_WAIT_1状态中,接收FIN+ACK)

考虑场景:被动关闭端收到FIN包后,直接发送FIN+ACK,则主动关闭方则从FIN_WAIT_1跳过FIN_WAIT_2,直接进入TIME_WAIT。

给出具体流程:

  1. 某个应用程序首先调用close,该端发送一个FIN包,表示数据发送完毕,该应用程序再无更多数据发送给对端。(例如HTTP服务器发送Reponse数据给client后,再无多余数据发送,则Server可以执行主动关闭)(主动端:ESTABLISHED->FIN_WAIT_1)

  2. 接受到FIN的对端执行被动关闭。收到FIN包之后,被动端调用close关闭socket,则FIN+ACK同时发给主动端。(被动端:ESTABLISHED->CLOSE_WAIT->LAST_ACK,主动端:FIN_WAIT_1->TIME_WAIT)
  3. 接收这个最终FIN的执行主动关闭的那一端ACK这个FIN。(被动端:LAST_WAIT->CLOSED,主动端:FIN_WAIT_2->TIME_WAIT(2MSL之后,TIME_WAIT->CLOSED))

下图给出同时关闭的状态转移图:

参考:

  1. 《UNIX网络编程》第一卷第2章

  2. 《TCP/IP详解》卷一第18章

说明(重点注意):

  1. 《UNIX网络编程》第一卷(第三版)图2.4有个错误,服务器从LISTEN转移到SYN_RCVD时,条件应该是“接收:SYN;发送:SYN,ACK”,而不是“接收:RST;发送:SYN,ACK”。这一点可以从英文原本的配图看到。

  2. 我也认为,书中的TCP状态转移图中,SYN_RCVD转移到LISTEN的条件应该是服务器状态,而非客户端状态

作者说明:

限于本人对某些技术点的理解程度(虽然也查了很多资料),可能某些地方表达的不太准确,敬请指教,联系方式为[email protected]。

时间: 2024-10-20 11:13:05

读懂TCP状态转移的相关文章

一篇带你读懂TCP之“滑动窗口”协议

前言 你现在的努力,是为了以后有更多的选择. 在上一篇文章通过"表白"方式,让我们快速了解网络七层协议了解了网络七层协议. 接下来我们要把重心放在网络传输的可靠性上面.一起来看TCP协议,它是如何解决网络传输不可靠的问题.这其中有个很关键的部分,就是我们的滑动窗口协议. 从工程学角度上,我们来看一看滑动窗口协议,它到底解决了一个怎样的问题? 滑动窗口协议: TCP协议的使用 维持发送方/接收方缓冲区 缓冲区是 用来解决网络之间数据不可靠的问题,例如丢包,重复包,出错,乱序 在TCP协议

iptables ip报文 tcp报文 tcp三次握手四次端口 有限状态机 状态转移

linux 网络防火墙 netfilter :是内核的一个frame :框架 iptables :数据报文过滤:nat mangle等规则生成工具 网络知识: IP报文首部   tcp报文首部 hdr len   报头首部长度  给出的字节需要乘以横向 32/8 = 4字节 Type of Service(服务类型)    服务类型 Total Length(总长度)          报文总长度    包括表头与内容 (Data) 部分.最大可达 65535 bytes.   注: 报文总长度

一片非常有趣的文章 三分钟读懂TT猫分布式、微服务和集群之路

原文http://www.cnblogs.com/smallSevens/p/7501932.html#3782600 三分钟读懂TT猫分布式.微服务和集群之路 针对新手入门的普及,有过大型网站技术架构牛人路过,别耽误浪费了时间,阅读之前,请确保有一定的网络基础,熟练使用Linux,浏览大概需要3-5分钟的时间,结尾有彩蛋. 目录 分布式 微服务 负载均衡集群 高可用集群 弹性云 故障转移 总结 分布式 小马正在经营一个在线购物网站,名叫TT猫,有商品管理.订单管理.用户管理.支付管理.购物车等

三分钟读懂TT猫分布式、微服务和集群之路

三分钟读懂TT猫分布式.微服务和集群之路 针对新手入门的普及,有过大型网站技术架构牛人路过,别耽误浪费了时间,阅读之前,请确保有一定的网络基础,熟练使用Linux,浏览大概需要3-5分钟的时间,结尾有彩蛋. 目录 分布式 微服务 负载均衡集群 高可用集群 弹性云 故障转移 总结 分布式 小马正在经营一个在线购物网站,名叫TT猫,有商品管理.订单管理.用户管理.支付管理.购物车等等模块,每个模块部署到独立的云服务主机. 现在,程序员小明同学浏览TT猫,想买一款牛逼的cherry机械键盘来提升自己的

[转帖]一文读懂分布式架构知识体系(内含超全核心知识大图)

一文读懂分布式架构知识体系(内含超全核心知识大图) https://yq.aliyun.com/articles/721007?spm=a2c4e.11153959.0.0.2f464977X7lSdH 作者 | 晓土  阿里巴巴高级工程师 姊妹篇阅读推荐:<云原生时代,分布式系统设计必备知识图谱(内含22个知识点)> 导读:本文力求从分布式基础理论.架构设计模式.工程应用.部署运维.业界方案这几大方面,介绍基于 MSA(微服务架构)的分布式知识体系大纲,从而对 SOA 到 MSA 进化有着立

区块链产业生态、存在问题及政策建议|一文读懂新趋势

区块链产业生态.存在问题及政策建议|一文读懂新趋势 2017-03-03 09:47:50  来源: 腾讯研究院抢沙发 摘要:从技术上来讲,区块链是一种分布式的记账方法.说到记账,我们经历了从实物记账向电子记账的演变关键词: 区块链 中国信息通信研究院与腾讯研究院区块链联合课题组 卿苏德,中国信息通信研究院区块链研究团队研究员,主要研究方向为区块链和人工智能等. 一.区块链技术原理和发展趋势 01| 区块链--一种分布式记账方法 从技术上来讲,区块链是一种分布式的记账方法.说到记账,我们经历了从

读懂Redis并配置主从集群及高可用部署

一.背景 运维工作尤其是linux运维,其实最考验你的能力,因为需要学习的东西实在太多, 你既要懂网络:思科华为设备的配置: 要懂性能调优:包括lamp或者lnmp的性能调优,也包括linux操作系统调优: 要懂数据库mysql或者nosql(例如mongodb): 要懂编程语言:Shell是最基本的,还要学习perl,python,甚至ruby和C++等(因为一些软件是这些语言编写的),还得熟练掌握awk,sed,grep以及正则表达式: 要懂一些调试排错的命令工具的使用,比如htop,dst

如何读懂statspack报告

前言:这篇文章是我从网上找到的,但可惜不知道是哪位大侠写(译)的,因此这里无法注明了.仔细看了看,这篇文章对初学者应该很有帮助,写的比较详细,通俗易懂,因此整理一下,便于阅读:内容略有调整,不单做调整,此记. 产生一个statspack报告是比较简单的,但是如何读懂statspack报告却不是那么容易,需要对Oracle的体系架构.内存结构.等待事件以及应用系统有充分的了解,加上不断的实践,才能基本读懂statspack报告并且从报告中找到调整优化Oracle的途径. 下面接合一个实际的stat

从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路

本文原作者阮一峰,作者博客:ruanyifeng.com. 1.引言 HTTP 协议是最重要的互联网基础协议之一,它从最初的仅为浏览网页的目的进化到现在,已经是短连接通信的事实工业标准,最新版本 HTTP/2 更是让它再次成为技术热点. 作为即时通讯开发者来说,深刻理解HTTP协议有助于在现今复杂移动网络环境下的优化和最佳实践的开展,本文将通俗易懂的地介绍 HTTP 协议的历史演变和设计思路. 学习交流: - 即时通讯开发交流3群:185926912[推荐] - 移动端IM开发入门文章:<新手入