TCP关闭过程

2023-11-03

状态迁移

1. SO_LINGER/ SO_REUSEADDR
    TCP正常的关闭过程如下(四次握手过程):
(FIN_WAIT_1) A       ---FIN--->       B(CLOSE_WAIT)
(FIN_WAIT_2) A       <--ACK--       B(CLOSE_WAIT)
(TIME_WAIT)A        <--FIN----       B(LAST_ACK)
(TIME_WAIT)A        ---ACK->       B(CLOSED)


Ø A端首先发送一个FIN请求给B端,要求关闭,发送后A段的TCP状态变更为FIN_WAIT_1,接收到FIN请求后B端的TCP状态变更为CLOSE_WAIT
Ø B接收到ACK请求后,B回一个ACK给A端,确认接收到的FIN请求,接收到ACK请求后,A端的TCP状态变更为为FIN_WAIT_2。
Ø B端再发送一个FIN请求给A端,与连接过程的3次握手过程不一样,这个FIN请求之所以并不是与上一个请求一起发送,之所以如此处理,是因为TCP是双 通道的,允许在发送ACK请求后,并不马上发FIN请求,即只关闭A到B端的数据流,仍然允许B端到A端的数据流。这个ACK请求发送之后,B端的TCP状态变更为LAST_ACK,A端的状态变更为TIME_WAIT。
Ø A端接收到B端的FIN请求后,再回B端一个ACK信息,对上一个FIN请求进行确认,到此时B端状态变更为CLOSED,Socket可以关闭。

 


除了如上正常的关闭(优雅关闭)之外,TCP还提供了另外一种非优雅的关闭方式RST(Reset)
(CLOSED) A ---RST--> B (CLOSED)
Ø A端发送RST状态之后,TCP进入CLOSED状态,B端接收到RST后,也即可进入CLOSED状态。
在第一种关闭方式上(优雅关闭),非常遗憾,A端在最后发送一个ACK请求后,并不能马上将该Socket回收,因为A并不能确定B一定能够接收到这个ACK请求,因此A端必须对这个Socket维持TIME_WAIT状态2MSL(MSL=Max Segment Lifetime,取决于操作系统和TCP实现,该值为30秒、60秒或2分钟)。如果A端是客户端,这并不会成为问题,但如果A端是服务端,那就很危险了,如果连接的Socket非常多,而又维持如此多的TIME_WAIT状态的话,那么有可能会将Socket耗尽(报Too Many Open File)。
服务端为了解决这个问题,可选择的方式有三种:
Ø 保证由客户端主动发起关闭(即做为B端)
Ø 关闭的时候使用RST的方式
Ø 对处于TIME_WAIT状态的TCP允许重用
一般我们当然最好是选择第一种方式,实在没有办法的时候,我们可以使用SO_LINGER选择第二种方式,使用SO_REUSEADDR选择第三种方式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP关闭过程 的相关文章

  • Python和OpenCV视觉图像处理

    特点 OpenCV 3 是用于计算机视觉 机器学习和图像处理的原生跨平台库 OpenCV 方便的高级 API 隐藏了非常强大的内部结构 旨在提高计算效率 可以利用多核和 GPU 处理 学习如何通过操作像素来处理图像并使用直方图分析图像 展示
  • 第14.13节 BeautifulSoup的其他功能导览

    前面 第14 9节 Python中使用urllib request BeautifulSoup获取url访问的基本信息 第14 10节 Python中使用BeautifulSoup解析http报文 html标签相关属性的访问 和 第14 1
  • Python pandas数据分析:电商客户价值分析

    嗨害大家好鸭 我是芝士 1 RFM 客户价值模型介绍 RFM模型是衡量客户价值和客户创造利益能力的重要工具和手段 在众多的客户关系管理 CRM 的分析模式中 RFM模型是被广泛提到的 该机械模型通过一个客户的近期购买行为 购买的总体频率以及
  • nodejs 读取文件中的几行

    最近遇到了这样的问题 如何每次从一个文件里面依次读里面的几行 对nodejs提供的readline和一些三方npm例如lineReader不满意 就自己实现一个简易版本 var fs require fs var data fs readF
  • Spark服务启动的一些总结

    1 我理解常用的Spark部署方式有三种 1 本地服务 就是所谓的local 在IDE上本地跑程序 用于调试 2 Standalone 使用自己的master worker进行服务的调度 脱离yarn的资源管理 3 Spark on yar
  • Java 转 C++ 那些事

    前提纪要 虽说编程语言只是承载思想的一种媒介 但是每种编程语言有自己的设计哲学 所以在实现自己思想的时候 也需要遵循该门语言的理念才行 截止 2022 年 07 月 12 日本人最大的体验是 Java 这门语言存在大量的过度封装 所以能封装
  • c#复习题2(含答案及解析)

    1 单选题 ArrayList集合的 属性表示集合中实际包含的元素数 A Capacity B Count C Total D Length 正确答案 B 解析 ArrayList集合的 Capacity属性表示它们所封装的Object 数

随机推荐

  • 【密码学】破解RSA密码(Python代码实现)

    题目 已知有人写了如下的代码 并将生成的 n e c 以及 n2 e2 c2 p2 1 q2 1 输出 from Crypto Util number import def ef p getPrime 512 q getPrime 512
  • 云开发初探 —— 更简便的小程序开发模式

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由heyli发表于云 社区专栏 小程序诞生以来 业界关注小程序前端的技术演进较多 因此众多小程序前端的框架 工具也应运而生 前端开发效率大大提高 而后台的开发技术则关注不多 痛点
  • js 解密

    Ai Chat sbaliyun com 在分析接口的时候 我们看到请求做了加密 查看事件我们发信啊了方法 callCHATGPT 得到 callCHATGPT 的代码 async function callCHATGPT var resp
  • 在概念堆里理解什么是智能SOA

    今年在继7月北京成功举办SOA与企业成长高峰论坛之后 在这个初冬的季节 IBM再次携众位专家11月15号在上海隆重举行了 IBM 2007 SOA创新高峰论坛 并且在这次峰会上首发了基于全球5700家SOA客户实施经验之上总结出的一套指导客
  • 实时查询与检测域名是否被微信封杀的核心代码和原理

    微信官方在对微信中推广活动的第三方网页内容管控越来越严格 如果活动效果稍微好一些 自己的网址域名可能就会被封杀 用户就打不开分享页面 很多人就是因为没有及时知道域名在微信中的状况 不知道什么时候被封的 然后导致损失惨重 在网上搜索了很多相关
  • 【Java基础教程】(三十六)常用类库篇 · 第六讲:数学运算类——全面讲解Java数学计算支持类库,BigDecimal、Math、Random、DecimalFormat...~

    Java基础教程之常用类库 数学运算类 1 概念 数学运算类汇总 2 优势和缺点 3 使用 3 1 各数学计算支持类使用案例 3 2 Math类 3 3 BigDecimal类 3 4 Random类 3 5 DecimalFormat类
  • Thymeleaf 对象空值处理

    前端代码 单例实体对象空值处理 div div class form group col md 6 div div
  • 小程序picker 多列选择详解

    需求 选择左边的选项 右边会显示对应的数据 如果你的数据和官方文档一样 数组套数组的形式 那直接复制复制就行了 这篇文章主要讲 数据是数组里面套对象的这种情况 我的数据结构如下 这就用用到 range key 属性 首先 通过 range
  • 【ubuntu】【rabbitmq】ubuntu 安装 rabbitmq

    文章目录 一 安装 erlang 二 添加公钥 三 更新软件包 可选 四 安装 RabbitMQ 五 RabbitMQ 状态管理 六 安装 web 插件 七 远程登录 web端 八 添加自定义 VHOST 及分配权限 一 安装 erlang
  • Java 使用LocalDate获取上周时间、本月时间等

    获取当前时间 LocalDate currentDate LocalDate now 获取当前日期所在的星期几 DayOfWeek currentDayOfWeek currentDate getDayOfWeek 计算需要减去的天数 in
  • 迟到的Pairwork工作总结 - by Glede

    迟到的总结 By Glede 队友连昭鹏的总结 http www cnblogs com lzplzp archive 2012 10 22 2732946 html 我们一开始交流的时候 就决定基本模仿生活中的电梯运行过程来设计程序 生活
  • 多列堆积柱形图怎么做_Excel两组数据做对比,用左右对比图才好看,操作简单又美观...

    我们都知道在Excel中 展示多组据的时候 可以使用图表来进行演示 Excel图表展示数据既直观 看起来也显得非常的大气 而一般人通常都是用柱形图 折线图等图表来展示 今天我们教大家一种特殊的图表 如何运用左右对比图来展示2组数据 如上图所
  • 老卫带你学---华为机试(17.坐标移动)

    华为机试 17 坐标移动 问题 题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或
  • 定制Android12系统:源码下载、编译、刷机(通俗易懂版本)

    定制系统步骤 一 下载源码 二 编译源码 三 刷机 一 源码下载 1 安装Git 2 安装Repo 3 新建目录 4 下载代码 1 Git是最常用的开源版本控制系统 git安装示例如下 2 Repo则是一个Google在git基础之上构建的
  • 你的眼界有多大,格局就有多大

    记得曾经有一次在公众号上看到一篇这样的文章 一个人格局越来越大的两个迹象 本文提出了重要的两点 格局大的人不计较小事的得失 他们只将时间和精力放在有意义的事情上 对错是非 我颇有感触 的确 我们日常的琐事比比皆是 只要是人与人之间进行交流
  • hadoop3.0.3高可用(ZK;DN)

    server1 5五台配置好apache的hadoop nfs utils rpcbind 将hadoopserver1挂载 gt 2 5 清空环境 sbin stop yarn sh sbin stop dfs sh rm fr tmp
  • yolov5 网络结构和后处理结构

    转自 https www 163 com dy article G07PMVPO0511ABV6 html 作者 gloomyfish 新智元导读 本文从原始的三个输出层解析实现了boxes classes nms等关键C 代码输出 实现了
  • 用js动态返回各类文本框的值

    1 返回单行文本输入框的值 示例 用户名
  • SpringBoot整合缓存框架(jetcache、memcached、mykit-cache)

    目录 1 缓存简介 2 应用场景 3 memcached 3 1 简介 3 2 特征 3 3 docker安装 3 3 1 拉取镜像 3 4 linux安装 4 jetcache 4 1 简介 4 1 2 引入依赖 4 1 3 jetcac
  • TCP关闭过程

    状态迁移 1 SO LINGER SO REUSEADDR TCP正常的关闭过程如下 四次握手过程 FIN WAIT 1 A FIN gt B CLOSE WAIT FIN WAIT 2 A lt ACK B CLOSE WAIT TIME