个人对TCP11种状态转换的理解

首先就是这张很经典的图,我们围绕这个图开讲

咱分条来说各个转换之间的动作

首先从CLOSED开始

如果是CLOSED-》LISTEN 代表这是服务端 监听某个端口 准备接受其他人的connect了

如果是CLOSED-》SYN_SENT 代表这是一个客户端发送了connect  发送了SYN=1,进行了TCP的第一次握手 然后等待对方的第二次握手发送SYN=1和ACK=1

当收到了SYN=1和ACK=1后(第二次握手),并且自己发送了ACK=1(第三次握手) 这时候在客户端这边,就已经建立了TCP连接,所以就是SYN_SENT -》ESTABLISHED 代表正式建立了连接

这时候回到服务端接收端这边 服务端接受到第一次握手SYN=1后,自己发送第二次握手SYN=1 ACK=1,就已经进入了SYN_RCVD状态,等待着第三次握手的到来

等到第三次握手的到来,于是收到了ACK=1,于是服务端这边的连接也建立成功,SYN_RCVD-》ESTABLISHED

当然 在SYN_RCVD等待第三次握手的时候,也有可能收到的不是第三次握手,而是一个RST(reset)标志,这就代表要重置这个连接,所以当收到RST的时候,SYN_RCVD-》LISTEN 退化了

然后接下来就是TCP的关闭状态了,这时候就涉及到了TCP的4次挥手,当然在状态上有主动关闭和被动关闭的区别

先说说主动关闭 一般是客户端发起(虽然并没有什么客户端服务端区别,但就这样叫了)

首先先是向服务端发送一个FIN=1,代表客户端到服务端这单向路莫得数据要传了,于是这里就从ESTABLISHED-》FIN_WAIT_1 状态 第一次等待,等待服务端下一个数据包传过来的ACK

然后呢,当服务端传过来一个ACK,这个ACK的值为上一次发送FIN的时候,传过去的SEQ+1,这时候,就是FIN_WAIT_1-》FIN_WAIT_2 ,开始等待服务端的FIN了

当收到了服务端最后一个FIN,代表了服务端到客户端这单线也莫得数据要传送了,然后自己发送一个ACK,表示自己收到了对面的FIN,于是终于FIN_WAIT_2进入到了TIME_WAIT阶段

为什么要有TIME_WAIT阶段而且要持续2MSL(MSL为报文最大生命周期,WINDOWS一般为2分钟)呢?因为有可能对方服务器端莫得收到最后的ACK,所以这段时间是用来重传等待的

等过了这段时间,就真正断开回到了CLOSED了

然后可以说下服务端那边的被动关闭了,服务端当他接受到了FIN后,肯定还可能会有数据没传完,所以数据夹带一个ACK(此时ACK=发送过来的FIN报文中的SEQ+1)传过去告诉客户端知道了 ,再塞点数据。然后发送了ACK就从ESTABLISHED进入了CLOSE_WAIT阶段

然后最后 服务端也没数据了 然后就发送了FIN报文,告诉对方自己莫得数据了,然后等待对面的ACK回应,这时候就从CLOSE_WAIT进入了LAST_ACK阶段

最后的最后,当接受到了客户端最后一个ACK,彻底解放,回到CLOSED的怀抱中

这时候说两个同时的例子

一个是同时打开

TCP第一次握手都发送的是SYN=1嘛

有时候会碰到客户端发送了SYN=1,第一次挥手,然后进入到了SYN_SENT状态

这时候 原本应该接受对方的第二次握手 本应该收到的是SYN=1并且ACK=1

但是这时候只收到了一个SYN=1的话,就代表是双方同时发送了SYN第一次握手。此时虽然双方发出去的时候都为SYN_SENT,但是在收到了对方的SYN=1后,就变成了SYN_RCVD了

那有啥好讲的,双方都只能回复一个第二次握手回去咯,所以双方都发送了SYN=1,ACK=1,此时这个发送的ACK就是帮助对方从SYN_RCVD进入到ESTABLISHED状态了

然后就是同时关闭

和上面一样,原本主动发送FIN的一方,变成FIN_WAIT准备收获对面的第二次挥手ACK了

但是 这时候突然也直接受到了对面的FIN=1,

那能怎么办,直接相视一笑,都对对面发送一个ACK的确认,然后进入CLOSING的状态

等待对方的ACK一到,直接就进入TIME_WAIT状态了 等2MSL后就CLOSED了

这就是我自己对TCP11种状态间的转换的理解

原文地址:https://www.cnblogs.com/EatMedicine/p/10612386.html

时间: 2024-10-03 00:55:14

个人对TCP11种状态转换的理解的相关文章

Session和几种状态保持方案理解

一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们可以看到这样的话"在一个浏览器会话期间,...",这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①.最混乱的是

23种状态模式的理解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代器模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 工厂方法模式 首先,良好的封装性,代码结构清晰.一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名就可以

线程的几种状态转换<转>

线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权.即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得. 3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止

转:线程的几种状态转换

线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于"可运行线程池"中,变得可运行,只等待获取CPU的使用权.即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得. 3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权

hibernate 增改查后对象的三种状态转换

this.getSession().update(obj); this.getSession().merge(obj); this.getSession().saveOrUpdate(obj);1. update 和 merge的区别 首先在执行更新操作的时候,两者都必须要有id update是直接执行update 语句,执行后状态为持久化状态 而merge则不一样: 1. 如果session中有与之对应的对象,也就是主键相同,则会把要保存的obj的值copy给session中的对象,然后upd

hibernate对象的三种状态的简单理解

1.  transient:对象首先被new出来的时候:这是它存在内存中,缓存中没有,没有ID,数据库中也没有 2.  persistent:对象再执行save()方法后, Session用一个Map<id,对象引用>保存在缓存中,并保存在数据库中,所以ID有,内存(缓存)有,数据库有. 3.  datached:在Session执行close()方法后,缓存中的Map被清除,所以对象与数据库失去联系,它有ID,在内存有,缓存中没有,数据库中有.

hibernate对象的三种状态及转换

hibernate对象的三种状态转换关系图 三种状态 瞬时状态(transient): 通过new创建对象后,对象并没有立刻持久化,  它并未参与数据库中的数据有任何的关联,此时java对象的状态为瞬时状态.session对瞬时状态的对象一无所知,当对象不再被引用时,她的数据也就丢失了, 对象将会被java虚拟机按照垃圾回收机制处理. 持久状态(persistent): 当对象与session关联,被session管理时,它就处于持久化状态.处于持久状态的对象拥有数据库的标志.对象什么时候与se

02-Hibernate实体类的三种状态

一.Hibernate的实体类有三种状态 Transient:瞬时状态,不被hibernate session管理,而且实体数据在数据库不存在 Persistent:持久化状态,被session管理,此时的对象被放在session的缓存中,实体对象存在数据库中. Detached:离线状态,实体对象在数据库中有数据与之对应,但是不被session管理 注意:被session所管理的实体对象,当对象的属性发生改变,在提交事务的时候会自动更新改变后的属性到数据库中. 下图是hibernate试题对象

Hibernate 三种状态理解及转换

首先先说下hibernate中的三个状态,只有完全理解了这三个状态,才能在项目中充分利用hibernate这个工具来完成项目进度. 1.瞬时态,也叫临时态等,不受hibernate session管制的状态,即某个实例跟session没有任何关联,比如new产生的实例. 2.持久态,session中持久化了的实例,相当于数据库中的记录,修改实例的任何属性都会导致数据库记录的变更. 3.托管态,也叫游离态等,持久化对象脱离了Session的对象.如Session缓存被清空的对象.特点:已经持久化,