从零自定义网络协议:应用层协议设计与数据格式选型

对网络协议栈(HTTP/HTTPS/TCP)的理解 阅读详情

在前文的网络初识一文中我们知道,在 TCP/IP 五层协议中,应用层是我们程序员打交道最多的层次。我们程序员写的代码,只要涉及到网络通信,都可以视为应用层的一部分。应用层涉及到的网络通信协议,很多也都是程序员自定义的。

那么,我们要如何自定义一个网络通信协议呢?以下,我们就来聊聊这个话题

一. 自定义协议的步骤

1.根据需求,明确要传输的信息

我们在自定义一个网络通信协议时,第一步就是要思考我们要通过这个协议传输哪些信息。

就以外卖软件为例,当我们作为一个客户端去搜索我们周围的外卖商家时,我们这个搜索的行为会向服务器传输哪些信息呢?经过思考我们可以知道,我们这个请求可能传输的信息有:我们的位置信息(用来检索周围商家)、我们的用户id(确定是我们这个用户下的单)等信息

在接收到我们这个请求时,服务器也会做出相对应的响应。那么,这个响应中又可能传输有哪些信息呢?经过思考我们不难得知,可能传输的信息有:商家id、商家名称、商家评分、配送费用和商品类型分类等等。当然,这个响应中也可能包含有多个商家信息

2. 根据要传输的信息,约定好组织信息的格式

在我们知道了要传输的信息有哪些了之后,我们就要去思考应该用什么格式去组织这些信息。在网络编程中有很多方式来去组织信息,接下来我们就来介绍一些常见的组织方式

2.1 行文本的方式组织信息

仅由文字、换行、空格等基础字符构成,靠换行区分各行内容,是最简单原始的信息存储载体

例如上面的外卖例子用行文本的方式进行组织信息,结果就可能如下所示

商家id,商家名称,商家图片,商家评分,配送费用,商品类型\n

商家id,商家名称,商家图片,商家评分,配送费用,商品类型\n

...................

商家id,商家名称,商家图片,商家评分,配送费用,商品类型\n

\n

这就是通过行文本的方式来组织信息时可能出现的结果

注:在行文本信息中最后一行是 “ 空行 ”,用来区分不同的行文本数据

2.2 通过 xml 格式来约定 请求和响应 的数据

xml 和 html 类似(HTML 是“网页展示语言”,不是“通用数据交换格式”,在本文不予展示),都是由成对的标签构成的键值对结构。但二者也有不同点,就是 html 的标签的内容都是已经固定好的,你不能使用或创造不存在的标签(在 html5 中已经允许自定义标签),而 在 xml 中的标签内容则是自定义的

例如上面的外卖例子用行文本的方式进行组织信息,结果就可能如下所示

<shopList>

        <shop>

                <shopId>1001</shopId>

                <shopName>川味麻辣烫</shopName>

                <score>4.7</score>

                <deliveryFee>3</deliveryFee>

                <goodsType>麻辣烫、小吃</goodsType>

        </shop>

        <shop>

                <shopId>1002</shopId>

                <shopName>鲜榨果茶</shopName>

                <score>4.9</score>

                <deliveryFee>2</deliveryFee>

                <goodsType>奶茶、甜品</goodsType>

        </shop>

        <shop>

                <shopId>1003</shopId>         

                <shopName>家常小炒馆</shopName>

                <score>4.5</score>

                <deliveryFee>0</deliveryFee>

                <goodsType>中餐、盖饭</goodsType>

        </shop>

</shopList>

优点:可读性强

缺点:存在大量的冗余信息,在网络传输中会消耗更多的带宽

2.3 json 格式 组织信息

由于在 xml 方式中存在有很多重复的标签信息,这也带来了更多的带宽消耗。为了节省带宽,大佬们又发明了 json 这个组织信息的格式

json 格式:使用 大括号{} 包裹对象,键值对存储信息,中括号[] 存放数组,数据层级清晰,仅用逗号分隔内容,无多余标记

[

        {

                "shopId": 1001,

                "shopName": "川味麻辣烫",

                "score": 4.7, 

                "deliveryFee": 3,

                "goodsType": "麻辣烫、小吃"         

        },

        {         

                "shopId": 1002,         

                "shopName": "鲜榨果茶",         

                "score": 4.9,

                "deliveryFee": 2,         

                "goodsType": "奶茶、甜品"

        },

        {

                "shopId": 1003,

                "shopName": "家常小炒馆",

                "score": 4.5,

                "deliveryFee": 0,

                "goodsType": "中餐、盖饭"

        }

]

优点:可读性比较强,消耗的带宽也比 xml 少

缺点:还是存在冗余信息

2.4 protobuf 格式 组织信息

protobuf 组织信息的格式 是基于二进制的格式对数据进行压缩,这也就不会涉及到上文的 xml 、json 格式 中所存在的冗余信息了。所以,protobuf 格式 消耗的带宽是最少的,为了达到这个效果,由 protobuf 格式 组织的信息的可读性就变差了(适用于高性能场景下的使用)。

四种信息组织格式的优缺点如下图所示

在应用层中,除了我们自定义的协议之外,也有着一些大佬做出的通用的协议,比如:

FTP 文件传输协议、SSH 远程操作主机协议、telnet 网络调试工具协议 和 HTTP 协议等待

自定义一个网络通信协议,本质上就两步:先明确要传输哪些信息,再约定用什么格式组织这些信息。信息决定了协议能表达什么,格式决定了传输效率和解析难度。在本文中介绍的四种信息组织格式各有取舍,所以,格式选型没有绝对的好坏,只有是否适合当前业务。内部服务、高并发场景可以优先考虑 Protobuf;前后端交互、调试频繁的场景用 JSON 更合适;配置文件、老系统兼容可以选 XML;而临时测试、极简协议用行文本就够了。

另外,HTML 虽然也能组织信息,但它的标签是固定的,且包含大量展示逻辑,更适合网页渲染,不适合作为通用的数据传输格式。

理解了应用层协议的设计思路后,下一篇我们将进入最常用的应用层协议——HTTP协议,看看它是如何规定请求与响应的报文格式的

5分钟上手Wireshark Lua脚本,快速解析自定义网络协议 在网络协议分析领域,协议解析是将原始二进制数据转换为可读信息的关键技术。其核心原理是通过定义数据结构与字段映射,实现数据包的结构化解读。这项技术对于网络调试、安全分析和性能优化具有重要价值,广泛应用于物联网设备通信、私有协议调试等场景。借助Wireshark的Lua脚本支持,开发者无需编译C插件,即可快速为自定义协议创建解析器(Dissector),实现私有协议或专有数据格式的可视化分析。本文以实际工程实践为例,演示如何通过Lua脚本快速构建协议解析器,并融入字段映射和TCP流处理等热词技术,显著提升网络数 阅读详情

相关推荐

HCIP面试官最爱问的20个网络协议问题,附详细解析与避坑指南

本文详细解析了HCIP认证面试中最常见的20个网络协议问题,包括OSI七层模型、TCP/UDP对比、三次握手原理等核心内容,并提供专业回答框架与避坑指南。特别针对HCIP考生需求,深入剖析协议设计原理、实战排障技巧及最新技术演进,帮助考生在面试中展现专业深度与技术前瞻性。

weixin_31742871的博客 243

OSI参考模型实战解析:从理论到网络协议设计

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94959840的博客 792

命令行微信客户端开发:协议逆向与CLI工具设计实践

命令行界面(CLI)作为高效、可脚本化的交互方式,在开发运维领域始终占据重要地位。其核心原理在于通过文本命令与系统或服务进行通信,无需图形界面即可完成复杂操作。这种技术价值体现在自动化、远程操作和资源节约等多个维度,广泛应用于服务器管理、持续集成和DevOps工作流等场景。以微信为代表的即时通讯工具,其协议逆向工程成为连接CLI与社交生态的关键技术点。通过分析网络请求、模拟登录流程和维持会话状态,开发者能够构建出如wechat-cli这样的第三方客户端。这类项目不仅实现了在终端内收发消息、管理联系人的基础功

weixin_33675507的博客 546

Java EE:8.网络原理- TCP / IP(第一弹):应用层+传输层-UDP 协议

Java EE:8.网络原理- TCP / IP(第一弹):应用层+传输层-UDP 协议

要努力去发光,而不是被照亮~ 3371

嵌入式开发必知:12种核心通信协议详解与实战选型指南

通信协议是嵌入式系统中实现芯片、传感器与模块间数据交换的基础规则与通用语言。其核心原理在于定义数据传输的时序、格式、电气特性和寻址方式,以确保信息在硬件间的可靠传递。掌握各类协议的技术价值在于能够根据项目需求,在性能、成本、可靠性和复杂度之间做出最佳权衡,从而构建高效稳定的嵌入式系统。在应用场景上,从简单的传感器数据采集到复杂的车载网络或工业物联网,协议的选择直接决定了系统的能力边界。本文聚焦于嵌入式领域最核心的UART、I2C、SPI、CAN等12种通信协议,通过对比其硬件连接、数据格式与典型应用,并结合

weixin_33978044的博客 469

三相SVPWM逆变器双闭环PI解耦控制:从dq坐标系到参数整定实战

本文深入解析了三相SVPWM逆变器的双闭环PI解耦控制技术。通过引入dq坐标系,将交流量转换为直流量,并结合前馈补偿实现电流环的解耦控制。文章详细阐述了从数学模型推导、控制器设计到参数整定与SVPWM实现的完整流程,为工程师提供了从理论到实战的系统性指导。

weixin_28292761的博客 405

OSI 七层 / TCP/IP 四层模型详解 + HTTP 与 WebSocket 接口分类:从协议本质 到 设计规范

OSI 七层 / TCP/IP 四层模型详解 + HTTP 与 WebSocket 接口分类:从协议本质、适用场景到设计规范

专注实用知识分享的一个务实的技术博客,聚焦 python等领域的干货分享 1374

智能车竞赛走马观碑组:如何高效识别目标板并优化绕行策略(附实战代码)

本文深入探讨了智能车竞赛走马观碑组中,如何构建从图像识别到路径决策的全栈优化方案。针对目标板识别与绕行策略的核心难点,文章详细解析了基于MobileNetV2的高效识别流水线、结合预瞄点与纯追踪算法的平滑路径规划,以及横向与纵向协同控制策略,并提供了实战代码与调试指南,旨在全面提升小车的比赛表现。

o5p6q的博客 884

STM32嵌入式网络协议栈实现与优化指南

TCP/IP协议栈是嵌入式系统实现网络通信的核心技术框架,其分层结构包括应用层、传输层、网络层和链路层。在资源受限的嵌入式环境中,精简协议栈如RL-TCPnet和lwIP通过模块化设计优化内存使用,仅保留必要的协议支持。这些协议栈通过固定内存块分配和优化的定时器系统,显著降低了RAM和CPU资源消耗。在STM32等微控制器上,合理配置TCP窗口大小和ARP缓存时间等参数,可以进一步提升网络性能。典型应用场景包括工业控制器的Modbus TCP通信和物联网设备的MQTT协议实现,其中硬件设计需特别注意PHY芯

weixin_29174385的博客 267

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 414

LangChain入门(二)-通过 Google 搜索并返回答案

并复制他给我们生成 api key。(博主使用了GitHub账号登录)-邮箱验证-手机号验证-订阅-api-key。Serpapi 提供了 google 搜索的 api 接口。首先需要我们到 Serpapi 官网上注册一个用户,

Good Luck 1万+

HoRain云--SOAP vs HTTP:全面解析两大协议的核心差异与应用场景

SOAP(简单对象访问协议)是一种基于XML的通信协议,专为分布式系统中的结构化信息交换设计。它通过四个核心组件​封装:定义消息结构及处理规则​编码规则:实现数据类型的序列化​RPC表示:规范远程调用与响应机制​协议绑定:支持HTTP/TCP/UDP等底层协议-- 可选头部信息 --></soapenv:Header>-- 方法参数 --></req:methodName>

2401_86544677的博客 808

避坑指南:STM32F4的ADC采样FSR传感器,如何稳定读数并校准压力值?

本文详细解析了STM32F4的ADC采样FSR薄膜压力传感器时遇到的读数不稳定和非线性校准问题,提供了从硬件配置到软件滤波的完整解决方案。通过优化ADC设置、改进滤波算法和实施分段线性校准,帮助工程师实现高精度压力测量,特别适用于智能手套和医疗监测等应用场景。

weixin_28675839的博客 273

嵌入式网络调试全链路实战:从MCU串口到网络协议分析

在嵌入式系统开发中,网络连接调试是确保物联网设备、工业控制器等边缘节点可靠通信的关键环节。其核心原理在于采用分层诊断思想,遵循从物理层到应用层的OSI模型逐层排查。这一方法的技术价值在于能够系统化地定位网络故障根源,提升开发与维护效率。实际应用中,工程师需要结合串口调试与网络协议分析两大技术手段:串口调试用于监控MCU与通信模组间的AT指令交互,确保底层链路畅通;网络协议分析则借助Wireshark等工具捕获并解析数据包,诊断IP连接、端口通信等上层问题。通过构建串口数据代理和运用数据过滤技术,开发者可以透

weixin_34068198的博客 379

DaVinci Configurator BswM模块配置

BswM是AUTOSAR(Automotive Open System Architecture)系统架构中的模块之一,它是基础软件模块(BSW)之一。BswM全称为Basic Software Module Manager(基础软件模块管理器),它负责管理和协调其他BSW模块的行为和交互,以实现整个系统的功能。BswM可以被看作是一个状态机,通过监控系统的状态和事件触发,来控制其他BSW模块的运行状态和互相配合,以达到整个系统的预期行为。

qq_59258431的博客 3947

jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3)

目录前言将income 作为loss(优化目标)读取数据,定义优化目标模型训练与微调提交结果多目标学习Topline整理AE+MLP (rank10)Current 17th solution: Ensembles of deep (49 layer) MLPsmixup augmentation: a way to learn from trades with weight=0 (rank4)My (perhaps) over-complicated LSTM solutionCurrent 62nd .

weixin_51484067的博客 2640

游戏开发 —— 协议设计

点击上方“芋道源码”,选择“置顶公众号”技术文章第一时间送达!源码精品专栏 精尽 Dubbo 原理与源码专栏( 已经完成 69+ 篇,预计总共 75+ 篇 )中文详细注释...

芋道源码 713

YOLO26改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 212

游戏开发—协议设计

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34195364的博客 468

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

网络协议栈解析:从OSI七层到TCP/IP实战

网络协议栈是计算机通信的基石,通过分层架构实现异构系统的互联互通。OSI七层模型从物理层到应用层定义了完整的通信框架,而TCP/IP四层模型则成为互联网的实际标准。分层设计的核心价值在于模块化开发、故障隔离和技术演进,例如TCP通过三次握手和滑动窗口机制保障可靠传输,UDP则凭借无连接特性满足实时性要求。在视频直播、金融交易等不同场景中,工程师需要根据数据敏感性、实时性等维度选择TCP或UDP协议。随着QUIC、BBR等新技术的发展,协议栈持续优化着传输效率与可靠性。

weixin_33404102的博客 213

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

应用层协议实战指南:从HTTP、HTTPS到序列化与反序列化

在计算机网络中,应用层协议是网络通信的基石,它定义了数据交换的语法、语义与时序。理解HTTP、HTTPS以及序列化与反序列化机制,是后端开发、接口联调和网络排障的核心能力。HTTP作为最广泛的应用层协议,其报文结构、状态码、连接管理直接影响系统性能与稳定性;HTTPS通过TLS混合加密、证书链验证保障数据传输的机密性与完整性。而序列化技术则在跨语言、跨平台的数据交换中扮演关键角色,JSON、Protobuf等格式各有适用场景与坑点。掌握协议原理与实际排查技巧,能帮助开发者快速定位接口超时、报文乱码、证书错误

WGH100817的博客 347

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C语言位域深度解析:从内存布局到网络协议实战

C语言中的位域(bit-field)是描述按比特定义的数据结构的天然语法,用于将结构体成员精确映射到二进制位,例如Linux内核中TCP/IP头部的标志位声明。理解位域的内存分配规则、字节序依赖与编译器实现差异,是避免结构体布局错位、跨平台解析异常的关键。通过实测GCC下的内存布局,可以清晰看到存储单元划分、填充与packed属性的影响。在网络协议解析场景中,位域常因字节序问题而引发Bug,正确的做法是先通过位运算将网络字节序转换为主机序,再交由位域读取标志位。本文结合TCP头、ICMPv6邻居通告等实例,

weixin_34133829的博客 241

物联网(IoT)智能项目全景指南:技术构架、实现细节与应用实践

物联网(IoT)智能项目全景指南。

D1557329860的博客 1496

各种网关协议深度对比分析

网关协议是运行在网络网关设备(如路由器、防火墙、API网关服务器)​​协议转换​:将源网络的协议数据(如MQTT的发布/订阅消息)转换为目标网络可识别的格式(如HTTP的RESTful请求);​地址映射​:处理不同网络地址空间的差异(如私有IP与公网IP的NAT转换);​流量控制与安全过滤​:对跨网络流量进行速率限制、身份认证、加密传输等操作。​协议类型​​代表协议​​传输效率​​可靠性​​安全性​​适用网络环境​​典型应用场景​​传输层基础协议​TCP中等(可靠)高。

qq_39980997的博客 1367
上一篇: Java虚拟机——JVM 简介
下一篇: HTTP 协议详解:从抓包实战到报文格式、请求头与状态码全解析
七星-落凡
博客等级 码龄1年 24粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值