登录
    Technology changes quickly but people's minds change slowly.

关于服务器间接无响应的问题处理(NAT网络下tcp_tw_recycle参数引起的故障)

技术宅 破玉 1232次浏览 0个评论

最近客户老是说,系统用着用着老是报网络请求错误,正式环境老是出现,用户量和并发量也没有很高,测试环境也一直没问题,以为是upstream请求HTTP头内容太大,大小超过了Nginx所设置的反向代理(proxy)的buffer值导致的,于是改了很多nginx 的配置参数,但是没有什么作用。
后来想起来,正式环境改过 linux 系统参数如下:
为了减少TIME_WAIT的数量,将net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle参数都设置成了1,这两个参数的含义如下:
tcp_tw_recycle:该参数用于回收TIME_WAIT连接,但是存在一个陷阱:当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,也就是说对服务端而言这些客户端实际上等同于一个,可惜由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。正式因如此,Linux从4.12内核之后移除了这个参数。
tcp_tw_reuse:顾名思义就是复用TIME_WAIT连接。当创建新连接的时候,如果可能的话会考虑复用相应的TIME_WAIT连接。通常认为tcp_tw_reuse比tcp_tw_recycle安全一些,这是因为一来TIME_WAIT创建时间必须超过一秒才可能会被复用;二来只有连接的时间戳是递增的时候才会被复用。
客户方都是使用NAT方式联网访问系统的,如果将这两个参数都打开的话会出现误判的情况,导致TIME_WAIT状态的socket被回收,而连接的端口信息被清除,但IP和时间戳仍被保存,倒是后来上来的分节如果时间戳小于此ip上之前的时间戳,则此分节会被丢弃,TCP 连接失败
因此需要打开/etc/sysctl.conf文件,将以下三个参数都设置为0:

net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0

保存退出,然后执行sysctl -p命令生效,没有再出现网络错误的问题


华裳绕指柔, 版权所有丨如未注明 , 均为原创|转载请注明关于服务器间接无响应的问题处理(NAT网络下tcp_tw_recycle参数引起的故障)
喜欢 (2)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址