TCP关闭全状态记录

当接收端的内核缓冲区中的数据没有全部交给应用程序时, 如果接收端关闭socket(比如调用close或者进程挂掉),就会回以RST报文 在通常情况下,  调用close的时候, 会发FIN包, 但是, 如果接收端没有用recv把内核缓冲区的数据取完, 却执行了关闭socket的操作(比如调用close或者进程挂掉), 那么这就是异常的情况, 此时接收端会回RST报文。         我们来看看, 服务端程序为: #include #include #include #include #include #includ 阅读详情

 关闭时状态转变:

client:   Fin_wait_1 -> Fin_wait_2 -> Time_wait -> closed

server: Close_wait -> Last_ack -> closed

 

Fin_wait_1 发生在client 发出Fin包后, 并等待server 回 ack 时.

Fin_wait_2 发生在client收到ack包后, 并等待server发出Fin包时.

Time_wait 发生在client收到Fin包并发出ack包后, 在等待2msl的时间时.

Close_wait 发生在server收到client的fin包并且发出ack包后以及自己主动关闭发出fin包前.

Last_ack发生在server发出fin包后, 并等待client回ack时.

 

经常出现的状态组合:

  • client: fin_wait_2;  server: close_wait

原因: 当client close了,但是server忘记close的时候, 即server在收到client的fin后并没有发送fin包给client, 导致自己处于close_wait状态, 而client在等待server的fin包,处于fin_wait_2状态.

 

  •  client:time_wait; server: closed

原因: 当client, server都close了, client必须处于time_wait状态等待2msl时间. 于是如果server是处于高并发短连接的状态, 就会有大量的time_wait的连接霸占着. 使得其他的连接连接不了.

 

解决方法: 用linger强制关闭可以解决此问题(用rst代替fin),但是linger会导致数据丢失,linger值为0时是强制关闭,无论并发多少多能正常连接上,如果非0会发生部分连接不上的情况!(可调用setsockopt设置套接字的linger延时标志,同时将延时时间设置为0。)
TCP/IP的RFC文档。TIME_WAIT是TCP连接断开时必定会出现的状态。
是无法避免掉的,这是TCP协议实现的一部分。
在WINDOWS下,可以修改注册表让这个时间变短一些
time_wait的时间为2msl,默认为4min.
你可以通过改变这个变量:
TcpTimedWaitDelay
把它缩短到30s

 

PS: Linux 查看 tcp 状态的命令 netstat -an | grep portnumber

 

 

Linux close()和shutdown()的区别.

 

    Linux的版本是kernel-2.6.21:
    1,只要TCP栈的读缓冲里更有未读取(read)数据,则调用close时会直接向对端发送RST。
    2,shutdown和socket描述符没有关系,即使调用shutdown(fd, SHUT_RDWR)也不会关闭fd,最终还需close(fd)。
    3,能认为shutdown(fd, SHUT_RD)是空操作,因为shutdown后还能继续从该socket读取数据,这点也许还需要进一步证实。
    4,在已发送FIN包后write该socket描述符会引发EPIPE/SIGPIPE。
    5,当有多个socket描述符指向同一socket对象时,调用close时首先会递减该对象的引用计数,计数为0时才会发送FIN包结束TCP连接。shutdown不同,只要以SHUT_WR/SHUT_RDWR方式调用即发送FIN包。
    6,SO_LINGER和close,当SO_LINGER选项开启但超时值为0时,调用close直接发送RST(这样能避免进入TIME_WAIT状态,但破坏了TCP协议的正常工作方式),SO_LINGER对shutdown无影响。
    7,TCP连接上出现RST和随后可能的TIME_WAIT状态没有直接关系,主动发FIN包方必然会进入TIME_WAIT状态,除非不发送FIN而直接以发送RST结束连接。

 

TCP连接及状态分析 附:当服务器存在大量TIME_WAIT和CLOSE_WAIT时,说明有大量连接关闭,可通过。协助分析,若累积达到句柄上线时会出现。 阅读详情

相关推荐

vpp tcp的正常关闭和异常关闭

正常关闭: 1、被动关闭(接收到fin报文) 1.1、TCP_STATE_ESTABLISHED 发送fin报文的ack,设置TCP_STATE_CLOSE_WAIT; 将连接添加到wrk->pending_disconnects向量,连接打上TCP_CONN_DCNT_PENDING标记; 1.2、TCP_STATE_SYN_RCVD(服务端第一次握手申请的客户端连接,此连接未在app端进行对应的连接申请) 发送fin报文,设置连接为T...

qq_29044159的博客 608

tcp断开

TCP状态转移要点     TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得 注意的状态有两个:CLOSE_WAIT和TIME_WAIT。 1、LIS

dinkysummydinky的专栏 1158

TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题解决

对于服务器挂起中的CLOSE_WAIT & FIN_WAIT2 解决方案。

TCP的连接和释放

TCP的连接 TCP连接的建立采用客户服务器方式。TCP连接可分为通信双方一方发起连接和双方同时发起连接。 一方发起连接         假设A方为客服端,B为服务器端,由A向B发起建立连接请求。         B的服务器进程创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程处于LISTEN状态,等待客服端的连接请求。         A打的TCP客服端进程创建控制块TC

无语的阿辉 1万+

MounRiver Studio实战:像管理个人项目一样整理沁恒MCU的EVT例程(附文件结构图)

本文详细介绍了如何使用MounRiver Studio重构沁恒MCU的EVT例程,实现工程化管理。通过分析官方EVT设计的局限性,提出标准化的目录结构和迁移步骤,帮助开发者提升代码可维护性和团队协作效率。文章还提供了MounRiver Studio的关键配置参数和常见问题排查指南,适用于沁恒MCU开发者。

weixin_33940469的博客 356

无线自组织网络基础知识

参考书籍:《无线自组织网络路由协议及应用》 目录第一章 绪论1.1 无线自组织网络概述1.1.1 无线自组织网络的定义及分类1.1.2无线自组织网络的主要特点1.1.3无线自组织网络的应用与发展1.无线自组织网络的应用2.无线自组织网络的起源和发展1.2典型的无线自组织网络1.2.1移动Ad Hoc网络1、移动Ad Hoc网络的定义2.移动AdHoc网络的特点3.移动Ad Hoc网络的应用1.2....

逸凌Time 2万+

QTcpSocket 读取内容

方法一、在这里最好用bytesAvailable,因为在用canReadLine()的时候,有时会出现还有内容可读,却返回false的情况 while(socket.bytesAvailable()) { tmp=socket.readLine(); response<<tmp; }方法二、这种方...

zhubingke的博客 2889

Win10 LTSC 2021 CPU占用率飙升?KB5017308补丁修复全攻略

本文针对Windows 10 LTSC 2021系统中因wsappx进程导致的CPU占用率异常飙升问题,提供了详细的解决方案。核心在于安装微软官方发布的KB5017308补丁,该补丁能从根本上修复系统组件缺陷,使CPU占用恢复正常。文章详解了补丁的下载、安装步骤、注意事项及安装后的验证方法,是解决此问题的权威指南。

python9snake的博客 1263

TCP连接的状态与关闭方式,及其对Server与Client的影响

首先介绍一下TCP连接建立与关闭过程中的状态。TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用、特定数据包以及超时等,具体状态如下所示:CLOSED:初始状态,表示没有任何连接。LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求。SYN_SENT:发送连接请求后等待确认信息。当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入S

zhaofuguang的专栏 1万+

IDM更改下载路径的详细指南

Internet Download Manager(IDM)是一款功能全面的下载加速工具,它支持多种浏览器和协议,能够显著提升下载速度,同时提供断点续传、多线程下载等实用功能。IDM的用户界面简洁明了,操作便捷,使得用户能够轻松管理下载任务。此外,IDM还支持自动分类下载文件、定时下载等高级功能,进一步提升了用户的下载体验。通过本文的介绍,相信用户已经掌握了如何在IDM中更改下载路径的方法。这一功能不仅提升了下载效率和文件管理便捷性,还满足了用户的个性化需求。

nntxthml的博客 1763

基于Python适用于YOLO目标检测算法的图片数据增强处理

为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15°

weixin_67136409的博客 699

TCP连接的状态详解以及故障排查

我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助。(总结网络上的内容) 1、TCP状态 了解TCP之前,先了解几个命令: linux查看tcp的状态命令: 1)、netstat -nat 查看TCP各个状态的数量 2)、lsof -i:port 可以检测到打开套接字的状况 3)、 sar -n SOCK 查看tcp创建的连接数 4)、tcpdump -iany...

黄规速博客:学如逆水行舟,不进则退 23万+

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1856

TCP状态机

TCP状态机在本质上就是三次握手和四次挥手,所以先来看一下三握四挥的过程。如果有机会,以后会使用实际的操作来进行说明。 关于TCP的基本知识,在这就不说了,以后有空再写一篇文章来进行记录。 三次握手 三次握手就是TCP建立连接的过程,因为我们知道TCP是可靠的,有连接的,所以在通信双方进行数据交换前要先建立连接。 首先先明确一下在传输过程中的一些符号。 32位序号 seq:Sequence number,TCP通信过程中某一个传输方向上的字节流的每个字节的序号,通过这个来确认发送的数据有序。 32位确

weixin_43677673的博客 4390

使用 MATLAB/Simulink 来构建一个基于多能互补的微电网储能系统模型

【摘要】本文详细介绍了基于MATLAB/Simulink的多能互补微电网储能系统建模方法。教程涵盖光伏发电、风力发电、电池储能和负荷模块的搭建,重点讲解了能量管理系统(EMS)的调度策略实现。通过设置传感器监测关键参数,并采用固定步长离散求解器进行仿真,分析了系统在动态工况下的响应特性,包括发电-负荷平衡、储能状态变化及系统稳定性等指标。该建模方法为多能互补微电网的设计与优化提供了有效工具,对提升可再生能源利用效率具有实践指导意义。

MHD0815的博客 190

SAP_通用模块-MASS批量操作技巧

SAP_MM模块-MASS/MM17批量更新主数据详细教程

风沙的博客 2167

TCP/IP卷一:68---TCP连接管理之(TCP状态转换图、TIME_WAIT状态、静默时间、FIN_WAIT_2状态、同时打开/同时关闭的状态)

一、TCP状态转换图 图中的状态用椭圆表示,而状态之间的转换则用箭头表示 TCP连接的每一端都可以在这些状态中进行转换: 有些转换是由于接收到某个控制位字段置位的报文段而引发的(例如,SYN,ACK,FIN) 而有些转换又会要求发送一些控制位字段置位的报文段 另外还有一些转换是由应用程序的动作或计时器超时引发的。上述各种情况都以文本注释的方式标记在转换图的相关箭头旁边 当初...

董哥的黑板报 3967

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TCP有限状态机

TCP 有限状态机 很多人都知道TCP协议有名的三次握手和四次挥手,实际上它们是基于TCP协议的简约版的抽象,而这两个动作的背后本质上是TCP的协议转换; TCP协议的操作流程可以使用一个包含11种状态的有限状态机( Finite State Machine )来表示,即下图描述了TCP有限状态机的运作流程,箭头指向表示状态之间的转换,粗实线表示客户端主动与和服务端建立连接的流程,粗虚线表示对应的...

fly9006的博客 2318

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TCP建立和关闭的过程

一、TCP协议简介 TCP,工作在OSI的传输层,提供面向连接的可靠传输服务。 TCP的工作主要是建立连接,然后从应用层程序中接收数据并进行传输。TCP采用虚电路连接方式进行工作,在发送数据前它需要在发送方和接收方建立一个连接,数据在发送出去后,发送方会等待接收方给出一个确认性的应答,否则发送方将认为此数据丢失,并重新发送此数据。 TCP报头总长最小为20个字节,其报头结构如下图

zephyr_be_brave的专栏 1130

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TCP 状态机

TCP 状态机 TCP 协议的操作可以使用一个具有 11 种状态的有限状态机( Finite State Machine )来表示,图 3-12 描述了 TCP 的有限状态机,图中的圆角矩形表示状态,箭头表示状态之间的转换,各状态的描述如表 3-2 所示。图中用粗线表示客户端主动和被动的服务器端建立连接的正常过程:客户端的状态变迁用粗实线,服务器端的状态变迁用粗虚线。细线用于不常见的序列,如 ...

p656456564545的专栏 387

TCP的11种状态

TCP三次握手建立连接 Tcp头部 六个标志位中,我们要用到三个: SYN:SYN= 1表示这是一个连接请求或连接接受报文。在建立连接时用来进行同步序号(个人理解是,在建立连接的时候,提醒对方记录本方的起始序号)。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若是同意建立连接,则应响应的报文段中使SYN=1、ACK=1。因此SYN=1表示该报文是一个连接请求报文或者...

m493096871的博客 1060

tcp 连接详细关闭过程

TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。  简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例: 1.服务器读通道关闭 2.客户机写通道关闭 3.客户机读通道关闭 4.服务器写通道关闭 关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信

baotoushashou的专栏 1776

linux查看tcp连接状态_TCP连接管理之(TCP状态转换图、TIME_WAIT状态、静默时间、FIN_WAIT_2状态)...

一、TCP状态转换图TCP/IP协议栈深度解析丨实现单机百万连接丨优化三次握手、四次挥手丨优化TCP的传输速率丨epoll原理剖析和面试必问的问题_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.comc/c++Linux实战训练精讲丨徒手实现网络协议栈丨TCP/IP协议栈丨面试必备系列_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.c...

weixin_39572972的博客 705

(UNP点滴记录) TCP连接建立和终止及TCP状态转换

2012-11-17 wcdj 关键字: UDP,TCP,三次握手,四次握手,TCP状态转换,11种状态,TIME_WAIT 用户数据报协议(UDP) UDP是一个简单的传输层协议(RFC 768)。 进程往一个UDP套接字写入一个消息,该消息随后被封装(encapsulating)到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地。 (1) UDP的几

delphiwcdj的专栏 2765

连接状态_TCP连接管理之(TCP状态转换图、TIME_WAIT状态、静默时间、FIN_WAIT_2状态)...

一、TCP状态转换图TCP/IP协议栈深度解析丨实现单机百万连接丨优化三次握手、四次挥手丨优化TCP的传输速率丨epoll原理剖析和面试必问的问题_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.comc/c++Linux实战训练精讲丨徒手实现网络协议栈丨TCP/IP协议栈丨面试必备系列_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.c...

weixin_39703773的博客 709

TCP连接状态异常记录

参考:http://blueskykong.com/2018/07/26/tcp-close-wait/ 问题描述 分布式事务Lottor在测试环境中运行一段时间之后,出现Lottor客户端连接不上Lottor Server的情况。经过排查,发现根源问题是Lottor客户端获取不到Lottor Server的集群信息。 Lottor Server启动了两个端口:9666为Tomcat容器的...

SAN_YUN的专栏 812
上一篇: Sharing files between windows and linux
下一篇: (转)同步/异步与阻塞/非阻塞的区别
daeees
博客等级 码龄19年 6粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值