当前位置: 首页 > news >正文

关于ROS的网络通讯方式TCP/UDP

一、TCP与UDP

TCP/IP协议族为传输层指明了两个协议:TCP和UDP,它们都是作为应同程序和网络操作的中介物。

TCP(Transmission Control Protocol)协议全称是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。 TCP是面向连接的、可靠的流协议,提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等。在传输数据前,双方会先建立一条虚拟的通道,可以减少数据传输差错。

传输流程类似下图:
请添加图片描述

UDP(User Datagram Protocol)协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。 位于OSI模型中第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视频直播等。在数据传输时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,因此,数据能否被对方接收、数据到达的实践和内容的完整性有序性都无法得到保证。

传输流程类似下图:

请添加图片描述

UDP协议就相当于是写信给对方,寄出去信件之后不能知道对方是否收到信件,信件内容是否完整,也不能得到及时反馈,而TCP协议就像是打电话,你需要知道对方的号码才能打电话,交流的内容可以实时反馈,确保信息的完整性。

两者对比:

TCPUDP
面向连接面向无连接
程序结构较简单
面向字节流基于数据报
保证数据顺序不保证数据顺序
速度很快
可以检查错误与纠正错误可以检查错误,不可纠正错误

总结,UDP更快,更简单,更高效,因此通常用于发送音频和视频文件。TCP是健壮的,可靠的,并保证以相同的顺序传递数据包。

二、ROS的网络通讯方式

ROS提供了两种网络通讯方式,一种是TCP协议,一种是UDP协议。默认采用TCP进行通讯,但在实际的wifi网络使用中经常遇到客户端和机器人连接中断且无法重新建立连接的情况。在ROS wiki中官方也有说明,ROSTCP更适合有线网连接的网络,而ROSUDP更适合wifi等网络不可靠的无线网络。下面介绍一下如何在ROS中使用UDP连接。

首先,rospy不支持udp连接, 所以要实现ROSUDP必须是用roscpp写的,然后在订阅的时候添加 ros::TransportHints 指定连接方式。如下面的代码:

#include <ros/ros.h>
#include <std_msgs/String.h>void print_message(const std_msgs::String data)
{ROS_INFO_STREAM("received: " << data);
}int main(int argc, char **argv)
{ros::init(argc, argv, "udp_test_node");ros::AsyncSpinner spinner(4);spinner.start();ros::NodeHandle private_nh("~");ros::Subscriber chatter_sub = private_nh.subscribe("/chatter", 10, print_message,                 			ros::TransportHints().unreliable().maxDatagramSize(1000));while (ros::ok()){sleep(1);}
}

其中 unreliable 用于指定采用udp连接。详细例子可以参照 这个 项目。

相关文章:

  • 68 内网安全-域横向PTHPTKPTT哈希票据传递
  • Redis的持久化机制
  • 如何在苹果Mac系统设置中查看Wi-Fi密码?
  • 阿里云二级域名绑定与宝塔Nginx反向代理配置
  • 前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案
  • 竞赛选题 深度学习实现语义分割算法系统 - 机器视觉
  • Ubuntu:解决PyCharm中不能输入中文或者输入一个中文解决方法
  • 【Python语言速回顾】——数据可视化基础
  • GZ035 5G组网与运维赛题第8套
  • 如何发布自己的golang库
  • 元素的水平居中和垂直几种方案
  • 新技术前沿-2023-应用GPT提问模板写技术文章
  • 什么是Web 3.0?
  • 无声的世界,精神科用药并结合临床的一些分析及笔记(十)
  • 虹科示波器 | 汽车免拆检修 | 2010款江铃陆风X8车发动机怠速抖动、加速无力
  • 《剑指offer》分解让复杂问题更简单
  • 【刷算法】求1+2+3+...+n
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PAT A1092
  • ucore操作系统实验笔记 - 重新理解中断
  • V4L2视频输入框架概述
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 第十八天-企业应用架构模式-基本模式
  • 回顾 Swift 多平台移植进度 #2
  • 漂亮刷新控件-iOS
  • 巧用 TypeScript (一)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • postgresql行列转换函数
  • ###STL(标准模板库)
  • #数学建模# 线性规划问题的Matlab求解
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ()、[]、{}、(())、[[]]命令替换
  • (007)XHTML文档之标题——h1~h6
  • (5)STL算法之复制
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)认识微服务
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)可以带来幸福的一本书
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net和jar包windows服务部署
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ACM] hdu 1201 18岁生日
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [Codeforces] combinatorics (R1600) Part.2
  • [LeetCode] 19. 删除链表的倒数第 N 个结点
  • [LeetCode] 626. 换座位
  • [New Portal]Windows Azure Virtual Machine (3) 在VM上挂载磁盘
  • [OS-Linux] CentOS 7.x 使用密钥登录安全设置