机器人使用WiFi通信,实现指令下传,状态上传。而WiFi信道平时带宽较稳定,但会在某些时候突然中断,造成ping的延时较高,但可以马上恢复。如果一直ping,则一般情况下ping值很小,但长时间(数十分钟)测试,有个别ping出现1s左右延时。并迅速恢复。这种现象对于日常上网、下载文件来说,是不可见的。对于视频播放来说,这种现象会造成卡顿。所以日常看视频时,在某次缓冲不足时卡顿,应该是WiFi信道上的短时中断造成的。

特别是机器人使用websocket传输,在无线信道短暂中断时,tcp连接并不中断,而是进行了超时重传。tcp的超时等待时间指数增加,多次重传后等待时间是数十秒的数量级。所以造成了WiFi信道中断虽然迅速恢复,但由于偶然的漏掉了tcp的前几次重传,导致已存在的tcp连接假死。需等待数十秒才能恢复。而在这漫长的等待过程中,WiFi通信一切良好,只是机器人的控制和状态显示卡死了。

实验了多款路由,均无法避免此问题。所以进行udp对比实验,使用udp和tcp客户端连接echo服务器,测试传输延时。然后断开WiFi适配器,重连,模拟信道故障。

用Python脚本建立了udp和tcp两个客户端,同时以10Hz的频率向echo服务器发送4KByte的数据包,并记录延时时间。将延时时间记录到日志文件中。

实验结果:
udp比tcp恢复速度快很多,tcp受中断后,一般在4秒、9秒时恢复连接,而udp会提前2秒到4秒恢复。若中断时间再长,则tcp超时断开连接,再恢复速度较快。

图中日志文件记录了udp和tcp的延时,空缺部分为TCP的延时导致,可见,udp由于不等待返回,所以只要网络恢复,就立刻恢复传输。但tcp会延时一定时间。

上图中的链路断开时间较长,tcp超时断开连接,再恢复速度较快。

但如果反复断开连接重连,则有可能使tcp未彻底断开连接,而进入指数退让。测试中最长出现了18秒的延时。而udp在这段时间中断续工作了8秒。

实验结论:
若在真实的低信号质量环境中,tcp不会顺利断开连接,可能会发生更长时间的假死。所以,应调低tcp重传时间或次数,或改用udp传输。

进而在机器人上做了修改tcp重传次数的实验:

cd /proc/sys/net/ipv4/
# cat tcp_retries2
15
echo 5 > tcp_retries2
操作机器人走到走廊,信号中断,然后退回,WiFi信号恢复,数据很快恢复,与重传15次对比,恢复速度明显加快
 

机器人控制tcp通信参数调优的更多相关文章

  1. Linux内核 TCP/IP参数调优

    http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml

  2. Linux上TCP的几个内核参数调优

    Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优.光TCP的调优参数就有50多个.在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数.在此分享出来,希望对大家 ...

  3. Linux内核 TCP/IP、Socket参数调优

    Linux内核 TCP/IP.Socket参数调优 2014-06-06  Harrison....   阅 9611  转 165 转藏到我的图书馆   微信分享:   Doc1: /proc/sy ...

  4. Linux Linux内核参数调优

    Linux内核参数调优 by:授客 QQ:1033553122 关于调优的建议: 1.出错时,可以查看操作系统日志,可能会找到一些有用的信息 2.尽量不要“批量”修改内核参数,笔者就曾这么干过,结果“ ...

  5. php-fpm参数调优

    关于php-fpm.conf参数调优,只对重要的参数进程调优.其它可参数前辈的. http://php.net/manual/zh/install.fpm.configuration.php (官方的 ...

  6. LightGBM介绍及参数调优

    1.LightGBM简介 LightGBM是一个梯度Boosting框架,使用基于决策树的学习算法.它可以说是分布式的,高效的,有以下优势: 1)更快的训练效率 2)低内存使用 3)更高的准确率 4) ...

  7. mysql日常运维与参数调优

    日常运维 DBA运维工作 日常 导数据,数据修改,表结构变更 加权限,问题处理 其它 数据库选型部署,设计,监控,备份,优化等 日常运维工作: 导数据及注意事项 数据修改及注意事项 表结构变更及注意事 ...

  8. 看MySQL的参数调优及数据库锁实践有这一篇足够了

    史上最强MySQL参数调优及数据库锁实践 1. 应用优化 1.2 减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2 增加cache层 1.3 负载均衡 1.3.1 利用MySQL ...

  9. Spark Shuffle原理、Shuffle操作问题解决和参数调优

    摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...

随机推荐

  1. iOS 从零到一搭建组件化项目框架

    随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手术的动刀口 ...

  2. 确认框,confirm工具封装

    用bootstrap封装了个确认框工具 效果如下 代码如下: /** * 以模态窗做确认框的函数,title为标题栏内容,body为消息体,yesFun为点击确认按钮后执行的函数,执行后会执行关闭并删 ...

  3. ZXing.net 生成和解析二维码

    nuget引用zxing.net包 public partial class Form1 : Form { public Form1() { InitializeComponent(); } priv ...

  4. Git 远程推送被拒绝的一种解决方案

    今天在推送的时候发生了如下错误信息: error: 无法推送一些引用到 'https://gitee.com/von_w/demo_app.git'提示:更新被拒绝,因为您当前分支的最新提交落后于其对 ...

  5. 常用模块 - shutil模块

    一.简介 shutil – Utility functions for copying and archiving files and directory trees.(用于复制和存档文件和目录树的实 ...

  6. 5 替换空格 JavaScript

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   原来一个空格字符,替换之后 ...

  7. IO流之字节流

    IO流分类 按照数据流向 输入流:从外界(键盘.网络.文件…)读取数据到内存 输出流:用于将程序中的数据写出到外界(显示器.文件…) 数据源 目的地 交通工具 按照数据类型 字节流:主要用来处理字节或 ...

  8. java读写HDFS

    package cn.test.hdfs;   import java.io.IOException; import java.net.URI; import java.net.URISyntaxEx ...

  9. C语言实现 "谁是凶手?"

    日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个.以下为4个嫌疑犯的供词.A说:不是我.   a=0B说:是C.   c=1 C说:是D.      d=1D说:C在胡说    ...

  10. windows 设置tomcat为自动启动服务

    1.下载免安装tomcat包,解压 2.配置环境变量: 点击新建,创建一个 变量名为:CATALINA_HOME 变量值为:tomcat解压文件的位置, 例如     F:\apache-tomcat ...