返回顶部
首页 > 资讯 > 精选 >如何分析Socket TIME_WAIT 问题
  • 364
分享到

如何分析Socket TIME_WAIT 问题

2023-06-04 13:06:13 364人浏览 安东尼
摘要

本篇文章给大家分享的是有关如何分析Socket TIME_WaiT 问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Socket TIME_WAIT 问题tcp/ip详解的卷

本篇文章给大家分享的是有关如何分析Socket TIME_WaiT 问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。


Socket TIME_WAIT 问题

tcp/ip详解的卷1有详细介绍过tcp的相关内容,其中TIME_WAIT讲得有点晦涩,今日找到一篇不错的文章,特拿来分享一下。

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"/t",state[key]}'

会得到类似下面的结果,具体数字会有所不同:

LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

下面解释一下为啥要这样写:

一个简单的管道符连接了netstat和awk命令。

------------------------------------------------------------------

每个TCP报文在网络内的最长时间,就称为MSL(Maximum Segment Lifetime),它的作用和IP数据包的TTL类似。

RFC793指出,MSL的值是2分钟,但是在实际的实现中,常用的值有以下三种:30秒,1分钟,2分钟。

注意一个问题,进入TIME_WAIT状态的一般情况下是客户端,大多数服务器端一般执行被动关闭,不会进入TIME_WAIT状态,当在服务

器端关闭某个服务再重新启动时,它是会进入TIME_WAIT状态的。

举例:
1.客户端连接服务器的80服务,这时客户端会启用一个本地的端口访问服务器的80,访问完成后关闭此连接,立刻再次访问服务器的

80,这时客户端会启用另一个本地的端口,而不是刚才使用的那个本地端口。原因就是刚才的那个连接还处于TIME_WAIT状态。
2.客户端连接服务器的80服务,这时服务器关闭80端口,立即再次重启80端口的服务,这时可能不会成功启动,原因也是服务器的连

接还处于TIME_WAIT状态。


检查net.ipv4.tcp_tw当前值,将当前的值更改为1分钟:
[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[root@aaa1 ~]#

vi /etc/sysctl
增加或修改net.ipv4.tcp_tw值:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

使内核参数生效:
[root@aaa1 ~]# sysctl -p

[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

用netstat再观察正常


这里解决问题的关键是如何能够重复利用time_wait的值,我们可以设置时检查一下time和wait的值
#sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

问一下TIME_WAIT有什么问题,是闲置而且内存不回收吗?

是的,这样的现象实际是正常的,有时和访问量大有关,设置这两个参数: reuse是表示是否允许重新应用处于TIME-WAIT状态的

socket用于新的TCP连接; recyse是加速TIME-WAIT sockets回收

Q: 我正在写一个unix server程序,不是daemon,经常需要在命令行上重启它,绝大 
多数时候工作正常,但是某些时候会报告"bind: address in use",于是重启失 
败。 

A: Andrew Gierth 
server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。至于 
TIME_WAIT状态,你无法避免,那是TCP协议的一部分。 

Q: 如何避免等待60秒之后才能重启服务 

A: Erik Max Francis 

使用setsockopt,比如 

-------------------------------------------------------------------------- 
int option = 1; 

if ( setsockopt ( masterSocket, SOL_SOCKET, SO_REUSEADDR, &option, 
sizeof( option ) ) < 0 ) 

die( "setsockopt" ); 

-------------------------------------------------------------------------- 

Q: 编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思? 

A: 这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用 
端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息, 
指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧 
使用同一端口,此时 SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期 
望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不 
可能。 

一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端 
口。SO_REUSEADDR 仅仅表示可以重用本地本地地址、本地端口,整个相关五元组 
还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。必须慎重使 
用 SO_REUSEADDR 选项。 

Q: 在客户机/服务器编程中(TCP/SOCK_STREAM),如何理解TCP自动机 TIME_WAIT 状 
态? 

A: W. Richard Stevens <1999年逝世,享年49岁> 

下面我来解释一下 TIME_WAIT 状态,这些在<> 
中2.6节解释很清楚了。 

MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现 
都必须选择一个确定的MSL值。RFC 1122建议是2分钟,但BSD传统实现采用了30秒。 

TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。 

IP头部有一个TTL,最大值255。尽管TTL的单位不是秒(根本和时间无关),我们仍需 
假设,TTL为255的TCP报文在Internet上生存时间不能超过MSL。 

TCP报文在传送过程中可能因为路由故障被迫缓冲延迟、选择非最优路径等等,结果 
发送方TCP机制开始超时重传。前一个TCP报文可以称为"漫游TCP重复报文",后一个 
TCP报文可以称为"超时重传TCP重复报文",作为面向连接的可靠协议,TCP实现必须 
正确处理这种重复报文,因为二者可能最终都到达。 

一个通常的TCP连接终止可以用图描述如下: 

client server 
FIN M 
close -----------------> (被动关闭) 
ACK M+1 
<----------------- 
FIN N 
<----------------- close 
ACK N+1 
-----------------> 

为什么需要 TIME_WAIT 状态? 

假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发 
最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连 
接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面 
临重发最终ACK的情形。 


scz 2001-08-31 13:28 

先调用close()的一方会进入TIME_WAIT状态 


此外,考虑一种情况,TCP实现可能面临先后两个同样的相关五元组。如果前一个连 
接处在 TIME_WAIT 状态,而允许另一个拥有相同相关五元组的连接出现,可能处理 
TCP报文时,两个连接互相干扰。使用 SO_REUSEADDR 选项就需要考虑这种情况。 

为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间? 

如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。 
第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二 
个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT 
状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被 
丢弃。建立第二个连接的时候,不会混淆。 

A: 小四 

在Solaris 7下有内核参数对应 TIME_WAIT 状态保持时间 

# ndd -get /dev/tcp tcp_time_wait_interval 
240000 
# ndd -set /dev/tcp tcp_time_wait_interval 1000 

缺省设置是240000ms,也就是4分钟。如果用ndd修改这个值,最小只能设置到1000ms, 
也就是1秒。显然内核做了限制,需要Kernel Hacking。 

# echo "tcp_param_arr/W 0t0" | adb -kw /dev/ksyms /dev/mem 
physmem 3b72 
tcp_param_arr: 0x3e8 = 0x0 
# ndd -set /dev/tcp tcp_time_wait_interval 0 

我不知道这样做有什么灾难性后果,参看<>的声明。 

Q: TIME_WAIT 状态保持时间为0会有什么灾难性后果?在普遍的现实应用中,好象也 
就是服务器不稳定点,不见得有什么灾难性后果吧? 

D: rain@bbs.whnet.edu.cn 

linux 内核源码 /usr/src/linux/include/net/tcp.h 中 

#define TCP_TIMEWAIT_LEN (60*HZ)  

最好不要改为0,改成1。端口分配是从上一次分配的端口号+1开始分配的,所以一般 
不会有什么问题。端口分配算法在tcp_ipv4.c中tcp_v4_get_port中。

以上就是如何分析Socket TIME_WAIT 问题,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 如何分析Socket TIME_WAIT 问题

本文链接: https://lsjlt.com/news/238040.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何分析Socket TIME_WAIT 问题
    本篇文章给大家分享的是有关如何分析Socket TIME_WAIT 问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Socket TIME_WAIT 问题tcp/ip详解的卷...
    99+
    2023-06-04
  • socket连接关闭问题分析
    socket编程过程中往往会遇到这样那样的问题,出现了这些问题,有的是由于并发访问量太大造成的,有些却是由于代码中编程不慎造成的。比如说,最常见的错误就是程序中报打开的文件数过多这个...
    99+
    2024-04-02
  • socket连接关闭问题的示例分析
    这篇文章主要为大家展示了“socket连接关闭问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“socket连接关闭问题的示例分析”这篇文章吧。socket编程过程中往往会遇到这样那样...
    99+
    2023-06-29
  • 如何解决Socket粘包问题
    本篇内容介绍了“如何解决Socket粘包问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题一:TCP存...
    99+
    2024-04-02
  • Python Socket通信黏包问题分
    参考:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5 1.黏包的表现(以客户端远程操作服务端命令为例) 注:只有在TCP协议通信的情况下,才会产生黏包问题 基于TCP协...
    99+
    2023-01-30
    通信 Python Socket
  • 如何分析VS2003程序问题
    本篇文章为大家展示了如何分析VS2003程序问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。希望我对VS 2003程序的一点经验能给大家带来帮助,导致WebDeployment出错的原因也许还有很...
    99+
    2023-06-17
  • Java Socket上Read操作阻塞问题的示例分析
    这篇文章给大家分享的是有关Java Socket上Read操作阻塞问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Socket上的Read操作阻塞问题从Socket上读取对端发过来的数据一般有两种方法...
    99+
    2023-06-25
  • Java如何分析汉诺塔问题
    这篇文章将为大家详细讲解有关Java如何分析汉诺塔问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、汉诺塔问题来源汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。...
    99+
    2023-06-29
  • 如何解决TCP socket的阻塞问题
    目录解决TCP socket的阻塞问题在异常处理程序当中退出socket连接TCP连接阻塞的监控和处理我们整理出符合该类异常的特征如下如何查看一个连接的创建时间解决TCP socke...
    99+
    2024-04-02
  • Java面试Socket编程常用参数设置源码问题分析
    目录引导语1、Socket 整体结构2、初始化3、connect 连接服务端4、Socket 常用设置参数4.1、setTcpNoDelay4.2、setSoLinger4.3、se...
    99+
    2024-04-02
  • 如何分析Linux系统中的socket编程
    这篇文章跟大家分析一下“如何分析Linux系统中的socket编程”。内容详细易懂,对“如何分析Linux系统中的socket编程”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“如...
    99+
    2023-06-28
  • 如何进行Sqlserver死锁问题的分析
    本篇文章为大家展示了如何进行Sqlserver死锁问题的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 问题展现:sqlserve...
    99+
    2024-04-02
  • 如何使用四象限法分析问题
    本篇内容介绍了“如何使用四象限法分析问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对时间管理有了解的同...
    99+
    2024-04-02
  • 如何分析v$locked_object、$lock锁表的问题
    本篇文章给大家分享的是有关如何分析v$locked_object、$lock锁表的问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。--以下几个为相关表SELECT *...
    99+
    2023-06-02
  • Android anr问题分析
    前言 本文主要介绍anr问题一手分析、分类判断,归类后提case给平台处理。 不是针对应用开发的anr分析和优化处理。 anr问题分类 anr问题主要分为 1、input 无焦点anr Reason:...
    99+
    2023-09-01
    android
  • Java Socket通信如何摆平自身端口问题
    Java Socket通信如何摆平自身端口问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java Socket通信在使用的时候有不少的问题,在端口编程上来说...
    99+
    2023-06-17
  • 如何解决C# Socket发送数据大小问题
    今天就跟大家聊聊有关如何解决C# Socket发送数据大小问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以...
    99+
    2023-06-17
  • Mysql的Procedure参数如何为NULL问题分析
    本篇文章给大家分享的是有关Mysql的Procedure参数如何为NULL问题分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 最近写过程...
    99+
    2024-04-02
  • 如何分析C++函数参数引用问题
    这期内容当中小编将会给大家带来有关如何分析C++函数参数引用问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在C++函数参数中,使用了引用作形参,调用时所对应的实参应该是一个数组名,这里的引用是给数组起...
    99+
    2023-06-17
  • 如何利用S_MEMORY_INSPECTOR分析内存泄漏问题
    如何利用S_MEMORY_INSPECTOR分析内存泄漏问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我在批量生成service order时,report运行几个小时后,...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作