tcp shutdown, fin_wait1, fin_wait2, close_wait, last_ack, 谢特!

TCP 作为双向传输协议,如果你想只收不发,可以单向关掉发,shutdown(socket.SHUT_WR),但不建议这么做。

看以下代码:

#!/Users/zhaoya/myenv/bin/python3
# client
import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 12345)
client_socket.connect(server_address)
client_socket.shutdown(socket.SHUT_WR) # 单向关闭发while True:try:data = client_socket.recv(1024)if not data:breakprint(f"recv: {data.decode()}")except:breakclient_socket.close()
#!/Users/zhaoya/myenv/bin/python3
# server
import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 12345)
server_socket.bind(server_address)
server_socket.listen(1)client_socket, client_address = server_socket.accept()while True:try:data = "xxxxx"client_socket.send(data.encode())print(f"send: {data}")except:breakclient_socket.close()
server_socket.close()

运行后:
在这里插入图片描述

状态很奇怪,人们很难接受一个连接在非 ESTABLISHED 状态下正常传输数据,这会引来一堆咨询,但根据 TCP 状态机,这又是合理的,client 单向关闭了发送,FIN 就过去了,server 回复了 FIN,进入 CLOSE_WAIT,client 收到回复进入 FIN_WAIT_2,而 server 在 CLOSE_WAIT 下发数据,client 在 FIN_WAIT_2 下是完全合理的。

为了少惹是生非,换一个方向,在 server 侧关闭掉收,client_socket.shutdown(socket.SHUT_RD),就香了:

client_socket, client_address = server_socket.accept()
client_socket.shutdown(socket.SHUT_RD) # 单向关闭收

此时状态很正常:
在这里插入图片描述

故,shutdown 的 SHUT_RD 仅影响 socket 接口(仅仅在读的时候报错,让你读不出去),不影响 TCP 状态。

再看纷扰的 FIN_WAIT_1/2。

TCP 的 RFC793 并未规定状态超时时间,为完整闭环这是合理的。但至少 Linux kernel 的 TCP 实现用不同的机制指定了 FIN_WAIT_1/2 的超时时间:

  • FIN_WAIT_1 超时时间由 net.ipv4.tcp_orphan_retries 控制:如果一直收不到针对 FIN 的 ACK,在彻底销毁这个 FIN_WAIT_1 连接前,等待的 RTO 退避次数;
  • FIN_WAIT_2 超时时间由 net.ipv4.tcp_fin_timeout 控制:默认值通常 60 秒。

这就带来了问题,如果按照上述第一种在 client 关闭发送方向的做法,连接进入 FIN_WAIT_2 状态,在 tcp_fin_timeout 之后连接将不可用(进入 TIME_WAIT),这可能并不符合 shutdown(WR) 调用者的意图。

换句话说 CLOSE_WAIT 明确在说 “我已经收到了对端的 FIN,正等着应用程序调用 shutdown + close 结束连接”,这意思是,只要一端发送了 FIN,另一端应用程序在一个预期的不太久的时间内关闭连接是意料之中的,也就是不建议连接在 CLOSE_WAIT + FIN_WAIT_2 的状态继续传输数据。但如果应用程序希望如此呢?只能在对端 shutdown(RD) 了。

TCP 挥手断连期间的其它超时时间相对还好理解,比如 LAST_ACK 状态的超时时间和 FIN_WAIT_1 一致,由 net.ipv4.tcp_orphan_retries 控制。

So?TCP 的挥手状态太复杂且歧义了,一般的咨询类问题也都围绕着这些状态,加上 “应用程序忘了 close”,“没有 shutdown 优雅关闭”,“多线程 socket 描述继承 + 优雅关闭” 等等问题更让人抓狂。

更合理的做法应将协议实现部分单独抽出一个控制面,用 keepalive 来 probe 连接,而不是靠内置状态的超时机制。TCP 标准规定某些状态可能就是无限等待,实现就不能自行安排超时。然而由于 TCP 一开始即带内控制,keepalive 可能是另一个问题(采用 out of window 序列号)而不是方案,参见 对 oow 的建议,一直在见缝捡漏。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/312.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

算法详解——线段树

1. 线段树介绍 线段树是一个高度平衡二叉树,它主要用来高效动态地管理一个序列。线段树叶子结点存储序列元素值,分支结点存储一个连续地子区间的某种聚合信息,例如最值、均值等信息。 如图所示: 用这样一个树状结构来管理序列…

XXL-JOB

Github 地址: https://github.com/xuxueli/xxl-job/ 。 官⽅介绍: https://www.xuxueli.com/xxl-job/ 。 XXL-JOB 于 2015 年开源,是⼀款优秀的轻量级分布式任务调度框架,⽀持任务可视化管理、弹性 扩容缩容、任务失败重试和告…

基于 Python 的 Django 框架开发的电影推荐系统

项目简介:本项目是基于 Python 的 Django 框架开发的电影推荐系统,主要功能包括: 电影信息爬取:获取并更新电影数据。数据展示:提供电影数据的列表展示。推荐系统:基于协同过滤算法实现个性化推荐。用户系…

服务器的免密登录和文件传输

在天文学研究中,通常会采用ssh登录服务器,把复杂的计算交给服务器,但是如果你没有进行额外的配置,那么登录服务器,以及和服务器进行文件传输,每次都要输入账号和密码,比较不方便,Win…

interrupt、interrupted、isInterrupted方法详解

interrupt方法的源码: public void interrupt() {if (this ! Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b blocker;if (b ! null) {interrupt0(); //仅仅对当前线程的中断位进行标记b.interrupt();return;}}interrupt0()…

yarn 下载安装、下载依赖、通过 vscode 运行服务(Windows11)

目录 yarn工具前置要求:安装node.js并配置好国内镜像源下载安装下载依赖特别的: 启动服务 yarn 工具 系统:Windows 11 前置要求:安装node.js并配置好国内镜像源 参考:本人写的《node.js下载、安装、设置国内镜像源…

JDK8 Kylin jdk-8u341-linux-x64.tar.gz

JDK8 Kylin jdk-8u341-linux-x64.tar.gz chmod 777 jdk-8u341-linux-x64.tar.gz tar -zxvf jdk-8u341-linux-x64.tar.gz chmod 777 -R jdk1.8.0_341 vi /etc/profile ESC :wq source /etc/profile java -version eclipse JRE tomcat

ssm基于vue框架和elementui组件的手机官网+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框…

如何封装一个可取消的 HTTP 请求?

前言 你可能会好奇什么样的场景会需要取消 HTTP 请求呢? 确实在实际的项目开发中,可能会很少有这样的需求,但是不代表没有,比如: 假如要实现上述这个公告栏,每点击一个 tab 按钮就会切换展示容器容器中…

关于武汉芯景科技有限公司的马达驱动芯片AT6237开发指南(兼容DRV8837)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 逻辑功能

sqlserver、达梦、mysql调用存储过程(带输入输出参数)

1、sqlserver,可以省略输出参数 --sqlserver调用存储过程,有输入参数,有输出参数--省略输出参数 exec proc_GetReportPrintData 1, , , 1--输出参数为 null exec proc_GetReportPrintData 1, , , 1, null--固定输出参数 exec proc_GetReport…

leetcode 1470.重新排列数组

1.题目要求: 2.题目代码: class Solution { public:vector<int> shuffle(vector<int>& nums, int n) {vector<int> x_array(nums.begin(),nums.begin() n);vector<int> y_array(nums.begin() n,nums.end());int x_index 0;int y_index 0;for…

各地级市能源消耗量数据-基于灯光数据的反演(2000-2022年)

今天带来的数据是的全国各省市能源消耗量数据&#xff0c;省级的能源消耗量数据可以在统计年鉴之中查到&#xff0c;但市级的数据却暂无统计。但今天我们基于一篇论文提供的思路&#xff0c;通过夜间灯光与省级能源消耗量对更小尺度的地区能源消耗量进行反算。原文提供1995-200…

微服务设计模式 - 重试模式(Retry Pattern)

微服务设计模式 - 重试模式&#xff08;Retry Pattern&#xff09; 定义 重试模式&#xff08;Retry Pattern&#xff09;是一种微服务中的设计模式&#xff0c;用于在临时性失败&#xff08;如网络故障或暂时不可用的服务&#xff09;发生时&#xff0c;自动重新尝试请求&…

从源码到成品应用:互联网医院系统与在线问诊APP的开发全解析

今天将全面解析互联网医院系统和在线问诊APP的开发过程&#xff0c;从源码到成品应用&#xff0c;帮助您理解其中的关键技术和实施策略。 一、系统架构设计 互联网医院系统和在线问诊APP的开发首先需要一个合理的系统架构。通常&#xff0c;系统架构分为前端和后端两个部分。…

简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

ZooKeeper 客户端API操作

文章目录 一、节点信息1、创建节点2、获取子节点并监听节点变化3、判断节点是否存在4、客户端向服务端写入数据写入请求直接发给 Leader 节点写入请求直接发给 follow 节点 二、服务器动态上下线监听1、监听过程2、代码 三、分布式锁1、什么是分布式锁?2、Curator 框架实现分布…

C++/list

目录 1.list的介绍 2.list的使用 2.1list的构造 2.2list iterator的使用 2.3list capacity 2.4list element access 2.5list modifers 2.6list的迭代器失效 3.list的模拟实现 4.list与vector的对比 欢迎 1.list的介绍 list的文档介绍 cplusplus.com/reference/list/li…

计算机图形学中向量相关知识chuizhi

一、向量加法 平行四边形法则 两个向量统一起点&#xff0c;构成平行四边形&#xff0c;对角线为向量加和的结果 三角形法则 两个向量尾首相连&#xff0c;从a起点连接到b终点&#xff0c;为向量加法的结果 多向量首尾相连的加法结果为第一个向量的起点到最后一个向量的终点…

私有化视频平台EasyCVR视频汇聚平台接入RTMP协议推流为何无法播放?

私有化视频平台EasyCVR视频汇聚平台兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 有用户反馈&#xff0c;项目现场使用RTMP协议接入EasyCVR平台&#xff0c;但是视频却不…