为什么80%的码农都做不了架构师?>>>   

一.情况表现为

1.在公司内网对站点的http访问:

linux主机出现故障:curl以及抓包分析,发现服务端不响应linux客户端的请求,无法建立TCP连接,浏览器返回“无法连接到服务器”

windows主机正常

2.http访问质量下降:

基调显示,新架构上线后,访问质量下滑,主要表现为

2.1.访问提示“无法连接到服务器”

2.2.仅少数人遇到这种故障,并且一天中不是每次访问都会遇到,而是出现时好时坏的现象

二.处理过程

直接上google搜索关键字“服务器无法建立TCP连接”。

翻了几页后,发现这篇博文:“http://www.sunchis.com/html/os/linux/2012/0518/413.html”。

看了一下,和我们公司内网的表现一模一样,但各种问题(1为这方面基础知识薄弱,2为没有时间验证此配置)

然后这种问题持续了n久…一直以为是内部设备问题

后期搞不定了,大胆在线上启用这个参数“net.ipv4.tcp_timestamps = 0”,做了下测试后,发现故障解除,原故障机每次访问都正常了!

不过还是不明其中原理,只是大意了解,同样处于NAT上网方式的用户里(与别人共用出口IP地址),如果你的时间戳小于别人的,那么服务器不会响应你的TCP请求,要忽略此项,将net.ipv4.tcp_timestamps = 0(/etc/sysctl.conf)

三.总结

后期学习时,看见了一个更加详细的博客,讲的很详细,也引入了新的问题:http://huoding.com/2012/01/19/142

====== 小抄 ======

其实,linux服务器原本对时间戳(timestamps)默认是不开启的,Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了。

net.ipv4.tcp_tw_recycle又是啥呢,搜索了一下基本上是TIME_WAIT连接的回收参数

当 net.ipv4.tcp_timestamps 没有设置(缺省为开启),并且 net.ipv4.tcp_tw_recycle 也开启时,这个坑爹的错误就出现了,但是注意,只表现在NAT网络环境中。而且,大多数博客,以及一些大牛们,都有说过要开启 net.ipv4.tcp_tw_recycle …

====== 小抄 ======

四.未完成的事项

上文 http://huoding.com/2012/01/19/142 中提到的:

1.(未验证)关闭timestamps后,tw_recycle功能是失效的问题

2.(未验证)新的解决TIME_WAIT连接过多的方法:net.ipv4.tcp_max_tw_buckets = 10000 设置一个最大值,不过坏处是系统日志会提示:TCP: time wait bucket table overflow

===============================================================

针对有些用户能ping通我们的网站,但是连接时超时服务器没有任何响应,怀疑问题处在了了http的三次握手环节,这是决定通过抓包进行分析:

1、有问题机器的截图:

2、正常机器的截图:

3、发现问题

从抓包数据发现,web服务器对出问题机器和正常机器系统的tcp syn包都返回ACK包,但存在问题发出的tcp syn包有时候响应,有时候不响应。不响应时,终端与web服务器之间的tcp连接无法正常建立,导致页面不能打开。对比这两种数据包,就在时间戳上有差异,存在问题的机器发出的tcp syn包带有时间戳,因此怀疑时间戳问题导致的故障。

4、解决问题

既然怀疑是时间戳导致的,那我们就着手分析如果将出现问题的机器的时间戳去掉会不会解决问题。针对带有时间戳的tcp syn包不响应的问题,查阅了相关资料得知产生问题的原因是出问题系统中的注册表中有Tcp1323opts这个选项,会导致其在发包时加入时间戳,经过nat之后,如果前面相同的端口被使用过,且时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。

目前看有两种方法解决:

(1)    是在服务器上修改变量

首先我们先查看一下我们服务器net.ipv4.tcp_timestamps的默认值,如果该值为0测说名不是该问题导致,如果是1我们需要将该值设置为1。

查看默认值的方法:[root@localhost ~]# cat /proc/sys/net/ipv4/tcp_timestamps

修改该值的方法:vim /etc/sysctl.conf  添加 net.ipv4.tcp_timestamps=0

(2)修改客户端的注册表Tcp1323Opts设置为0。

备注:

Tcp1323Opts

说明:该参数控制 RFC 1323 时间戳与窗口缩放选项。默认情况下,启用时间戳与

窗口缩放,但是可以使用标志位进行控制。0 位控制窗口缩放,1 位控制时间戳。

值为0(禁用 RFC 1323 选项)

值为1(仅启用窗口缩放)

值为2(仅启用时间戳)

值为3(两个选项均启用)

net.ipv4.tcp_timestamps=0

说明:时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

值为0(禁用时间戳)

值为1(启用时间戳)

只有客户端和服务端都开启时间戳的情况下,才会出现能ping通不能建立tcp三次握手的情况,所以做为提供服务的公司,不可能保证所有的用户都关闭时间戳,这个功能,所以我们必须关闭时间戳,这样才能给所用用户提供正常的服务。

转载于:https://my.oschina.net/tsh/blog/1335116

记一次TCP连接异常故障解决相关推荐

  1. java如何处理tcp异常断开_(转)TCP连接异常断开检测

    TCP是一种面向连接的协议,连接的建立和断开需要通过收发相应的分节来实现.某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法检测到,以致始终保持着不存在的连接.下面介绍一种方法来检测这种异常断 ...

  2. 【博客278】TCP连接异常关闭的几种情况

    内容: 记录TCP连接异常关闭的几种情况 一.服务器进程异常终止: 服务进程提前终止了,系统进行进程善后处理:将所有打开的文件描述符关闭,这导致发送FIN给 客户端,客户端TCP响应ACK.客户端此时 ...

  3. 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。

    关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题.涉及tcp连接异常. 参考文章: (1)关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题. ...

  4. 主服务器连接异常帮助修复,LOL服务器连接异常怎么解决

    LOL英雄联盟提示"服务器连接异常,即将退出,请重新连接游戏",对此该如何解决呢?下面是学习啦小编收集整理的LOL服务器连接异常怎么解决,希望对大家有帮助~~ LOL服务器连接异常 ...

  5. 【转】Android开发中adb启动失败adb连接异常的解决办法 offline

    原文网址:http://www.cnblogs.com/yejiurui/p/4173521.html 一.情况描述: 我们在使用eclipse开发有时候会出现adb连接异常中,有时候控制台会打印出来 ...

  6. Android开发中adb启动失败adb连接异常的解决办法

    一.情况描述: 我们在使用eclipse开发有时候会出现adb连接异常中,有时候控制台会打印出来 adb connect异常 比如会出现下面这样 : [2014-12-18 16:18:26 - ] ...

  7. 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。...

    环境:景安快云服务器(听说很垃圾,但是公司买的,我也刚来),CentOS-6.8-x86_64,Apache,MySQL5.1,PHP5.3. 问题:现公司有一个php系统,需要重复向后台发送ajax ...

  8. 服务器连接异常系统无法登录,win10系统无法登录LOL提示“服务器连接异常”的解决方法...

    很多小伙伴都遇到过win10系统无法登录LOL提示"服务器连接异常"的困惑吧,一些朋友看过网上零散的win10系统无法登录LOL提示"服务器连接异常"的处理方法 ...

  9. java如何处理tcp异常断开_针对TCP连接异常断开的分析

    我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...

最新文章

  1. kotlin + springboot启用elasticsearch搜索
  2. vue可视化拖拽生成工具_vue实现可视化可拖放的自定义表单的示例代码
  3. 【Android Gradle 插件】ProductFlavor 配置 ( applicationId 配置 | SdkVersion 相关配置 | version 应用版本配置 )
  4. tableau实战系列(二十八)-以可视化的方式打开关联分析算法购物篮分析(Market Basket Analysis)
  5. redis 小功能大用处
  6. P1010 幂次方 P1022 计算器的改良
  7. Jmeter压力测试快速使用
  8. 页面定时跳转的js和php的代码实现和页面定时刷新
  9. JAVA系统性能优化
  10. matlab显示图像只有一半,我去噪后图像为什么只显示一半
  11. Intellij中Maven项目html页面乱码解决方案
  12. 如何获取 Instagram 视频以及图片
  13. oracle net Manager 配置连接 tiptop 鼎捷ERP 数据库
  14. html左右箭头实现图片滚动,jquery控制左右箭头滚动图片列表的实例
  15. 鼠标失灵,但鼠标和USB接口都是好的的情况。
  16. Visual Studio使用技巧 +谷歌浏览器使用技巧总结
  17. 从0到1构建计算机(3/12)--组合逻辑芯片:逻辑门、加法器、ALU
  18. 关关于android 微信sdk 分享 图片 到 朋友圈 的问题
  19. js(JavaScript)操作字符串的方法
  20. pascal过程与函数

热门文章

  1. 工作经验教训_在设计工作五年后获得的经验教训
  2. 猎鹰spacex_SpaceX:简单,美观的界面是未来
  3. 初学者也能看懂的 Vue2 源码中那些实用的基础工具函数
  4. jQuery事件绑定(一)
  5. java1.8--改进的接口
  6. Linux命令-网络命令:wall
  7. Objective-C征途:Hello Objective-C
  8. 报表系统FineReport通过权限控制数据访问方案
  9. 台电u盘量产工具_简单几步,让U盘起死回生
  10. 汤姆大叔的6道javascript编程题题解