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

设计自己的网络通信协议

文章目录

  • 一、为什么需要设计网络通信协议
      • 1. **标准化通信规则**
      • 2. **确保数据传输的可靠性**
      • 3. **支持网络的多样性和可扩展性**
      • 4. **分层设计,简化复杂性**
      • 5. **实现设备的互操作性**
      • 6. **支持多任务和多应用并发**
      • 7. **提供安全性**
      • 8. **支持不同的通信模式**
      • 总结
  • 二、通信协议设计实战并且适配到TCP和UDP中
      • 通信协议设计
        • 协议字段描述
        • 数据结构定义
      • 功能实现
        • 1. **序列化函数**
        • 2. **反序列化函数**
        • 3. **CRC 校验计算函数**
        • 4. **TCP/UDP 适配**
      • 总结


一、为什么需要设计网络通信协议

设计网络通信协议是为了确保不同的设备、系统或应用能够通过网络进行可靠、规范化、无歧义的数据交换。网络通信协议的设计解决了数据传输中的复杂性和多样性,以下是具体的原因和作用:


1. 标准化通信规则

  • 问题:不同设备和系统可能使用不同的硬件、软件和操作方式。如果没有统一的规则,设备之间将无法理解对方发送的数据。
  • 解决方案:协议规定了如何发送数据(数据格式、编码方式)、如何接收数据(确认、重传机制)、如何处理错误等,确保所有参与通信的实体可以无缝协作。

2. 确保数据传输的可靠性

  • 问题:网络传输过程中可能出现数据丢失、重复、延迟或损坏。
  • 解决方案:通信协议通过错误检测(如校验和)、数据分片与重组、重传机制等方法,提高数据传输的可靠性,确保数据从发送方到接收方的完整性和一致性。

3. 支持网络的多样性和可扩展性

  • 问题:网络环境复杂多样,包括局域网(LAN)、广域网(WAN)、无线网络等,不同网络类型可能有不同的特性。
  • 解决方案:协议(如TCP/IP)抽象出通用规则,隐藏底层网络的差异性,提供统一的通信标准,使不同网络类型的设备能够互通。

4. 分层设计,简化复杂性

  • 问题:网络通信涉及多个层次的问题(如硬件连接、数据传输、应用通信),直接设计全功能的网络通信系统复杂且低效。
  • 解决方案:采用分层模型(如OSI模型或TCP/IP模型),将通信分为物理层、链路层、网络层、传输层、应用层等,每一层关注特定功能,便于开发、维护和扩展。

5. 实现设备的互操作性

  • 问题:现代网络由不同厂商的设备组成,如路由器、交换机、服务器和终端设备。如果没有统一的通信规则,它们无法协同工作。
  • 解决方案:协议定义了设备之间的通信规则,确保不同厂商的设备可以互操作,例如HTTP用于浏览器与服务器通信,SMTP用于电子邮件传输。

6. 支持多任务和多应用并发

  • 问题:网络上的设备需要同时处理多个任务,例如浏览网页、视频通话、文件下载等。
  • 解决方案:协议通过端口号、会话管理和流量控制机制,支持多任务和多应用的高效并发通信。

7. 提供安全性

  • 问题:网络通信容易受到攻击,如数据窃取、伪装、篡改等。
  • 解决方案:许多通信协议(如HTTPS、SSL/TLS)内置了加密、身份验证和完整性校验等机制,保护数据传输的安全性。

8. 支持不同的通信模式

  • 问题:网络通信可能是单向、双向、广播、组播等多种模式。
  • 解决方案:协议设计中支持多种通信模式,例如:
    • TCP:面向连接、可靠的双向通信。
    • UDP:无连接、快速的单向或多点通信。

总结

设计网络通信协议是为了建立一个标准化、可靠、安全的通信基础,使不同设备、系统和应用能够高效地协作和互通。通信协议是现代网络运行的核心,没有协议,全球互联网和数字通信将无法实现。

二、通信协议设计实战并且适配到TCP和UDP中

以下是一个使用 C语言 设计的通信协议,包含消息头部数据、数据类型、数据长度、数据主体以及 CRC 校验值。协议使用结构体封装,并设计了适用于 TCPUDP 的传输方式。


通信协议设计

协议字段描述
字段名称类型描述
Headeruint32_t消息头(标识协议类型或版本,固定值)。
Typeuint16_t数据类型(如文本、文件、命令等)。
Lengthuint32_t数据主体的长度(单位:字节)。
CRCuint32_tCRC 校验值,用于校验数据完整性。
Payloadchar[]数据主体(可变长度)。

数据结构定义
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h> // 用于字节序转换// 定义协议结构体
typedef struct {uint32_t header;    // 消息头uint16_t type;      // 数据类型uint32_t length;    // 数据长度uint32_t crc;       // CRC 校验值char payload[];     // 数据主体(可变长度)
} Packet;

功能实现

1. 序列化函数

将结构体转换为字节流以便通过网络传输。

// 序列化函数:将 Packet 结构体转为字节流
void* serializePacket(const Packet* packet, size_t* bufferSize) {*bufferSize = sizeof(Packet) + packet->length;void* buffer = malloc(*bufferSize);if (!buffer) {perror("Failed to allocate memory");return NULL;}char* ptr = buffer;// 写入头部数据,转为网络字节序uint32_t header_be = htonl(packet->header);memcpy(ptr, &header_be, sizeof(uint32_t));ptr += sizeof(uint32_t);// 写入数据类型,转为网络字节序uint16_t type_be = htons(packet->type);memcpy(ptr, &type_be, sizeof(uint16_t));ptr += sizeof(uint16_t);// 写入数据长度,转为网络字节序uint32_t length_be = htonl(packet->length);memcpy(ptr, &length_be, sizeof(uint32_t));ptr += sizeof(uint32_t);// 写入 CRC 校验值,转为网络字节序uint32_t crc_be = htonl(packet->crc);memcpy(ptr, &crc_be, sizeof(uint32_t));ptr += sizeof(uint32_t);// 写入数据主体memcpy(ptr, packet->payload, packet->length);return buffer;
}

2. 反序列化函数

将字节流还原为结构体。

// 反序列化函数:将字节流转回 Packet 结构体
Packet* deserializePacket(const void* buffer) {const char* ptr = buffer;// 读取头部数据Packet* packet = malloc(sizeof(Packet));if (!packet) {perror("Failed to allocate memory");return NULL;}memcpy(&packet->header, ptr, sizeof(uint32_t));packet->header = ntohl(packet->header);ptr += sizeof(uint32_t);// 读取数据类型memcpy(&packet->type, ptr, sizeof(uint16_t));packet->type = ntohs(packet->type);ptr += sizeof(uint16_t);// 读取数据长度memcpy(&packet->length, ptr, sizeof(uint32_t));packet->length = ntohl(packet->length);ptr += sizeof(uint32_t);// 读取 CRC 校验值memcpy(&packet->crc, ptr, sizeof(uint32_t));packet->crc = ntohl(packet->crc);ptr += sizeof(uint32_t);// 读取数据主体packet = realloc(packet, sizeof(Packet) + packet->length);if (!packet) {perror("Failed to reallocate memory");return NULL;}memcpy(packet->payload, ptr, packet->length);return packet;
}

3. CRC 校验计算函数

用于计算数据的 CRC 校验值。

uint32_t calculateCRC(const char* data, size_t length) {uint32_t crc = 0xFFFFFFFF;for (size_t i = 0; i < length; i++) {crc ^= (uint32_t)data[i];for (int j = 0; j < 8; j++) {if (crc & 1)crc = (crc >> 1) ^ 0xEDB88320; // CRC-32 标准多项式elsecrc >>= 1;}}return crc ^ 0xFFFFFFFF;
}

4. TCP/UDP 适配

此协议可以通过 TCP 和 UDP 使用。以下是发送和接收示例:

  • TCP 通信

    // 使用 serializePacket 和 send() 发送数据
    size_t bufferSize;
    void* buffer = serializePacket(packet, &bufferSize);
    send(socket_fd, buffer, bufferSize, 0);
    free(buffer);// 接收数据后反序列化
    recv(socket_fd, recvBuffer, recvBufferSize, 0);
    Packet* receivedPacket = deserializePacket(recvBuffer);
    
  • UDP 通信

    // 使用 serializePacket 和 sendto() 发送数据
    size_t bufferSize;
    void* buffer = serializePacket(packet, &bufferSize);
    sendto(socket_fd, buffer, bufferSize, 0, (struct sockaddr*)&dest, sizeof(dest));
    free(buffer);// 接收数据后反序列化
    recvfrom(socket_fd, recvBuffer, recvBufferSize, 0, NULL, NULL);
    Packet* receivedPacket = deserializePacket(recvBuffer);
    

总结

  • 结构体封装了协议的核心字段。
  • 序列化与反序列化函数保证了数据可以在网络上传输和接收。
  • CRC 校验函数增强了数据的完整性校验。
  • TCP 和 UDP 的兼容性通过通用接口实现。此协议既适用于可靠的流式传输(TCP),也适用于快速的无连接传输(UDP)。

相关文章:

设计自己的网络通信协议

文章目录 一、为什么需要设计网络通信协议1. **标准化通信规则**2. **确保数据传输的可靠性**3. **支持网络的多样性和可扩展性**4. **分层设计&#xff0c;简化复杂性**5. **实现设备的互操作性**6. **支持多任务和多应用并发**7. **提供安全性**8. **支持不同的通信模式**总结…...

深入理解 Seata:分布式事务的最佳解决方案

随着微服务架构的广泛应用&#xff0c;分布式事务管理成为系统设计中一项重要且极具挑战的任务。在微服务架构下&#xff0c;服务之间通过网络调用&#xff0c;单个业务操作往往需要多个服务的协作来完成&#xff0c;这样分布式事务的问题就不可避免。Seata 是目前较为流行的一…...

JDK下载

jdk-8u421-windows-x64.exe : 阿里云盘 jdk-7u80-windows-x64.exe &#xff1a;阿里云盘...

如何使用 Python 开发一个简单的文本数据转换为 Excel 工具

目录 一、准备工作 二、理解文本数据格式 三、开发文本数据转换为Excel工具 读取CSV文件 将DataFrame写入Excel文件 处理其他格式的文本数据 读取纯文本文件: 读取TSV文件: 四、完整代码与工具封装 五、使用工具 六、总结 在数据分析和处理的日常工作中,我们经常…...

React(六)——Redux

文章目录 项目地址基本理解一、配置Redux store二、创建slice配置到store里并使用三、给Slice配置reducers&#xff0c;用来修改初始值 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow基本理解 s…...

java抽奖系统(二)

3. 新建项目 3.1 选择相应的框架 pom文件配置如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:s…...

STM32F10x 定时器

使用定时器实现&#xff1a;B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…...

从0开始学PHP面向对象内容之常用设计模式(适配器,桥接,装饰器)

二&#xff0c;结构型设计模式 上两期咱们讲了创建型设计模式&#xff0c;都有 单例模式&#xff0c;工厂模式&#xff0c;抽象工厂模式&#xff0c;建造者模式&#xff0c;原型模式五个设计模式。 这期咱们讲结构型设计模式 1、适配器模式&#xff08;Adapter&#xff09; …...

玩转数字与运算:用C语言实现24点游戏的扑克牌魅力

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

前端入门之VUE--基础与核心

前言 VUE是前端用的最多的框架&#xff1b;这篇文章是本人大一上学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 Vue学习笔记 用于构建用户界面的渐进式框架 构建用户界面&#xff1a;基于数据动态渲染页面渐进式&#xff1a;循序渐近的学…...

logback 初探学习

logback 三大模块 记录器&#xff08;Logger&#xff09;、追加器&#xff08;Appender&#xff09;和布局&#xff08;Layout&#xff09; 配置文件外层最基本的标签如图示 xml中定义的就是这个三个东西下面进入学习 包引入参考springboot 官方文档 Logging :: Spring Boo…...

在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?

大家好&#xff0c;我是锋哥。今天分享关于【在Elasticsearch中&#xff0c;是怎么根据一个词找到对应的倒排索引的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 在Elasticsearch中&#xff0c;是怎么根据一个词找到对应的倒排索引的&#xff1f; 在 Elasticsearch 中…...

1992-2021年 各省市县经过矫正的夜间灯光数据(GNLD、VIIRS)区域汇总:省份、城市、区县面板数据

1992-2021年 各省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09;区域汇总&#xff1a;省份、城市、区县面板数据 .r.rar https://download.csdn.net/download/2401_84585615/90001905 从1992年至2021年&#xff0c;中国各省份、城市及区县的夜间灯光数据经过…...

linux实战-黑链——玄机靶场

黑链的特征&#xff1a; 隐藏链接&#xff1a;黑链通常隐藏在网站页面中&#xff0c;使用CSS、JavaScript或其他手段使其对普通用户不可见&#xff0c;但仍然能被搜索引擎爬虫检测到。恶意内容&#xff1a;这些链接指向的内容可能包含恶意软件、钓鱼页面或其他不良内容&#x…...

鸿蒙NEXT开发案例:字数统计

【引言】 本文将通过一个具体的案例——“字数统计”组件&#xff0c;来探讨如何在鸿蒙NEXT框架下实现这一功能。此组件不仅能够统计用户输入文本中的汉字、中文标点、数字、以及英文字符的数量&#xff0c;还具有良好的用户界面设计&#xff0c;使用户能够直观地了解输入文本…...

uniapp vue2项目迁移vue3项目

uniapp vue2项目迁移vue3项目&#xff0c;必须适配的部分 一、main.js 创建应用实例 // 之前 - Vue 2 import Vue from vue import App from ./App Vue.config.productionTip false // vue3 不再需要 App.mpType app // vue3 不再需要 const app new Vue({ ...App }) …...

16.C++STL 3(string类的模拟,深浅拷贝问题)

⭐本篇重点&#xff1a;string类的模拟&#xff0c;自己实现一个简单的string类 ⭐本篇代码&#xff1a;c学习/05.string类的学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. 经典string类的模拟 1.1 深浅拷贝问题 1.2 使用深拷贝完成经典string类的…...

神经网络10-Temporal Fusion Transformer (TFT)

Temporal Fusion Transformer (TFT) 是一种专为时序数据建模而设计的深度学习模型&#xff0c;它结合了Transformer架构和其他技术&#xff0c;旨在有效地处理和预测时序数据中的复杂模式。TFT 于 2020 年由 Google Research 提出&#xff0c;旨在解决传统模型在时序预测中的一…...

“iOS profile文件与私钥证书文件不匹配”总结打ipa包出现的问题

目录 文件和证书未加载或特殊字符问题 证书过期或Profile文件错误 确认开发者证书和私钥是否匹配 创建证书选择错误问题 申请苹果 AppId时勾选服务不全问题 ​总结 在上线ios平台的时候&#xff0c;在Hbuilder中打包遇见了问题&#xff0c;生成ipa文件时候&#xff0c;一…...

《图像梯度与常见算子全解析:原理、用法及效果展示》

简介:本文深入探讨图像梯度相关知识&#xff0c;详细介绍图像梯度是像素灰度值在不同方向的变化速度&#xff0c;并以 “pig.JPG” 图像为例&#xff0c;通过代码展示如何选取图像部分区域并分析其像素值以论证图像梯度与边缘信息的关联。接着全面阐述了 Sobel 算子&#xff0c…...

开发多语言翻译服务时借助Taotoken调用专用模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 开发多语言翻译服务时借助Taotoken调用专用模型 设想这样一个场景&#xff1a;你的团队正在开发一个内容平台或国际化应用&#xf…...

QMC音频解密终极指南:如何快速无损转换QQ音乐加密文件

QMC音频解密终极指南&#xff1a;如何快速无损转换QQ音乐加密文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经下载了QQ音乐平台的歌曲&#xff0c;却发现只能…...

Windows 11硬件限制绕过终极指南:3种实用方法让老电脑轻松升级

Windows 11硬件限制绕过终极指南&#xff1a;3种实用方法让老电脑轻松升级 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...

差分隐私下机器学习模型预处理完整性验证框架设计与实践

1. 项目概述&#xff1a;当模型审计遇上隐私保护在金融风控、医疗诊断这些对数据隐私和模型可靠性要求极高的领域&#xff0c;我们常常面临一个两难困境。一方面&#xff0c;一个机器学习模型在上线前&#xff0c;必须确保其训练流程是合规且完整的&#xff0c;尤其是数据预处理…...

鲸震恩!DeepSeek V4 价格永久“打骨折”,网友疯狂“表白”:梁圣的恩情还不完

①2026 年 5 月 22 日 20:36&#xff0c;DeepSeek 官宣&#xff0c;deepseek-v4-pro 模型 API 价格将于北京时间 2026/05/31 23:59 结束 2.5 折优惠活动后&#xff0c;正式调整为原定价的 1/4。也就是说&#xff0c;从 6 月 1 日起当前 2.5 折直接变成常态价了。在上次&#xf…...

自动驾驶、机器人导航都在用:实战调参卡尔曼滤波的Q和R(Python/OpenCV示例)

自动驾驶与机器人导航中的卡尔曼滤波实战&#xff1a;Q和R参数调优指南卡尔曼滤波在状态估计领域就像一位不知疲倦的裁判&#xff0c;不断在系统预测和传感器测量之间寻找平衡点。而Q&#xff08;过程噪声协方差&#xff09;和R&#xff08;测量噪声协方差&#xff09;这两个关…...

AI Agent记忆方案大比拼:RAG、Mem0、Zep、Letta怎么选?告别选型迷茫!

本文综述了多种AI Agent记忆方案&#xff0c;包括RAG、Mem0、Zep、Letta、LangMem等&#xff0c;并分析了它们各自的适用场景和优缺点。文章指出&#xff0c;选择合适的记忆方案需要根据具体应用场景来确定&#xff0c;如RAG适合知识库检索&#xff0c;Mem0适合跨会话个性化&am…...

基于Graphlet的网络嵌入:从局部结构到生物功能模块发现

1. 项目概述&#xff1a;为什么我们需要更“精细”的网络嵌入&#xff1f;在网络科学和机器学习交叉的领域里&#xff0c;网络嵌入&#xff08;Network Embedding&#xff09;或者说图表示学习&#xff08;Graph Representation Learning&#xff09;&#xff0c;已经从一个前沿…...

[智能体-36]:借系统之势,成个人之才——从AI协同逻辑悟职业选择之道

大模型智能体可调用专业工具所展现出来的强大能力表明&#xff1a;大模型个人的能力再强&#xff0c;没有好的管理调度系统和外部执行层的支持&#xff0c;理论水平再博大精深&#xff0c;也只是缸中之脑&#xff0c;空中楼阁&#xff0c;停留在嘴上吹牛&#xff0c;无法有效执…...

CentOS7最小化安装后,这3个必做的配置(换源、设静态IP、更新)一个都不能少

CentOS7最小化安装后的三大关键配置实战指南刚完成CentOS 7最小化安装的系统就像毛坯房——虽然基础框架已经就位&#xff0c;但距离真正"拎包入住"还有一段距离。作为运维人员&#xff0c;我们最迫切的需求是快速搭建一个稳定、高效的基础服务器环境。本文将聚焦三个…...