• 展开微博窗口
  • QQ:52619941
  • 微信:cnmemory
  • 展开分类目录
  • 还没有账号?

Memory

NAT网络下tcp_timestamp与tcp_tw_recycle引发丢包问题

场景

服务器A与服务器B在同一个NAT网络环境下,出口IP相同
服务器A -> 访问服务器C接口
服务器B -> 访问服务器C接口
此时AB其中一台服务器无法得到响应。

解决方式

通过查阅资料,是因为被调用服务端配置了tcp_tw_recycle,而调用方配置了tcp_timestamp造成了丢包的问题。

需要客户端关闭tcp_timestamp或者服务端关闭tcp_tw_recycle

## /etc/sysctrl.conf
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0

现象原理

摘自网络上的一段代码及解释

  if (tmp_opt.saw_tstamp &&
            tcp_death_row.sysctl_tw_recycle &&
            (dst = inet_csk_route_req(sk, req)) != NULL &&
            (peer = rt_get_peer((struct rtable *)dst)) != NULL &&
            peer->v4daddr == saddr) {
            if (get_seconds() < peer->tcp_ts_stamp + TCP_PAWS_MSL &&
                (s32)(peer->tcp_ts - req->ts_recent) >
                            TCP_PAWS_WINDOW) {
                NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);
                goto drop_and_release;
            }
        }

sysctl_tw_recycle:本机系统开启tcp_tw_recycle选项   
TCP_PAWS_MSL:60s,该条件判断表示该源ip的上次tcp通讯发生在60s
TCP_PAWS_WINDOW:1,该条件判断表示该源ip的上次tcp通讯的timestamp 大于 本次tcp。

在tcp_tw_recycle/tcp_timestamps都开启的条件下,60s内同一源ip主机的tcp 链接请求中的timestamp必须是递增的。 结合问题分析:主机client1和client2通过NAT网关访问服务时,而client1和client2的timestamp(tcp报文的时间戳与系统时钟有关)不相同;

根据上述syn包处理源码,在tcp_tw_recycle和tcp_timestamps同时开启的条件下,timestamp大的客户端访问服务成功,而timestmap小的主机访问失败。

码字很辛苦,转载请注明来自雨林寒舍《NAT网络下tcp_timestamp与tcp_tw_recycle引发丢包问题》

评论