docker swarm mode 下容器重启IP引发的 CLOSE_WAIT 问题

news/2023/12/9 17:24:06 标签: 运维, 网络

问题

问题简述

如下图. server docker restart后, client端写入的日志丢失, 并且无报错.
因为不支持时序图, 把时序图代码嵌入在代码里.

​```sequence
client->server: log_data
client->server: log_data
server->server: docker restart
server->client: fin
client->server: log_data loss without error
​```

tcp state diagram

clipboard.png

问题定位过程

为什么卡在CLOSE_WAIT.

看tcp状态转换图, 可以看到client收到了fin, 一直没有recv, 一直卡在CLOSE_WAIT. 和实际的代码是吻合的.
那么, 为什么在server docker restart 引发CLOSE_WAIT后, client发消息仍然不报错呢?
因为:

  1. tcp协议允许client在收到fin后, 继续发送消息.
  2. server 在docker restart后 ip 改变, client还是往原来的ip发送消息, 没有主机通知client rst, 导致消息在系统buffer里积压.

积压信息如下:

root@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0
tcp        1  402 10.0.0.186:62281        10.0.0.16:27017         CLOSE_WAIT  4308/server
root@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0
tcp        1  70125 10.0.0.186:62281        10.0.0.16:27017         CLOSE_WAIT  4308/server

此时, 在elixir socket接口层面来看, 不管socket的状态, 还是发送, 都是ok的.

iex(client@client.)25> socket |> :inet.port
{:ok, 57395}
iex(client@client.)26> socket |> :gen_tcp.send("aaa")
:ok

如果主动close, 则会进入LAST_ACK状态

iex(client@client.)27> socket |> :gen_tcp.close()    
:ok
root@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0
tcp        1  70126 10.0.0.186:62281        10.0.0.16:27017         LAST_ACK    -   

CLOSE_WAIT的恢复

如果代码还是只发不收. 是检测不到CLOSE_WAIT的. 显然, 应用层心跳是一个解决方案. 那么, 不使用心跳, 只发不收的情况下, 什么时候才能检测到错误呢?

  1. send buffer 满
  2. todo 深究tcp keepalive, 不使用 keepalive情况下的 tcp 最大链接空闲时间.

http://www.niftyadmin.cn/n/959471.html

相关文章

js获取当前时间并实时刷新

效果如图&#xff1a; 代码如下&#xff1a; <html><head><title>js获取当前时间并实时刷新</title><script>//页面加载调用window.οnlοadfunction(){//每1秒刷新时间setInterval("NowTime()",1000);}function NowTime(){var myDat…

操作系统的安全管理

总结学习操作系统当中的一些知识点&#xff0c;这篇博客只要是基于Linux的系统安全管理的一些基本概念以及设计思路。 主要知识来源于费祥林老师的操作系统基础一书&#xff0c;以及网络上的部分知识。初学者&#xff0c;存在不足望指正。 关于OS的一些基本概念&#xff1a; …

pt-kill使用样例

如果你的生产环境够多&#xff0c;业务够复杂&#xff0c;你就懂了pt-kill&#xff1a;pt-kill --hostip --portport --userusername --passwordpassword --match-info "select|SELECT" --busy-time 1800 --victims all --interval 60 --daemonize --kill --print …

两个线程交替打印奇偶数【Lock版】

import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class Solution {private int start 1;/*** 对flag的写入虽然加锁保证了线程安全&#xff0c;但由于读取时不是volatile所以可能会读到旧值*/private volatile boolean flag…

数据结构入门篇:约夫瑟斯数据环问题

关于数据结构&#xff0c;在大学本科并未接触&#xff0c;目前才开始接触学习。 关于这个问题&#xff0c;还记得刚刚毕业那会&#xff0c;找工作面试的时候&#xff0c;有一家公司的笔试大题就是约夫瑟斯数据环&#xff0c;然而当时并未接触这个&#xff0c;所以&#xff0c;…

这7款APP到底有什么好,值得知乎2万人点赞,原来如此!

现在每个品牌手机的应用市场里都有各种各样的不同的APP,有时候为了新鲜感或是一时兴起&#xff0c;下载了很多日常不常用甚至不用的APP,不仅占手机内存&#xff0c;还耗费流量&#xff01; 但是&#xff0c;这并不能认为所有的APP都不实用&#xff0c;比如这几款APP到底有什么好…

前端笔试之手写代码

1. 扁平化嵌套数组/flat实现 描述&#xff1a;将嵌套多层的数组展开平铺成只有一层的数组。 let array [1, [1, 2, 3], [1, [2, {}]] ] handle(array) // [1, 1, 2, 3, 1, 2, {}] 方法一&#xff1a; const handle array > JSON.parse([${JSON.stringify(array).replace(/…

操作系统养成计划之篇一:同步互斥经典问题

记录学习过程的点点滴滴&#xff0c;存在不足之处望指正。 在操作系统当中&#xff0c;存在着各种线程&#xff0c;进程&#xff0c;而这些东西会公用一些资源&#xff0c;为了避免混乱&#xff0c;则引进了信号量以实现同步和互斥。 同步&#xff1a;即多个进程协同完成某一…

约数倍数选卡片

问题描述 闲暇时&#xff0c;福尔摩斯和华生玩一个游戏&#xff1a;在N张卡片上写有N个整数。两人轮流拿走一张卡片。要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数。例如&#xff0c;某次福尔摩斯拿走的卡片上写着数字“6”&#xff0c;则接下来华生可以拿的数字包…

操作系统养成计划之篇二:死锁

博文开头说点别的&#xff0c;风雨哈佛路小说原文中有这么一段话&#xff1a;上帝赋予我平静&#xff0c;让我接受无法改变的事情&#xff0c;赋予我勇气&#xff0c;让我改变我能改变的事情&#xff0c;赋予我智慧&#xff0c;让我发现事物的不同...莉丝默里的精神&#xff01…

操作系统养成计划之篇二:死锁实战篇——银行家算法

bankers algorothm 银行家算法是针对避免死锁问题的经典算法 其算法以银行借贷为基础&#xff0c;判断并且保证系统的安全运行 介绍银行家算法需要先介绍三个概念&#xff1a; 1&#xff1a;安全序列&#xff1a;指一个进程序列{1、2、3、... n}&#xff0c;对于每一个进程…

计算机网络肢解计划之篇一:网络体系结构

写在博客开头&#xff1a;我的系列博客第二轮&#xff0c;每天加油学习&#xff0c;每隔一段时间总结学习内容&#xff0c;加以巩固&#xff0c;以及分享&#xff01;收获每一点滴&#xff0c;愿所有的一切更加美好。每一天都有意义&#xff01;powerful&#xff01; 系列博客…

细菌繁殖

Description 某种细胞&#xff08;用*表示&#xff09;繁殖遵循一定的规律。第一天的数量为1&#xff0c;以后按照如下方式繁殖&#xff1a;第一天:*第二天:*****第三天:*************。。。。。。。。。你需要计算第x天的细胞数量。Input 第一行一个N(<1000),下面将有N行测…

C++学习篇之引用

引用的概念&#xff1a;引用是一个别名&#xff0c;在创建引用的过程中&#xff0c;需要使用另一个对象去初始化&#xff0c;之后&#xff0c;该引用就像是这个对象的另一个名称&#xff0c;对引用执行的任何操作都是针对该对象。 引用的创建&#xff1a; Int &rReferenc…

计算机网络肢解计划之篇二:物理层

这篇博客主要介绍计算机网络的物理层&#xff0c;介绍方向分为三个部分&#xff0c;分别是通信基础&#xff0c;传输介质和物理层设备。 一&#xff1a;通信基础&#xff0c;先介绍 一些基本概念&#xff1a; 1&#xff1a;数据&#xff1a;指传送信息的实体 2&#xff1a;信号…

vs2008 MFC工程建立

愿鸡汤成为你前进的动力&#xff0c;愿梦想使你持之以恒&#xff0c;而非一时热血 本文总结了VS如何区建立MFC工程的步骤。 MFC&#xff0c;全称Microsoft Foudation Classes&#xff0c;是一种application framework&#xff0c;以VC封装了windows API 的开发工具。 具体详细使…
最新文章