首页> 标签> 网络性能优化
"网络性能优化"
共 1739 条结果
全部 问答 文章 公开课 课程 电子书 技术圈 体验
一文搞懂MQTT,如何在SpringBoot中使用MQTT实现消息的订阅和发布
之前介绍了RabbitMQ以及如何在SpringBoot项目中整合使用RabbitMQ,看过的朋友都说写的比较详细,希望再总结一下目前比较流行的MQTT。所以接下来,就来介绍什么MQTT?它在IoT中有着怎样的作用?如何在项目中使用MQTT?一、MQTT介绍1.1 什么是MQTT?MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。MQTT具有协议简洁、轻巧、可扩展性强、低开销、低带宽占用等优点,已经有PHP,JAVA,Python,C,C#,Go等多个语言版本,基本可以使用在任何平台上。在物联网、小型设备、移动应用等方面有较广泛的应用,特别适合用来当做物联网的通信协议。1.2 MQTT特点MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。MQTT协议是为硬件性能有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:1.使用发布/订阅消息模式,提供多对多的消息发布,解除应用程序耦合;2.对负载内容屏蔽的消息传输;3.使用TCP/IP 提供网络连接;4.支持三种消息发布服务质量(QoS):QoS 0(最多一次):消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这个级别可用于如下情况,环境传感器数据,丢失一次数据无所谓,因为不久后还会有第二次发送。QoS 1(至少一次):确保消息到达,但消息重复可能会发生。QoS 2(只有一次):确保消息到达一次。这个级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。5.传输数据小,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;(用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。)1.3 MQTT应用场景MQTT作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有着广泛的应用。MQTT服务只负责消息的接收和传递,应用系统连接到MQTT服务器后,可以实现采集数据接收、解析、业务处理、存储入库、数据展示等功能。常见的应用场景主要有以下几个方面:(1)消息推送: 如PC端的推送公告,比如安卓的推送服务,还有一些即时通信软件如微信、易信等也是采用的推送技术。(2)智能点餐: 通过MQTT消息队列产品,消费者可在餐桌上扫码点餐,并与商家后端系统连接实现自助下单、支付。(3)信息更新: 实现商场超市等场所的电子标签、公共场所的多媒体屏幕的显示更新管理。(4)扫码出站: 最常见的停车场扫码缴费,自动起竿;地铁闸口扫码进出站。二、MQTT的角色组成2.1 MQTT的客户端和服务端2.1.1 服务端(Broker)EMQX就是一个MQTT的Broker,emqx只是基于erlang语言开发的软件而已,其它的MQ还有ActiveMQ、RabbitMQ、HiveMQ等等。EMQX服务端:https://www.emqx.io/zh/downloads?os=Windows2.1.2 客户端(发布/订阅)EMQX客户端:https://mqttx.app/zh这个是用来测试验证的客户端,实际项目是通过代码来实现我们消息的生产者和消费者。2.2 MQTT中的几个概念相比RabbitMQ等消息队列,MQTT要相对简单一些,只有Broker、Topic、发布者、订阅者等几部分构成。接下来我们先简单整理下MQTT日常使用中最常见的几个概念:1.Topic主题:MQTT消息的主要传播途径, 我们向主题发布消息, 订阅主题, 从主题中读取消息并进行.业务逻辑处理, 主题是消息的通道2.生产者:MQTT消息的发送者, 他们向主题发送消息3.消费者:MQTT消息的接收者, 他们订阅自己需要的主题, 并从中获取消息4.broker服务:消息转发器, 消息是通过它来承载的, EMQX就是我们的broker, 在使用中我们不用关心它的具体实现其实, MQTT的使用流程就是: 生产者给broker的某个topic发消息->broker通过topic进行消息的传递->订阅该主题的消费者拿到消息并进行相应的业务逻辑三、EMQX的安装和使用下面以Windows为例,演示Windows下如何安装和使用EXQX。step 1:下载EMQ安装包,配置EMQ环境EMQX服务端:https://www.emqx.io/zh/downloads?os=Windowsstep 2:下载压缩包解压,cmd进入bin文件夹step 3:启动EMQX服务在命令行输入:emqx start 启动服务,打卡浏览器输入:http://localhost:18083/ 进入登录页面。默认用户名密码 admin/public 。登录成功后,会进入emqx的后台管理页面,如下图所示:四、使用SpringBoot整合MQTT协议前面介绍了MQTT协议以及如何安装和启动MQTT服务。接下来演示如何在SpringBoot项目中整合MQTT实现消息的订阅和发布。4.1 创建工程首先,创建spring-boot-starter-mqtt父工程,在父工程下分别创建消息的提供者spring-boot-starter-mqtt-provider 模块和消息的消费者spring-boot-starter-mqtt-consumer模块。4.2 实现生产者接下来,修改生产者模块spring-boot-starter-mqtt-provider 相关的代码,实现消息发布的功能模块。4.2.1 导入依赖包修改pom.xml 文件,添加MQTT相关依赖,具体示例代码如下所示:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <version>5.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> </dependencies>4.2.2 修改配置文件修改application.yml配置文件,增加MQTT相关配置。示例代码如下所示:spring: application: name: provider #MQTT配置信息 mqtt: #MQTT服务地址,端口号默认11883,如果有多个,用逗号隔开 url: tcp://127.0.0.1:11883 #用户名 username: admin #密码 password: public #客户端id(不能重复) client: id: provider-id #MQTT默认的消息推送主题,实际可在调用接口是指定 default: topic: topic server: port: 8080 4.2.3 消息生产者客户端配置创建MqttProviderConfig配置类,读取application.yml中的相关配置,并初始化创建MQTT的连接。示例代码如下所示:import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; @Configuration @Slf4j public class MqttProviderConfig { @Value("${spring.mqtt.username}") private String username; @Value("${spring.mqtt.password}") private String password; @Value("${spring.mqtt.url}") private String hostUrl; @Value("${spring.mqtt.client.id}") private String clientId; @Value("${spring.mqtt.default.topic}") private String defaultTopic; /** * 客户端对象 */ private MqttClient client; /** * 在bean初始化后连接到服务器 */ @PostConstruct public void init(){ connect(); } /** * 客户端连接服务端 */ public void connect(){ try{ //创建MQTT客户端对象 client = new MqttClient(hostUrl,clientId,new MemoryPersistence()); //连接设置 MqttConnectOptions options = new MqttConnectOptions(); //是否清空session,设置false表示服务器会保留客户端的连接记录(订阅主题,qos),客户端重连之后能获取到服务器在客户端断开连接期间推送的消息 //设置为true表示每次连接服务器都是以新的身份 options.setCleanSession(true); //设置连接用户名 options.setUserName(username); //设置连接密码 options.setPassword(password.toCharArray()); //设置超时时间,单位为秒 options.setConnectionTimeout(100); //设置心跳时间 单位为秒,表示服务器每隔 1.5*20秒的时间向客户端发送心跳判断客户端是否在线 options.setKeepAliveInterval(20); //设置遗嘱消息的话题,若客户端和服务器之间的连接意外断开,服务器将发布客户端的遗嘱信息 options.setWill("willTopic",(clientId + "与服务器断开连接").getBytes(),0,false); //设置回调 client.setCallback(new MqttProviderCallBack()); client.connect(options); } catch(MqttException e){ e.printStackTrace(); } } public void publish(int qos,boolean retained,String topic,String message){ MqttMessage mqttMessage = new MqttMessage(); mqttMessage.setQos(qos); mqttMessage.setRetained(retained); mqttMessage.setPayload(message.getBytes()); //主题的目的地,用于发布/订阅信息 MqttTopic mqttTopic = client.getTopic(topic); //提供一种机制来跟踪消息的传递进度 //用于在以非阻塞方式(在后台运行)执行发布是跟踪消息的传递进度 MqttDeliveryToken token; try { //将指定消息发布到主题,但不等待消息传递完成,返回的token可用于跟踪消息的传递状态 //一旦此方法干净地返回,消息就已被客户端接受发布,当连接可用,将在后台完成消息传递。 token = mqttTopic.publish(mqttMessage); token.waitForCompletion(); } catch (MqttException e) { e.printStackTrace(); } } }4.2.4 生产者客户端消息回调创建MqttProviderCallBack类并继承MqttCallback,实现相关消息回调事件,示例代码如下图所示:import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttMessage; public class MqttConsumerCallBack implements MqttCallback{ /** * 客户端断开连接的回调 */ @Override public void connectionLost(Throwable throwable) { System.out.println("与服务器断开连接,可重连"); } /** * 消息到达的回调 */ @Override public void messageArrived(String topic, MqttMessage message) throws Exception { System.out.println(String.format("接收消息主题 : %s",topic)); System.out.println(String.format("接收消息Qos : %d",message.getQos())); System.out.println(String.format("接收消息内容 : %s",new String(message.getPayload()))); System.out.println(String.format("接收消息retained : %b",message.isRetained())); } /** * 消息发布成功的回调 */ @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { System.out.println(String.format("接收消息成功")); } }4.2.5 创建Controller控制器实现消息发布功能创建SendController控制器类,实现消息的发送功能,示例代码如下所示:@Controller public class SendController { @Autowired private MqttProviderConfig providerClient; @RequestMapping("/sendMessage") @ResponseBody public String sendMessage(int qos,boolean retained,String topic,String message){ try { providerClient.publish(qos, retained, topic, message); return "发送成功"; } catch (Exception e) { e.printStackTrace(); return "发送失败"; } } }4.3 实现消费者前面完成了生成者消息发布的模块,接下来修改消费者模块​spring-boot-starter-mqtt-consumer​实现消息订阅、处理的功能。4.3.1 导入依赖包修改pom.xml 文件,添加MQTT相关依赖,具体示例代码如下所示:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <version>5.3.2.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> </dependencies>4.3.2 修改配置文件修改application.yml配置文件,增加MQTT相关配置。示例代码如下所示:spring: application: name: consumer #MQTT配置信息 mqtt: #MQTT服务端地址,端口默认为11883,如果有多个,用逗号隔开 url: tcp://127.0.0.1:11883 #用户名 username: admin #密码 password: public #客户端id(不能重复) client: id: consumer-id #MQTT默认的消息推送主题,实际可在调用接口时指定 default: topic: topic server: port: 80854.3.3 消费者客户端配置创建消费者客户端配置类MqttConsumerConfig,读取application.yml中的相关配置,并初始化创建MQTT的连接。示例代码如下所示:import javax.annotation.PostConstruct; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Configuration public class MqttConsumerConfig { @Value("${spring.mqtt.username}") private String username; @Value("${spring.mqtt.password}") private String password; @Value("${spring.mqtt.url}") private String hostUrl; @Value("${spring.mqtt.client.id}") private String clientId; @Value("${spring.mqtt.default.topic}") private String defaultTopic; /** * 客户端对象 */ private MqttClient client; /** * 在bean初始化后连接到服务器 */ @PostConstruct public void init(){ connect(); } /** * 客户端连接服务端 */ public void connect(){ try { //创建MQTT客户端对象 client = new MqttClient(hostUrl,clientId,new MemoryPersistence()); //连接设置 MqttConnectOptions options = new MqttConnectOptions(); //是否清空session,设置为false表示服务器会保留客户端的连接记录,客户端重连之后能获取到服务器在客户端断开连接期间推送的消息 //设置为true表示每次连接到服务端都是以新的身份 options.setCleanSession(true); //设置连接用户名 options.setUserName(username); //设置连接密码 options.setPassword(password.toCharArray()); //设置超时时间,单位为秒 options.setConnectionTimeout(100); //设置心跳时间 单位为秒,表示服务器每隔1.5*20秒的时间向客户端发送心跳判断客户端是否在线 options.setKeepAliveInterval(20); //设置遗嘱消息的话题,若客户端和服务器之间的连接意外断开,服务器将发布客户端的遗嘱信息 options.setWill("willTopic",(clientId + "与服务器断开连接").getBytes(),0,false); //设置回调 client.setCallback(new MqttConsumerCallBack()); client.connect(options); //订阅主题 //消息等级,和主题数组一一对应,服务端将按照指定等级给订阅了主题的客户端推送消息 int[] qos = {1,1}; //主题 String[] topics = {"topic1","topic2"}; //订阅主题 client.subscribe(topics,qos); } catch (MqttException e) { e.printStackTrace(); } } /** * 断开连接 */ public void disConnect(){ try { client.disconnect(); } catch (MqttException e) { e.printStackTrace(); } } /** * 订阅主题 */ public void subscribe(String topic,int qos){ try { client.subscribe(topic,qos); } catch (MqttException e) { e.printStackTrace(); } } }4.3.4 消费者客户端消息回调创建MqttConsumerCallBack类并继承MqttCallback,实现相关消息回调事件,示例代码如下图所示:import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttMessage; public class MqttConsumerCallBack implements MqttCallback{ /** * 客户端断开连接的回调 */ @Override public void connectionLost(Throwable throwable) { System.out.println("与服务器断开连接,可重连"); } /** * 消息到达的回调 */ @Override public void messageArrived(String topic, MqttMessage message) throws Exception { System.out.println(String.format("接收消息主题 : %s",topic)); System.out.println(String.format("接收消息Qos : %d",message.getQos())); System.out.println(String.format("接收消息内容 : %s",new String(message.getPayload()))); System.out.println(String.format("接收消息retained : %b",message.isRetained())); } /** * 消息发布成功的回调 */ @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { System.out.println(String.format("接收消息成功")); } }4.3.5 创建Controller控制器,实现MQTT连接的建立和断开接下来,创建Controller控制器MqttController,并实现MQTT连接的建立和断开等方法。示例代码如下所示:import com.weiz.mqtt.config.MqttConsumerConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MqttController { @Autowired private MqttConsumerConfig client; @Value("${spring.mqtt.client.id}") private String clientId; @RequestMapping("/connect") @ResponseBody public String connect(){ client.connect(); return clientId + "连接到服务器"; } @RequestMapping("/disConnect") @ResponseBody public String disConnect(){ client.disConnect(); return clientId + "与服务器断开连接"; } }4.4 测试验证首先,分别启动生产者​spring-boot-starter-mqtt-provider​ 和消费者​spring-boot-starter-mqtt-consume​r两个项目,打开浏览器,输入地址http://localhost:18083/,在EMQX管理界面可以看到连接上来的两个客户端。如下图所示:接下来,调用生产者的消息发布接口验证消息发布是否成功。使用Pomstman调用消息发送接口:http://localhost:8080/sendMessage ,如下图所示:通过上图可以发现,生产者模块已经把消息发送成功。接下来查看消费者模块,验证消息是否处理成功。如下图所示:通过日志输出可以发现,消费者已经成功接收到生产者发送的消息,说明我们成功实现在Spring Boot项目中整合MQTT实现了消息的发布和订阅的功能。最后以上就是如何在Spring Boot中使用MQTT的详细内容,更多关于在Spring Boot中MQTT的使用大家可以去自己研究学习。比如:如何利用qos机制保证数据不会丢失?消息的队列和排序?集群模式下的应用?等等。
文章
消息中间件  ·  传感器  ·  网络协议  ·  Java  ·  物联网  ·  网络性能优化  ·  C#  ·  Android开发  ·  Windows  ·  Spring
2023-02-02
四十一、TCP可靠传输、流量控制、拥塞控制
可靠:保证接收方从缓存区读出的字节流与发送发发出的字节流是完全一样的。1、TCP实现可靠传输的机制 TCP实现可靠传输的机制包括以下四种:校验,序号,确认和重传。1.1 校验与UDP校验一样,都是通过增加伪首部的方式来实现。1.2 序号一个字节占一个序号,序号字段: 指的是一个报文段第一个字节的序号。1.3 确认 TCP采用累积确认的方式,如上图中当接收方TCP缓存收到“123”报文段之后,会返回一个确认报文段,其首部确认字段为4;之后发送发又发送了“456”和“78”报文段,但接收方只收到了“78”报文段,由于累积重传机制,接收方仍会发送给发送方首部确认字段为4的确认报文。1.4 重传 确认重传不分家,TCP发送发在规定时间(重传时间)内没有收到确认就要重传已经发送的报文段,超时重传。TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)。超时重传的机制有时候可能会使得发送发等待的时间过久,所以还会配合使用冗余ACK(冗余确认)的方式,也叫快速重传,其机制如下所示:2、TCP的流量控制流量控制指的是让发送方法慢点,要让接收方来得及接收。TCP利用滑动窗口机制实现流量控制。在通信的过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来讲rwnd通知发送给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。 下面是一个主机A和主机B之间通过滑动窗口进行通信的示例:同时TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段,接收方收到探测报文段时给出现在的窗口值。若返回的窗口值仍未0,则发送方就重新设置持续计时器。3、TCP的拥塞控制 出现拥塞的条件:对资源的需求的总和 > 可用资源,网络中有许多资源同时呈现供应不足→网络性能变坏→网络吞吐量将随输入负荷增大而下降。 拥塞控制: 防止过多的数据注入到网络中,是一个全局性的问题,不同于流量控制是一个端到端的问题。拥塞控制的四种算法:慢开始、拥塞避免;快重传、快恢复。使用拥塞算法的假定:数据时单方向传送的,而另一个方向只传送确认;接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度:发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd};接收窗口接收方根据接受缓存设置的值,并告知发送方,反映接收方容量; 拥塞窗口发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。3.1 慢开始和拥塞避免 一个传输轮次: 发送了一批报文段并收到他们的确认的时间。指的是一个往返试验RTT,也指开始发送一批拥塞窗口内的报文段到开始发送下一批拥塞窗口内的报文段的时间。3.2 快重传和快恢复
文章
缓存  ·  网络协议  ·  算法  ·  网络性能优化
2023-02-01
三十九、传输层概述和UDP协议
传输层是只有主机才有的层次。传输层为应用层提供通信服务,同时可以使用网络层提供的服务。1、传输层的功能 (1) 传输层提供进程和进程之间的逻辑通信,区别于网络层提供主机和主机之间的逻辑通信。即网络层将信息从一个主机传递到另外一个主机之后,需要经过传输层将这些信息分发给不同的进程,或者同一个进程的不同线程中。(2) 复用和分用,复用指的是将不同进程的数据(报文段)使用同一个传输层的协议进行传输;分用指的是传输层将传来的报文段送交给不同的进程。 (3) 传输层对收到的报文进行差错检测。 (4) 传输层有TCP和UDP两种协议。2、传输层的两个协议2.1 TCP协议面向连接的传输控制协议,传送数据之前必须建立连接,数据传送结束之后要释放连接。不提供广播或者多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认,流量控制,计时器及连接管理等。可靠,面向连接,时延大,适用于大文件。2.2 UDP协议无连接的用户数据报协议,传送数据之前不需要建立连接,收到UDP报文之后也不需要给出任何确认。不可靠,无连接,时延小,适用于小文件。3、传输层的寻址与端口 端口是传输层的SAP,标识主机中的应用进程,这里的端口是逻辑端口/软件端口。 端口号只有本地意义,在因特网中不同计算机中的相同端口是没有联系的。端口号长度为16bit,能表示65536个不同的端口号。端口号的分类如下所示:常见的熟知端口号应用程序如下所示:在网络中采用发送方和接收方的套接字(Socket)组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。套接字Socket=(主机IP地址,端口号)4、UDP协议 UDP只在IP数据报服务之上增加了很少的功能,即复用分用和差错检测的功能。 UDP的主要特点: (1) UDP是无连接的,减少开销和发送数据之前的时延; (2) UDP使用最大努力交付,即不保证可靠交付;(3) UDP是面向报文的,适合一次性传输少量数据的网络应用; (4) UDP无拥塞控制,适合很多实时应用; (5) UDP的首部开销小,只有8Byte,TCP的首部有20Byte4.1 UDP的首部格式在分用时,若数据报找不到对应的目的端口号,就丢弃报文,并给发送方发送ICMP“端口不可达”差错报告报文。4.2 UDP校验  伪首部只有在计算校验和时候才会出现,不向下传递也不向上递交。伪首部中的17表示:封装UDP报文的IP数据包首部协议字段是17;伪首部中的首部长度:UDP首部8Byte+数据部分长度,不包括伪首部的长度。在发送端校验处理过程:填上伪首部;全0填充检验和字段;全0填充数据部分(UDP数据报要看成许多4B的字串连起来0);伪首部+首部+数据部分采用二进制反码求和;把和求反码填入检验和字段;去掉伪首部,发送。在接收端校验处理过程:填上伪首部;;伪首部+首部+数据部分采用二进制反码求和;结果全为1则无差错,否则丢弃数据报或者交给应用层并附上出差错的警告。
文章
网络协议  ·  网络性能优化
2023-02-01
二十七、网络层概述和数据交换方式
1、网络层功能概述网络层的主要任务是把分组从源端传送到目的端,为分组交换网上的不同主机提供通信服务。网络层传输单位是数据报。数据报可以划分为更小的单位,叫做分组。网络层的主要功能有以下三种: 功能一: 路由选择与分组转发,最佳路由功能二: 异构网络互联 功能三: 拥塞控制,若所有节点都来不及接收分组,而要丢弃大量分组的话,网络就处于拥塞状态。因此就要采取一定的措施,缓解这种拥塞。 拥塞控制的方式有以下两种:开环控制-静态的;和闭环控制-动态的。2、数据交换方式数据交换使得数据通过网络的核心路由器从源主机到达目的主机。当不使用交换设备(二层的交换机,网桥和三层的路由器),则任意两个需要进行通信的主机之间都需要进项连接,则需要的链路数量是 C n 2 C_n^2 Cn2条。若只使用一个交换设备,则只需要构建 n n n条链路就可以实现 n n n台主机之间的通信,但是这样会大大增加交换设备的压力,因为数据吞吐量过大。所以采用多个交换设备构成交换设备网络来实现不同主机之间的相互通信。进行数据交换的方式包括以下三种:电路交换,报文交换和分组交换,其中分组交换又可以分为数据报方式和虚电路方式。2.1 电路交换 电路交换包含以下三个阶段:建立连接(呼叫/电路建立)→通信→释放连接(拆除电路),其特点是独占资源,具有通信时延小,有序传输,没有冲突和实时性强的优点。但是电路交换有以下相应缺点:建立连接的时间长;线路独占,使用效率低;灵活性差;和没有差错控制能力。2.2 报文交换报文: 源应用发送的信息整体。报文交换通过交换设备进行存储转发之后到达目的主机。所以报文交换具有:无需建立连接;存储转发,动态分配线路;线路可靠性高;线路利用率高和多目标服务等优点。但是报文交换同样有:存储转发时延;报文大小不定,需要网络节点有较大的缓存空间等缺点。2.3 分组交换 分组: 将大的数据块分割成小的数据块。分组交换具有以下优点:无需建立连接;存储转发,动态分配链路;线路的可靠性高;线路利用率高;相对于报文交换,存储管理更加容易。但是分组交换同样有:存储转发时延;需要传输额外的信息量和乱序到达目的主机时,需要对分组排序重组等缺点。2.4 报文交换和分组交换的比较2.5 三种数据交换方式的比较总结报文交换和分组交换都采用存储转发;传送数据量大,且传送时间远大于呼叫时间时,采用电路交换,因为电路交换的传输时延最小。从信道利用率看,报文交换和分组交换优于电路交换,其中分组交换时延更小。3、 分组交换中的数据报交换方式和虚电路交换方式 数据报方式为网络层提供无连接服务,所谓的无连接服务指的是:不事先为分组的传输确定传输路径,每个分组独立确定传输路径,不同分组传输路径可能不同。虚电路方式为网络层提供连接服务,所谓的连接服务指的是:首先为分组的传输确定传输路径(建立连接),然后沿该路径(连接)传输系列分组,系列分组传输路径相同,传输结束后拆除连接。不同网络层次的传输数据单元如下图所示:3.1 数据报交换方式 无连接: 因特网当前使用数据报进行发送信息,使用的是无连接服务,不事先为分组的传输确定传输路径,每个分组独立确定传输路径,不同分组传输路径可能不同。每个分组携带源地址和目的地址 路由器根据分组的目的地址转发分组: 基于路由协议/算法构建转发表;检索转发表;每个分组独立选路。3.2 虚电路交换方式虚电路将数据报方式和电路交换方式结合,以发挥二者的优点虚电路: 一条源主机到目的主机类似于电路的路径(逻辑连接),路径上所有节点都要维持这条虚电路的建立,都维持一张虚电路表,每一项记录了一个打开的虚电路信息。其通信过程如下所示:3.3 虚电路和数据报的不同点
文章
存储  ·  机器学习/深度学习  ·  缓存  ·  算法  ·  网络性能优化  ·  网络架构
2023-02-01
TCP 协议详解
TCP :有连接、可靠传输、面向字节流、全双工保证可靠性:确认应答、超时重传、连接管理(三次挥手 四次握手)提高效率:滑动窗口、流量控制、拥塞控制
文章
网络协议  ·  网络性能优化
2023-02-01
UDP 协议详解
1、简介UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议。UDP 是无连接的,知道对方的IP和端口号直接进行传输就行,不需要建立连接UDP 不可靠,没有任何可靠机制,即便发送失败也不会返回任何错误信息UDP 面向数据报,发多少就收多少,原样发送,交给UDP的报文,UDP不会拆分或合并UDP 没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低。UDP 支持一对一、一对多、多对一和多对多的交互通信缓冲区:只有接收缓冲区,没有发送缓冲区,接收缓冲区满了,多的直接丢弃 2. 首部说明:首部由四个字段构成,每个字段都是 2byte源端口: 源端口号,需要对方回信时选用,不需要时全部置0.目的端口:目的端口号,在终点交付报文的时候需要用到。长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部),由于长度只有16位,所有UDP一次能发送的数据最大就是 64K校验和:检测UDP数据报在传输中是否有错,有错则丢弃。 3. 回显服务器代码案例 echoServerUdpServerpackage echo; import java.net.*; import java.util.Arrays; import java.io.IOException; public class UdpServer { private static int PORT = 2222; private DatagramSocket socket; public UdpServer() throws SocketException { socket = new DatagramSocket(PORT); } public void start() throws IOException { byte[] bytes = new byte[2048]; DatagramPacket receivePacket = new DatagramPacket(bytes, bytes.length); socket.receive(receivePacket); System.out.printf("ClientAddress: %s\nClientPort: %d\n", receivePacket.getAddress(),receivePacket.getPort()); System.out.println("ClientData:"+ new String(receivePacket.getData(),"utf-8")); DatagramPacket sendPacket = process(receivePacket); socket.send(sendPacket); } public DatagramPacket process(DatagramPacket packet){ DatagramPacket packet1 = new DatagramPacket(packet.getData(),packet.getLength(), packet.getSocketAddress()); return packet1; } public static void main(String[] args) throws IOException { UdpServer server = new UdpServer(); server.start(); } } UdpClientpackage echo; import java.net.*; import java.io.IOException; import java.util.Scanner; public class UdpClient { public void start() throws IOException { DatagramSocket socket = new DatagramSocket(); byte[] bytes = new byte[2048]; System.out.println("请输入你想发送给服务器的信息:"); Scanner scanner = new Scanner(System.in); String str =scanner.nextLine(); bytes = str.getBytes(); DatagramPacket sendPacket = new DatagramPacket(bytes,bytes.length, new InetSocketAddress("localhost",2222)); socket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(new byte[2048],2048); socket.receive(receivePacket); System.out.println(new String(receivePacket.getData(),"utf-8")); } public static void main(String[] args) throws IOException { UdpClient client = new UdpClient(); client.start(); } }
文章
网络性能优化
2023-02-01
五、OSI参考模型
1、OSI模型是怎么来的为了解决计算机网络复杂的“大问题”,将这个“大问题”划分为一些列“小问题”,这就有了计算机网络分层结构。IBM公司首先提出了SNA网络体系结构,之后还有其他组织各自提出自己的网络体系结构,包括美国国防部提出的TCP/IP计算机网络体系。但是不同公司之间的体系只能在自己公司内部的软件之间互相使用,不同呢公司之间不能进行互联互通。所以为了支持异构网络系统的互联互通,国际标准化组织(ISO)于1984年提出开放系统互联(OSI)参考模型,但是由于TCP/IP在市场上应用良好,所以OSI模型只能作为一个理论模型,没有广泛投入时长使用。2、OSI参考模型OSI参考模型包括7层,自下而上依次是:物理层,数据链路层、网络层、传输层、会话层、表示层和应用层。OSI七层模型如下图所示。2.1 OSI参考模型解释通信过程-数据封装的过程下图介绍了一个由主机A发送信息通过中间系统(路由器,网桥,交换机等)传送到主机B的过程。其中OSI模型中的4-7层实现的是端到端的传输,1-3层实现的是点到点的传输。发送端完成的是数据打包的过程,接收端完成的是数据拆包的过程。在打包和拆包过程中比较特殊的是数据链路层,它要为4-PDU(Protocal Data Unit)添加头部和尾部两部分“包装”,除物理层外的其他层都只需要为PDU添加头部“包装”即可。2.2 OSI参考模型各层的功能和对应的协议应用层应用层是用户与网络的界面,包括所有能和用户交互产生网络流量的程序。应用层程序包括QQ,邮件软件等等,典型的应用层服务包括:文件传输(FTP),电子邮件(SMTP),万维网(HTTP)… …表示层 表示层用于处理两个通信系统中交换信息的表示方式(包括语法和语义等)。表示层的功能包括以下三个: (1) 数据格式变换,i.e., 将二进制数字转化为图片文字等 (2) 数据加密和解密 (3) 数据压缩和恢复 表示层在TCP/IP中不是一个单独的层面,会被纳入到应用层规划层里面,所以表示层没有太多单独的协议,跟表示层有关的协议包括:JPEG、ASCII等。会话层会话层向表示层实体/用户进程提供建立连接并在连接上有序地传输数据。这是会话,也是建立同步(SNY)。会话层的功能包括以下两个: (1) 建立、管理、终止会话(2) 使用校验点可以使会话在通信失效时从校验点/同步点继续恢复通信,实现数据同步。适用于传输大文件。传输层传输层负责主机中两个进程的通信,即端到端的通信。传输单位是报文段或者用户数据报。传输层的功能包括以下四个: (1) 可靠传输、不可靠传输。带有反馈机制的传输叫做可靠传输,不带反馈机制的传输较不可靠传输。(2) 差错控制,纠正发送出现错误的报文段(3) 流量控制,控制发送端的发送速率 (4) 复用分用,复用指的是:多个应用层进程可以同时使用下面传输层的服务;分用指的是:传输层把收到的信息分别交付给上面应用层中相应的程序。 传输层的主要协议包括: TCP 、IP网络层主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络传输层的单位是数据报。当数据报过长的时候就可以将数据报进行切割,切割成一个个小的分组,之后再放到链路上面进行传递,这样可以适当数据在链路上传递更加灵活,损失也会更小。网络层的功能包括以下四个: (1) 路由选择,选择一个最佳路径将数据从发送端传送到接收端; (2) 流量控制,协调发送端和接收端的速度问题 (3) 差错控制, 纠正发送出现错误的报文段 (4) 拥塞控制,从整个网络全局的角度调节数据传输速度。若网络中所有的节点(路由器等)都来不及接受分组,而要对其大量分组的话,网络就处于拥塞状态。因此要采取一定额措施缓解这种拥塞。 网络层的协议包括:IP、IPX、ICMP、IGMP、ARP、RARP和OSPF等。数据链路层 数据链路层的主要任务是把网络层传下来的数据报组装成帧,所以数据链路层/链路层的传输单位是帧。数据链路层的功能包括以下三个: (1) 成帧,定义帧的开始和结束; (2) 差错控制,检测帧错+位错,可以检错和纠错 (3) 流量控制,发送发和接收方的速度协调问题 (4) 访问(接入)控制,控制对共享信道的访问 数据链路层的主要协议包括:SDLC,HDLC,PPP,STP物理层 物理层的主要任务是在物理媒体(电缆,光纤,无线电波等)上实现比特流的透明传输。物理层的传输单位是比特。 透明传输指的是不管所传输的数据是什么样的比特组合,都应当能够在链路上进行传输。物理层的功能包括以下 个: (1) 定义接口特性 (2) 定义传输模式,单工,半双工,双工 (3) 定义传输速率 (4) 比特同步 (5) 比特编码 物理层的主要协议包括:Rj45和802.3
文章
网络协议  ·  网络性能优化  ·  数据安全/隐私保护  ·  网络架构  ·  数据格式
2023-02-01
TCP三次握手四次挥手及常见问题解决方案
TCP三次握手四次挥手及常见问题解决方案一、重要概念        位码即tcp标志位,有6种表示:        SYN(synchronous建立连接)        ACK(acknowledgement 表示响应、确认)        PSH(push表示有DATA数据传输)        FIN(finish关闭连接)        RST(reset表示连接重置)        URG(urgent紧急指针字段值有效)二、三次握手四次挥手流程图三、三次握手        第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认。        第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。        第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。        握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。        确认号:其数值等于发送方的发送序号+1(即接收方期望接收的下一个序列号)。四、四次挥手        第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。        第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。        第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。        第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。        TCP的四次挥手过程(简言之):主动关闭方向被动关闭方发送不会再给你发数据了的信息;被动关闭方对收到的主动关闭方的报文段进行确认;被动关闭方向主动关闭方发送我也不会再给你发数据了的信息;主动关闭方再次对被动关闭方的确认进行确认。四、三次握手四次挥手常见问题及答案4.1、ISN代表什么?意义何在?        ISN,发送方的字节数据编号的原点,让对方生成一个合法的接收窗口。4.2、ISN是固定不变的吗?·动态随机。4.3、ISN为何要动态随机?        增加安全性,为了避免被第三方猜测到,从而被第三方伪造的RST报文Reset。        ISN动态随机使得每个tcp session的字节序列号没有重叠,如果出现tcp五元组冲突这种极小概率情况的发生,一个session的数据也不会被误认为是另一个session的。4.4、第三方可以伪造RST报文,需要满足什么条件才能得逞?        需要sequence number 位于对方的合法接收窗口内。 而由于ISN是动态随机的,猜出对方合法接收窗口难度加大。如果ISN = 0,那么猜出的难度就大大降低。4.5、三次握手的第一次可以携带数据吗?为何?        不可以,三次握手还没有完成。4.6、对方难道不可以将数据缓存下来,等握手成功再提交给应用程序?        这样会放大SYN FLOOD攻击。如果攻击者伪造了成千上万的握手报文,携带了1K+ 字节的数据,而接收方会开辟大量的缓存来容纳这些巨大数据,内存会很容易耗尽,从而拒绝服务。4.7、第三次可以携带数据吗?为何?        可以。能够发出第三次握手报文的主机,肯定接收到第二次(服务器)握手报文,对吗?        因为伪造IP的主机是不会接收到第二次报文的。        所以,能够发出第三次握手报文的,应该是合法的用户。        尽管服务器侧的状态还没有“established”,接收到第三次握手的瞬间,状态就会切换为“established”,里面携带的数据按照正常流程走就好。4.8、看到有人说,只看到过TCP状态位为 ’FIN +ACK’,但从来没有看过状态位只有 ‘FIN’,你应该怎样给他解释?        RFC793明确规定,除了第一个握手报文SYN除外,其它所有报文必须将ACK = 1。4.9、RFC规定的背后肯定有合理性的一面,能否深究一下原因?        TCP作为一个可靠传输协议,其可靠性就是依赖于收到对方的数据,ACK对方,这样对方就可以释放缓存的数据,因为对方确信数据已经被接收到了。        但TCP报文是在IP网络上传输,丢包是家常便饭,接收方要抓住一切的机会,把消息告诉发送方。最方便的方式就是,任何我方发送的TCP报文,都要捎带着ACK状态位。4.10、ACK状态位单独能承担这个消息传递的任务吗?        不能!需要有 Acknowledge Number配合才行。如果我方发出的Acknowledge Number == 10001,那意味着序列号10000及之前的字节已经成功接收。如果对方占据字节序列号10000是应用层数据,那么就是确认应用层数据。如果对方占据字节序列号10000是’FIN’状态位,那么就是确认接收到对方的’FIN’4.11、为什么TCP客户端最后还要发送一次确认呢?        一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。        如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。4.12、如果已经建立了连接,但是客户端突然出现故障了怎么办?        TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。  4.13、TCP 长连接和短连接有什么区别?        TCP 短连接是指客户端与服务端连接后只进行一次读写就关闭连接,一般是客户端关闭。        而长连接则是指在进行完一次读写后不关闭连接,直到服务端压力过大则选择关闭一些长时间为进行读写的连接。        TCP 短连接的优点在于管理简单,而且不会对服务端造成太大的压力,而缺点是每次读写都需要连接耗时较长。        TCP 长连接的优点是可以迅速进行多次读写,缺点是对服务端压力大,且容易被恶意连接影响服务。        长短连接的区别就在于客户端和服务端选择的关闭策略不同,具体需要根据应用场景来选择合适的策略。4.14、TCP 粘包、拆包及解决方法?        TCP 之所以会产生粘包和拆包拆包问题,是因为他本身就是一种字节流协议,TCP 本身就没有数据包的概念,需要发送和接受的数据是没有格式的,以字节流的形式传输,而在传输过程中会被分割为一段段数据块,也就是报文。TCP 要发送的数据会被先放置在数据缓冲区,接收数据也是从缓冲区获取,而缓冲区的大小即为最大报文长度,如果需要发送的数据长度大于缓冲区剩余的大小或者大于最大报文长度,则会出现拆包,如果是需要发送的数据很少,而短时间内又有其他数据包需要发送,就会出现粘包的现象。        解决方案有很多种,可以在数据包头加上数据包长度,或者把每个数据包封装为固定长度,不够则补 0,以及可以使用特定分割符号等等。        我们在项目中也遇到过这种问题,因为我们在做流量检测的时候,有时候难以找到恶意软件的流量特征,会把数据包长度当做特征来使用,有些恶意软件内部无论会把这些数据包长度写死,这样恶意软件本身就不存在有无法解析粘包和拆包的情况,但对于我们来说,检测就会遇到障碍,尤其是攻击者可以设置 MSS 来使得数据包长度改变,对于这种攻击我们目前也没有很好的方案来解决。4.15、TCP 通过哪些方式来保证数据的可靠性?        TCP 保证数据可靠性的方式大致可以分为三类:                1、在数据包层面:校验和                2、在数据包传输层面:序列号、确认应答、超时重传                3、在流量控制层面:拥塞控制校验和        计算方式:在数据传输的过程中,将发送的数据段都当做一个 16 位的整数。将这些整数加起来。并且加上进位,最后取反,得到校验和。        TCP 与 UDP 校验方式相同序列号、确认应答、超时重传        在数据包传输的过程中,每个数据包都有一个序列号,当数据到达接收方时,接收方会发出一个确认应答,表示收到该数据包,并会说明下一次需要接收到的数据包序列号(32 位确认序列号)。如果发送端在一段时间内(2RTT 没有收到确认应答,则说明可能是发送的数据包丢失或者确认应答包丢失,此时发送端会进行数据包重传。        但发送端并不是一定要等到接收到上一个数据包的确认应答再发送下一个数据包,TCP 会利用窗口控制来提高传输速度,在一个发送窗口大小内,不用一定要等到应答才能发送下一段数据,发送窗口大小就是无需等待确认而可以继续发送数据的最大值。而发送窗口的大小是由接收端的接受窗口的剩余大小和拥塞窗口来决定的。(TCP 会话的双方都各自维护一个发送窗口和一个接收窗口)拥塞控制        发送端维持一个叫做拥塞窗口 cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送端让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。        TCP 的拥塞控制主要是采用慢启动以及增性加,乘性减的机制,TCP一开始将拥塞窗口设置的很小,在逐渐经过一段时间的指数增长后超过门限,进入增性加阶段,此时窗口大小的增长是线性的,比之前的指数增长要慢很多,而当发生网络拥塞时,拥塞窗口大小直接减半(乘性减)。
文章
缓存  ·  网络协议  ·  安全  ·  网络性能优化
2023-01-12
面向群体业务的负载均衡调度预测业务的群用户QoS的变化趋势该怎么办?
面向群体业务的负载均衡调度预测业务的群用户QoS的变化趋势该怎么办?
问答
负载均衡  ·  网络性能优化  ·  调度
2022-05-08
【控制】基于Matlab实现5GNR—V2X拥塞控制算法
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。🍎个人主页:Matlab科研工作室🍊个人信条:格物致知。更多Matlab仿真内容点击👇智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统信号处理              图像处理               路径规划       元胞自动机        无人机 ⛄ 内容介绍随着汽车行业需求的增长,3GPP正在开发长期演进(LTE)蜂窝技术中的新功能,以专门解决车对所有(V2X)连接,特别是车对车(V2V)直接通信。在涉及安全性,交通管理或信息娱乐的大多数已启用应用程序的基础上,协作意识服务尤为重要,它对应于所有车辆在广播中定期发送的消息,以告知其状态和意图。为了优化无线电资源的使用,需要巧妙地执行数据包分配,遵循目前代表着一个具有挑战性的开放性问题的算法。考虑到解决协作意识时要面对LTE-V2V网络中资源分配的设计和验证,我们实现了一个名为LTEV2Vsim的模拟器,该模拟器将与所有感兴趣的研究人员共享。 LTEV2Vsim用MATLAB编写,可按照简单的模型或更复杂,更实际的输入文件管理车辆的机动性,并根据不同的已实现算法(包括网络控制和自主算法)执行分配。最后,为了演示LTEV2Vsim的可能性,提供了一些示例结果⛄ 部分代码% Simplified scenario to use WilabV2Xsim% Packet size and MCS are set accordingly to utilize the whole channel% Each transmission uses all the subchannels available.% NR-V2X is considered for these simulations% WiLabV2Xsim('help')close all    % Close all open figuresclear        % Reset variablesclc          % Clear the command windowpacketSize=1000;        % 1000B packet sizenTransm=1;              % Number of transmission for each packetsizeSubchannel=10;      % Number of Resource Blocks for each subchannelRaw = [50, 150, 300];   % Range of Awarness for evaluation of metricsspeed=70;               % Average speedspeedStDev=7;           % Standard deviation speedSCS=15;                 % Subcarrier spacing [kHz]pKeep=0.4;              % keep probabilityperiodicity=0.1;        % periodic generation every 100mssensingThreshold=-126;  % threshold to detect resources as busy% Configuration fileconfigFile = 'Highway3GPP.cfg';%% NR-V2X PERIODIC GENERATIONfor BandMHz=[10]if BandMHz==10    MCS=11;elseif BandMHz==20    MCS=5;end    for rho=[100 200 300] % number of vehicles/km        % Just for visualization purposes the simulations time now are really short,        % when performing actual simulation, each run should take at least        % 30mins or one hour of computation time.    if rho==100        simTime=10;     % simTime=300    elseif rho==200        simTime=5;      % simTime=150;    elseif rho==300        simTime=3;      % simTime=100;    end    % HD periodicoutputFolder = sprintf('Output/NRV2X_%dMHz_periodic',BandMHz);% Launches simulationWiLabV2Xsim(configFile,'outputFolder',outputFolder,'Technology','5G-V2X','MCS_NR',MCS,'SCS_NR',SCS,'beaconSizeBytes',packetSize,...    'simulationTime',simTime,'rho',rho,'probResKeep',pKeep,'BwMHz',BandMHz,'vMean',speed,'vStDev',speedStDev,...    'cv2xNumberOfReplicasMax',nTransm,'allocationPeriod',periodicity,'sizeSubchannel',sizeSubchannel,...    'powerThresholdAutonomous',sensingThreshold,'Raw',Raw,'FixedPdensity',false,'dcc_active',false,'cbrActive',true)endend%% PLOT of resultsfigurehold ongrid onfor iCycle=1:3    rho=100*iCycle;    % Loads packet reception ratio output file    xMode2_periodic=load(outputFolder + "/packet_reception_ratio_"+num2str(iCycle)+"_5G.xls");    % PRR plot    % it takes the first column and the last column    plot(xMode2_periodic(:,1),xMode2_periodic(:,end),'linewidth',2.5,'displayName',"Mode2, periodic generation, vehicles/km=" + num2str(rho))end        legend()    title("NR-V2X, " + num2str(BandMHz) + "MHz, MCS=" + num2str(MCS))    legend('Location','southwest')    xlabel("Distance [m]")    ylabel("PRR")    yline(0.95,'HandleVisibility','off');⛄ 运行结果⛄ 参考文献G. Cecchini, A. Bazzi, B. M. Masini, A. Zanella, “LTEV2Vsim: An LTE-V2V Simulator for the Investigation of Resource Allocation for Cooperative Awareness”, 5th IEEE International Conference on Models and Technologies for Intelligent Transportation Systems (MT-ITS 2017), Naples (Italy), 26-28 June 2017. (Results obtained with version 1.0)A. Bazzi, G. Cecchini, M. Menarini, B. M. Masini, A. Zanella, “Survey and Perspectives of Vehicular Wi-Fi Versus Sidelink Cellular-V2X in the 5G Era,” invited paper in Future Internet, 29 May 2019, 11(6), 122. DOI: 10.3390/fi11060122 (Results obtained with version 3.5)⛄ 完整代码❤️部分理论引用网络文献,若有侵权联系博主删除❤️ 关注我领取海量matlab电子书和数学建模资料
文章
机器学习/深度学习  ·  传感器  ·  算法  ·  5G  ·  网络性能优化  ·  计算机视觉  ·  开发者
2023-01-29
1 2 3 4 5 6 7 8 9
...
20
跳转至:
人工智能
2793 人关注 | 11325 讨论 | 96812 内容
+ 订阅
  • 阿里云服务器配置这么选就对了!
  • 阿里云服务器配置推荐
  • 阿里云服务器CPU内存配置怎么选合适?
查看更多 >
IoT
122937 人关注 | 2888 讨论 | 23715 内容
+ 订阅
  • 基于Spring Boot框架的车库停车管理系统的设计与实现
  • 交易所开发推荐一些高级功能
  • 我的ECS使用体验报告
查看更多 >
安全
1190 人关注 | 23954 讨论 | 81138 内容
+ 订阅
  • 数据库入门到精通 ——视图与索引经典题(下)
  • 数据库入门到精通——数据库概述(上)
  • 金三银四系列:运维工程师面试题总结-linux核心基础01
查看更多 >
云计算
21781 人关注 | 59348 讨论 | 55690 内容
+ 订阅
  • 阿里云服务器配置这么选就对了!
  • 阿里云服务器配置推荐
  • 阿里云服务器CPU内存配置怎么选合适?
查看更多 >
大数据
188272 人关注 | 29193 讨论 | 80309 内容
+ 订阅
  • Longhorn+K8S+KubeSphere云端数据管理,实战 Sentry PostgreSQL 数据卷增量快照/备份与还原
  • WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
  • 数据库入门到精通——数据库概述(上)
查看更多 >