机器人使用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. Dubbo 安装监控中心

    一.Dubbo 安装服务管理控制台 1.在官方Github下载Dubbo OPS 2.下载incubator-dubbo-ops源码后,解压修改配置文件Zookeeper注册中心地址 3.maven打 ...

  2. 学生管理系统增删查基本操作(dom4j/sax技术)

    基本代码: student.xml <?xml version="1.0" encoding="UTF-8"?><student> &l ...

  3. 跨域详解之-----Jsonp跨域

    一.通过jsonp跨域 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的. 比如 ...

  4. 第5天 Java基础语法

    第5天 Java基础语法 今日内容介绍 方法 方法 方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这 ...

  5. Python交换两个变量值的函数

    方法1:(错误) def func(a,b): a,b = b,a a = 1 b = 2 func(a,b) print(a," ",b) 方法2:(正确) def func(a ...

  6. GeekOS: 一、构建基于Ubuntu9.04的实验环境

    参考:http://www.cnblogs.com/wuchang/archive/2009/05/05/1450311.html 补充:在最后步骤中,执行bochs即可弹出运行窗口

  7. break和continue使用

    前面讲的循环,这里就是控制循环的东西 break其实在我们学习switch判断的时候就是用到了 break:代表跳出整个循环 continue和break的用法差不多 continue:代表只跳出当前 ...

  8. Lucene第二讲——索引与搜索

    一.Feild域 1.Field域的属性 是否分词:Tokenized 是:对该field存储的内容进行分词,分词的目的,就是为了索引. 否:不需要对field存储的内容进行分词,不分词,不代表不索引 ...

  9. Centos7 下安装以及使用mssql

    Centos7下安装以及使用Mssql,在这下面玩,主要是发现linux环境下的mysql非常的小,小到只有169M,这在windows上面,动撤几个G的安装文件,会让你直接打消使用MSSQL的勇气, ...

  10. 金山WPS面试题

    1.windows的handle 1)是一个宏定义#define void* HANDLE 2) HANDLE提供了一种统一的方式去获得系统资源,并对其进行操作. 3) HANDLE使得程序设计的细节 ...