时间戳引发的网站访问不了的问题

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

一、发现问题 vim

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

二、解决问题 tcp

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

解决方法以下: spa

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

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

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

值为0(禁用时间戳) web服务器

值为1(启用时间戳)

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

使用该命令使其立马生效:/sbin/sysctl-p

相关文章
相关标签/搜索