文章目录

  • 前言
  • 一、 TCP的生命周期
  • 二、另外两种挥手情况
  • 三、经典四问
  • 总结

前言

博主个人社区:开发与算法学习社区

博主个人主页:Killing Vibe的博客

欢迎大家加入,一起交流学习~~

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接,但断开连接的时候,由于双方的关闭时机不同,双方也相应的会有不同的状态。

一、 TCP的生命周期

这里有张图很好的总结了TCP整个生命周期(情况一):


服务端状态转化:

  • [CLOSED -> LISTEN] 服务器端调用listen后进入LISTEN状态,等待客户端连接;
  • [LISTEN -> SYN_RCVD] 一旦监听到连接请求(同步报文段),就将该连接放入内核等待队列中,并向客户端发送SYN确认报文。
  • [SYN_RCVD -> ESTABLISHED] 服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,可以进行读写数据了。
  • [ESTABLISHED -> CLOSE_WAIT] 当客户端主动关闭连接(调用close),服务器会收到结束报文段,服务器返回确认报文段并进入CLOSE_WAIT;
  • [CLOSE_WAIT -> LAST_ACK] 进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用close关闭连接时,会向客户端发送FIN,此时服务器进入LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)
  • [LAST_ACK -> CLOSED] 服务器收到了对FIN的ACK,彻底关闭连接。

客户端状态转化:

  • [CLOSED -> SYN_SENT] 客户端调用connect,发送同步报文段;
  • [SYN_SENT -> ESTABLISHED] connect调用成功,则进入ESTABLISHED状态,开始读写数据;
  • [ESTABLISHED -> FIN_WAIT_1] 客户端主动调用close时,向服务器发送结束报文段,同时进入FIN_WAIT_1;
  • [FIN_WAIT_1 -> FIN_WAIT_2] 客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2,开始等待服务器的结束报文段;
  • [FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发出LAST_ACK;
  • [TIME_WAIT -> CLOSED] 客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态。

二、另外两种挥手情况

当然上面的图只是其中一种情况,对应了博主之前讲4次挥手的情况一(总共有三种情况)。

下面博主给大家带来另外两种变形的情况:(是不是究极折磨

TCP中的状态转移(三种情况)相关推荐

  1. 在for循环中运行setTimeout的三种情况

    在for循环中运行setTimeout是前端开发很常见的一种模式.最近被考了一道相关的题目觉得很有意思也很容易犯错,于是记录下来当做学习笔记. 下面先来看一段代码: for(var i=0;i< ...

  2. ES6中let的用法及一个小案例,在for循环中运行setTimeout的四种情况:

    1.ES6中let和var的主要区别: (1)let声明的变量只在当前块级作用域内有效. if(true){var a=1;let b=2; } console.log(a); console.log ...

  3. js setTimeout的三种情况

    在for循环中运行setTimeout是前端开发很常见的一种模式.最近被考了一道相关的题目觉得很有意思也很容易犯错,于是记录下来当做学习笔记. 下面先来看一段代码: for(var i=0;i< ...

  4. C++必须使用【初始化列表】初始化数据成员的三种情况

    类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员: 2.进入构造函数后在构造函数中执行一般赋值与计算. 使用初始化列表有两个原因: 原因1.必须这样做: < ...

  5. Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...

  6. vue中处理后台返回的 html 特殊标签(‘\lt; p style=“xxx“ \gt;‘)或(\<p>)的三种情况及传给后端数据的解决方案

    问题一:vue中处理后台返回的 html 特殊标签('&lt: p style="xxx" &gt:')或(\<p>)的三种情况 返回数据 // 返回数 ...

  7. C/C++中野指针产生的三种情况

    C/C++中野指针产生的三种情况 1.指针变量未初始化: 任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气,此时若未初始化,则产生野指针. 2.指针释放后未置空: 有时 ...

  8. Vue或uniapp 中动态绑定背景图片(三种情况)

    Vue 中动态绑定背景图片(三种情况)_MrQiuGH的博客-CSDN博客_vue 动态背景图

  9. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

最新文章

  1. mysql登录报错:ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)
  2. 软件公司应该砍掉的成本
  3. HDU - 1556 Color the ball(树状数组)
  4. (三)系统与架构级低功耗设计
  5. .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
  6. 工厂方法与抽象工厂模式的区别
  7. 网络服务器虚拟化技术,网络虚拟化技术
  8. iptables time 时间匹配规则
  9. RDD创建及算子分类及应用
  10. linux中LCD之framebuffer设备驱动
  11. 2020年网络游戏产业现状
  12. 计算机系军训口号四句霸气,大一新生军训四句口号霸气押韵
  13. 标准二维表问题 (卡特兰数)
  14. [BZOJ3717] [PA2014] Pakowanie [状态压缩][dp]
  15. 根据IP地址查询所在地
  16. Ledger Nano X初始化使用教程
  17. 算1 - n的阶乘和末6位(超详细)
  18. js修改对象数组⾥的对象名字
  19. python:select interpreter resulted in an error python.setINterpreter not found
  20. ❤️❤️❤️Unity废柴看过来,手把手教你做植物大战僵尸(十七)—— 工程源码下载

热门文章

  1. html中怎么展示PDF文件
  2. rpx px 的区别
  3. Phala与Moonbeam集成,将PHA带入网络
  4. 海量并发低延时 RTC-CDN 系统架构设计(下)
  5. NLP发展的四个范式——Prompt的相关研究
  6. 爱奇艺财报:付费会员的商业化之觞
  7. Javascript基础思维导图01
  8. 干货分享 | 诺奖表观应用技术之KAS-seq助力转录活性调控研究
  9. VB为报表盖电子图章
  10. 云计算学习之路——文件服务NFS