最近一个非常奇怪的问题,多台手机客户端利用公司wifi连接一台服务器,但是频繁出现连接不上情况,而且一台能连接上,另一台就会断开。断开的时候再尝试连接,但是没有apache跟tomcat的任何访问记录,但是3G连接不会出现这个问题。

最近发现一个PHP脚本时常出现连不上服务器的现象,调试了一下,发现是TIME_WAIT状态过多造成的,本文简要介绍一下解决问题的过程。

遇到这类问题,我习惯于先用strace命令跟踪了一下看看:

shell> strace php /path/to/file
EADDRNOTAVAIL (Cannot assign requested address)
从字面结果看似乎是网络资源相关问题。这里顺便介绍一点小技巧:在调试的时候一般是从后往前看strace命令的结果,这样更容易找到有价值的信息。

查看一下当前的网络连接情况,结果发现TIME_WAIT数非常大:

shell> netstat -nt | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT 28233
重复了几次测试,结果每次出问题的时候,TIME_WAIT都等于28233,这真是一个魔法数字!实际原因很简单,它取决于一个内核参数net.ipv4.ip_local_port_range:

shell> sysctl -a | grep port
net.ipv4.ip_local_port_range = 32768 61000
因为端口范围是一个闭区间,所以实际可用的端口数量是:

shell> echo $((61000-32768+1))
28233
问题分析到这里基本就清晰了,解决方向也明确了,内容所限,这里就不说如何优化程序代码了,只是从系统方面来阐述如何解决问题,无非就是以下两个方面:

首先是增加本地可用端口数量。这点可以用以下命令来实现:

shell> echo "net.ipv4.ip_local_port_range = 10240 61000" >> /etc/sysctl.conf
shell> sysctl -p
其次是减少TIME_WAIT连接状态。网络上已经有不少相关的介绍,大多是建议:

shell> sysctl net.ipv4.tcp_tw_reuse=1
shell> sysctl net.ipv4.tcp_tw_recycle=1
注:通过sysctl命令修改内核参数,重启后会还原,要想持久化可以参考前面的方法。

这两个选项在降低TIME_WAIT数量方面可以说是立竿见影,不过如果你觉得问题已经完美搞定那就错了,实际上这样可能会引入一个更复杂的网络故障。

关于内核参数的详细介绍,可以参考官方文档。我们这里简要说明一下tcp_tw_recycle参数。它用来快速回收TIME_WAIT连接,不过如果在NAT环境下会引发问题。

RFC1323中有如下一段描述:

An additional mechanism could be added to the TCP, a per-host cache of the last timestamp received from any connection. This value could then be used in the PAWS mechanism to reject old duplicate segments from earlier incarnations of the connection, if the timestamp clock can be guaranteed to have ticked at least once since the old connection was open. This would require that the TIME-WAIT delay plus the RTT together must be at least one tick of the sender’s timestamp clock. Such an extension is not part of the proposal of this RFC.

大概意思是说TCP有一种行为,可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。

Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了。

现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,以NAT方式构建,当请求到达LVS后,它修改地址数据后便转发给 后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上端口会复用,所以从后端服务器的角度看,原本不同客户端的请 求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的 表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象:

shell> netstat -s | grep timestamp
... packets rejects in established connections because of timestamp
如果服务器身处NAT环境,安全起见,通常要禁止tcp_tw_recycle,至于TIME_WAIT连接过多的问题,可以通过激活tcp_tw_reuse来缓解。

进一步思考,既然必须同时激活tcp_timestamps和tcp_tw_recycle才会触发这种现象,那只要禁止 tcp_timestamps,同时激活tcp_tw_recycle,就可以既避免NAT丢包问题,又降低TIME_WAIT连接数量。如果服务器并不 依赖于RFC1323,那么这种方法应该也是可行的,不过最好多做测试,以防有其他的副作用。

shell> sysctl net.ipv4.tcp_timestamps=0
shell> sysctl net.ipv4.tcp_tw_recycle=1

总体来说,这次网络故障本身并没什么高深之处,本不想罗罗嗦嗦写这么多,不过拔出萝卜带出泥,在过程中牵扯的方方面面还是值得大家品味的,于是便有了这篇文字。

转自

http://huoding.com/2012/01/19/142

类似的:

tcp 内核参数对NAT 用户的影响

tcp_tw_recycle和tcp_timestamps导致connect失败问题

底层通讯协议问题排查案例

update 20120913

我遇到的问题,看过上边的四篇文章后我们就知道问题的原因了。

故障描述:

client (windows/linux) < -- > linux nat 服务器 < -- > web server(linux)

这里500 多台client 同过linux nat 服务器上网,一直运行正常,直到最近上有同事反应,linux client 用户无法访问某网站频道,而windows client用户则没有问题,真像上面说的一样人民问题吗?

故障解决:

echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle
sysctl -p
//tcp_tw_recycle默认是关闭的,有不少服务器,为了提高性能,开启了该选项

故障分析:

linux client 用户无法访问某网站频道,而其他网站这正常!问题在web server 上!

抓包
windows(xp)

tcpdump -vvn dst 211.x.x.x 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
10:49:05.600205 IP (tos 0x0, ttl 64, id 4280, offset 0, flags [DF], proto TCP (6), length 52)
    192.168.4.157.1244 > 211.x.x.x.80: Flags [S], cksum 0x9f8d (correct), seq 4210943732, win 64240, options [mss 1460,nop,wscale 0,nop,nop,sackOK], length 0
10:49:05.607071 IP (tos 0x0, ttl 64, id 4281, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.4.157.1244 > 211.x.x.x.80: Flags [.], cksum 0x2c80 (correct), seq 4210943733, ack 2368349854, win 64240, length 0
10:49:55.618477 IP (tos 0x0, ttl 64, id 4337, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.4.157.1244 > 211.x.x.x.80: Flags [.], cksum 0x2c7f (correct), seq 0, ack 214, win 64028, length 0
10:49:55.637271 IP (tos 0x0, ttl 64, id 4338, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.4.157.1244 > 211.x.x.x.80: Flags [F.], cksum 0x2c7e (correct), seq 0, ack 214, win 64028, length 0

linux(ub12.04)

tcpdump -i eth1 -vvn host 192.168.4.35 and  211.x.x.x 
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:57:08.197353 IP (tos 0x10, ttl  62, id 8687, offset 0, flags [DF], proto: TCP (6), length: 60)192.168.4.35.57699 > 211.x.x.x.http: S, cksum 0x78d4 (correct), 50589925:50589925(0) win 14600 <mss 1460,sackOK,timestamp 41668874 0,nop,wscale 7>
11:57:09.193852 IP (tos 0x10, ttl  62, id 8688, offset 0, flags [DF], proto: TCP (6), length: 60)192.168.4.35.57699 > 211.x.x.x.http: S, cksum 0x77da (correct), 50589925:50589925(0) win 14600 <mss 1460,sackOK,timestamp 41669124 0,nop,wscale 7>
11:57:11.197844 IP (tos 0x10, ttl  62, id 8689, offset 0, flags [DF], proto: TCP (6), length: 60)192.168.4.35.57699 > 211.x.x.x.http: S, cksum 0x75e5 (correct), 50589925:50589925(0) win 14600 <mss 1460,sackOK,timestamp 41669625 0,nop,wscale 7>
.....略

结论:windows 发出的tcp 包中没有timestamp,固能够完成tcp 的三次握手,而linux 发出的tcp 包中包含timestamp,webserver 拒绝发送syn/ack包,你能看到包的标志全部是S,所以不能完成tcp 的三次握手,也就不能访问web server 了。

这里简单解释下tcpdump 数据包意义

TCP包的输出信息
用TCPDUMP捕获的TCP包的一般输出信息是:
src > dst: flags data-seqno ack window urgent options
src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); 
data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, 
urgent表明数据包中是否有紧急指针. Options是选项.

每一行中间都有这个包所携带的标志:
S=SYN,发起连接标志
P=PUSH,传送数据标志
F=FIN,关闭连接标志
ack    表示确认包
RST= RESET,异常关闭连接
. 表示没有任何标志
--------------------- 
作者:江湖邗孜 
来源:CSDN 
原文:https://blog.csdn.net/fanyun7654/article/details/20725783?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

tcp_timestamps tcp_tw_recycle引起的服务器连接不上问题相关推荐

  1. 无尽对决一直显示正在连接服务器,无尽对决服务器连接不上 | 手游网游页游攻略大全...

    发布时间:2018-03-30 相信点进这篇攻略里面的玩家都是进入不了游戏的玩家,当然,服务器是由问题,育碧官方也正在努力解决这一问题,下面为大家带来服务器问题的最新进展,有请全境封锁贴吧吧主&quo ...

  2. 服务器连接不上可能是哪些原因

    VPs连接不上是哪些原因导致的 当我们日常在使用香港vps时,偶尔可能会出现vps连接不上,或者是输入密码后再次连接,又被返回到输入IP界面,当出现这类情况时我们该如何去判断是什么问题导致的呢?以及该 ...

  3. 虚荣登陆显示无法连接服务器,虚荣服务器连接不上怎么办?连接服务器解决办法...

    虚荣服务器连接不上怎么办?无法连接服务器解决办法,虚荣游戏是一款非常受小伙伴们欢迎的游戏,但是很多小伙伴在游戏的时候会出现无法连接服务器的情况,那么当出现这样的情况是应该怎么办呢?下面就让小编给大家带 ...

  4. sql显示服务器连接不上,sql服务器连接不上

    sql服务器连接不上 内容精选 换一换 本章节适用于MRS 3.x之前版本.Loader支持以下多种连接,每种连接的配置介绍可根据本章节内容了解.obs-connectorgeneric-jdbc-c ...

  5. 云管家打补丁是弹出UMP服务器连接不上

    云管家打补丁是弹出UMP服务器连接不上 上次打补丁也是出现这个,然后用友实施的朋友帮我连好了,但最近我自己又遇到了这个问题,哈哈哈,又忘记怎么连了,果然好记性还不如烂笔头,这次就准备把它记录下来. 一 ...

  6. 服务器连接不上的排查思路

    背景: 正常使用中,服务器连接不上,导致数据库,Nginx,Redis等都连接失败!当然,本地或者局域网内是好的,它们自然不受限制. 排查思路: 1.检查网络 该命令主要是检测你的机器遇到几个路由中转 ...

  7. 第五人格为什么服务器正在维修中,第五人格服务器连接不上怎么办 服务器更新后无法进入原因...

    第五人格服务器连接不上怎么办 服务器更新后无法进入原因以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 第五人格服务器连接 ...

  8. 荒野行动服务器信息连不上,荒野行动服务器连接不上怎么办_荒野行动服务器连接不上解决方法说明_3DM手游...

    最近有越来越多的小伙伴加入荒野行动这款手游大作中,随意也出现各种游戏问题.其中服务器连接不上正是常见的问题之一,很多小伙伴对此向官方反应过.那么在游戏服务器连接不上有什么解决办法吗?连接不上的原因又是 ...

  9. wsus下游服务器状态,WSUS下游服务器连接不上上游服务器

    WSUS下游服务器连接不上上游服务器0 only872013.08.12浏览137次分享举报 安装了一台WSUS服务器A从微软下载更新是成功的.再安一台WSUS服务器B从A哪里获得更新并作为A的副本, ...

最新文章

  1. Python游戏开发,pygame模块,Python实现过迷宫小游戏
  2. Java并发——CAS
  3. 如何解决“HttpException (0x80004005): 超过了最大请求长度”问题
  4. MySQL元数据库——information_schema
  5. 使用tinylog 1.1改进您在Java EE应用程序中的登录
  6. 6. 同步化器(Synchronizers)
  7. 无法卸载 Mac 上的磁盘时该怎么办?
  8. 并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁
  9. 去了一趟字节跳动,被怼了!
  10. 沟通CTBS,加快山东海化金蝶EAS远程接入
  11. 湖南科技大学计算机实力强吗,湖南省这2所重点大学,吉首大学和湖南科技大学,谁的实力更强...
  12. 超级鹰+selenium规避检测模拟登录12306
  13. 2B市场 面向2025年技术趋势与5大机会
  14. 校园表白墙、微信表白墙、大学生树洞,交流圈子,用Fotoo创建
  15. java中输入密码为星号_怎么用c语言把输入的密码变成星号
  16. MySQL从入门到入魔,总结我的学习历程,给有需要的人看!
  17. python atan_Python代码中atan()函数有什么功能呢?
  18. 简约好用的日期时间选择js插件
  19. 20190713 关于session串号问题的记录
  20. 基于WxPusher给自己的个人微信发送提醒消息(二)

热门文章

  1. Linux SDIO WIFI Marvell8801/Marvell88w8801(五) --- Linux SDIO API介绍
  2. 关于快手小铃铛广告投放的方式
  3. 发现一个安卓万能脱壳方法
  4. 适用于***测试不同阶段的工具收集整理
  5. 计算机专业自我总结100字,计算机专业学生自我评价100字
  6. 盘点那些年 半死不活的国产操作系统们
  7. Lycn 2013 with SQL AlwaysOn 「三」后续问题
  8. SSH远程访问开发板
  9. 如何用ChatGPT高效完成工作
  10. 小米软件研发工程师面试