【TCP/IP】自定义应用层协议,常见端口号
互联网中,主流的是 TCP/IP 五层协议
- 5G/4G 上网,是有自己的协议栈,要比 TCP/IP 更复杂(能够把 TCP/IP 的一部分内容给包含进去了)
应用层
可以代表我们所编写的应用程序,只要应用程序里面用到了网络通信,就可以认为这个代码就是属于应用层的代码
日常开发中最常用到的一层:
- 使用大佬们已经创建好的应用层协议
- 应用层知名的协议有很多,其中的佼佼者就是
HTTP
- 应用层知名的协议有很多,其中的佼佼者就是
- 自己定义应用层协议
- 另外四层都是操作系统/硬件/驱动已经实现好了的,我们不可能“自定义”,只能使用人家的
协议就是约定
- 按照自己的规则,约定通讯方式——>自定义应用层协议
自定义应用层协议
自定义应用层协议,具体要做什么事情:
明确要传递的信息
- 明确前后端交货过程中,要传递哪些信息
举个例子:开发一个外卖软件,打开软件后,首先需要展示一个“商家列表”
此处就需要先确定传递的信息是什么
- 请求:用户是谁(用户的 ID),用户所处的位置
- 响应:商家列表,包含多个商家,每个商家信息中,又有商家的名字、图片、距离、评分
这里的信息如何确定,都是根据当前的需求来产生的
明确组织信息的格式
- 明确组织这些信息的格式
针对信息组织格式,也有很多种方式,使用哪种方方式都可以,只要确定前段和后端是同一种方式就可以了
举个例子:使用行文本的方式来组织上述数据
- 请求:
用户id,用户位置\n- 响应:
商家的id,商家名称,商家的图片地址,商家的距离,商家的评分\n
关于组织数据的格式,还有一些说法,上述“行文本”简单粗暴的方案,在实际开发中,很少会这样做
XML 方案
Maven 中就会见到,通过“成对的标签”表示“键值对”信息
<request><userid>1001</userid><postion>E45N60</postion>
</request>
- 可以通过
XML来传输网络数据,也可以作为程序的配置文件 - 不过
XML进行网络传输的时候,又有一个明显的缺点——会消耗大量的带宽- 网络通信中,带宽是一个非常贵的硬件设备
- 在传输标签的时候,都得传输成对的标签,传入的信息更多
- 所以现在
XMl一般都是在配置文件,不进行网络传输了 XMl里面的标签(键值对)都是程序员固定的,而HTMl里面的标签都是固定的(已经有一套标准,约定好哪些标签是合法标签,这些标签都是什么含义)
JSON 方案
当前主流的网络通信的数据格式,相比 xml 来说,可读性是很好的,同时能节省一定的带宽
{"userid":1001,"postion":""E45N60"
}
JSON也是“键值对”格式,- 键和值之间用
:分割 - 键值对之间用
,分割 - 所有的键值对,都使用
{}括起来
- 键和值之间用
- 这里的标签都只有一份,不需要结束标签了,节省了传递开销
YML(YAML)方案
强制要求了数据组织的格式,强制要求写成“可读性非常高”的格式
- 键值对必须独占一行
- “嵌套”结构必须通过缩进来表示
protobuffer方案
前三个方案,都是关注可读性,而 protobuffer 关注性能,牺牲了可读性(通过二进制的方式组织数据)
- protobuffer 直接通过“位置”约定字段的含义,不需要传输 key 的名字,也会针对传输的数值,进行二进制的编码,起到一些“压缩”的效果
- 极大地缩减了要传输的数据的体积——>带宽消耗就越小——>效率越高
- 但二进制数据无法肉眼阅读,调试相关程序的时候,就会比较麻烦
常见端口号
端口号是一个整数,用来区分不同的进程。
- 同一时刻,同一个机器上,同一个协议,一个端口号只能被一个进绑定
- 一个进程可以绑定多个端口号
- 端口号是通过两个字节的无符号整数表示的,取值范围 0~65535,但实际上 0 比较特殊,一般不会使用
- 1~1023 属于已经被预定好的(有一些知名的服务器,已经提前预定了这个端口),这样的端口称为“知名端口号”(其实里面的大部分服务器已经不再使用了,在 80、90 年代是知名的)
- 我们日常开发的时候,会避开这些端口
业务端口和管理端口
什么时候会涉及到一个进程(服务器)绑定多个端口?
- 编写服务器,肯定需要先绑定至少一个端口号,和客户端进行交互(称为“业务端口”)
- 服务器运行过程中,希望能够对这个服务器的行为,进行一些“控制”
- 比如让服务器重新加载某个数据/某个配置/修改服务器的某个功能
- 也可以通过网络通信完成上述功能
- 就可以让服务器绑定另一个端口,通过这个端口,编写一个客户端,给服务器发送一些“控制类“请求
- 上面的“另一个端口”就是“管理端口“
调试端口
当需要针对服务器运行状态进行检测和调试,需要查看服务器运行中某个关键变量的数值的时候,千万不能用调试器来进行调试,一旦使用调试器调试这个服务,就会使服务器的一些线程被阻塞住,无法给客户端正确提供服务了
- 虽然可以通过日志进行打印,但是不方便,需要修改代码并重启服务器
- 可以让服务器绑定另一个端口,然后实现一些相关的打印关键变量的逻辑,客户端发送对应的调试请求
- 这里的“另一个端口”就是“调试端口”
相关文章:
【TCP/IP】自定义应用层协议,常见端口号
互联网中,主流的是 TCP/IP 五层协议 5G/4G 上网,是有自己的协议栈,要比 TCP/IP 更复杂(能够把 TCP/IP 的一部分内容给包含进去了) 应用层 可以代表我们所编写的应用程序,只要应用程序里面用到了网络通信…...
Frida 的下载和安装
首先要安装好 python 环境 安装 frida 和 工具包 pip install frida frida-tools 查看版本: frida --version 16.4.8 然后到 github 上下载对应 server ( 和frida 的版本一致 16.4.8) Releases frida/frida (github.com) 查看手机或…...
后端开发刷题 | 链表内指定区间反转【链表篇】
描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)。 例如: 给出的链表为 1→2→3→4→5→NULL1→2→3→4→5→NULL, m2,n4 返回 1→4→3→2→5→NULL 数据范围: 链表…...
【NVMe系列-提问页与文章总结页面】
NVMe系列-提问页与文章总结页面 问题汇总NVMe协议是什么?PRP 与 PRP List是做什么的? 已写文章汇总 问题汇总 NVMe协议是什么? PRP 与 PRP List是做什么的? 已写文章汇总...
用生成器函数生成表单各字段
生成器函数生成表单字段是非常合适的用法,避免你要用纯javascript做后台时频繁的制作表单,而不能重复利用 //这里是javascript部分,formfiled.js //生成器函数对字段的处理,让各字段name\className\label\value\placeholder赋值到input的属性…...
【xilinx】O-RAN 无线电接口 - Vivado 2020.1 及更新工具版本的发行说明
描述 记录包含 O-RAN 无线电接口 LogiCORE IP 的发行说明和已知问题,包括以下内容: 一般信息已知和已解决的问题 解决方案 一般信息 可以在以下三个位置找到支持的设备: O-RAN 无线电接口 IP 产品指南(需要访问O-RAN 安全站点&…...
结营考试- 算法进阶营地 - DAY11
结营考试 - 算法进阶营地 - DAY11 测评链接; A - 打卡题 考点:枚举; 分析 枚举 a _①_ b _②_ c d,中两个运算符的 3 3 3 种可能性,尝试寻找一种符合要求的答案。 参考代码 #include <bits/stdc.h> usi…...
设计模式: 访问者模式
文章目录 一、介绍二、模式结构三、优缺点1、优点2、缺点 四、应用场景 一、介绍 Visitor 模式(访问者模式)是一种行为设计模式,它允许在不修改对象结构的前提下,增加作用于一组对象上新的操作。就增加新的操作而言,V…...
selenium底层原理详解
目录 1、selenium版本的演变 1.1、Selenium 1.x(Selenium RC时代) 1.2、Selenium 2.x(WebDriver整合时代) 1.3、Selenium 3.x 2、selenium原理说明 3、源码说明 3.1、启动webdriver服务建立连接 3.2、发送操作 1、seleni…...
【Solidity】继承
继承 Solidity 中使用 is 关键字实现继承: contract Father {function getNumber() public pure returns (uint) {return 10;}function getNumber2() public pure virtual returns (uint) {return 20;} }contract Son is Father {}现在 Son 就可以调用 Father 的 …...
docker 安装mino服务,启动报错: Fatal glibc error: CPU does not support x86-64-v2
背景 docker 安装mino服务,启动报错: Fatal glibc error: CPU does not support x86-64-v2 原因 Docker 镜像中的 glibc 版本要求 CPU 支持 x86-64-v2 指令集,而你的硬件不支持。 解决办法 降低minio对应的镜像版本 经过验证:qu…...
地图相册系统的设计与实现
摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…...
使用vh和rem实现元素响应式布局
示例代码 height: calc(100vh 30rem) vh(Viewport Height):vh是一个相对单位,代表浏览器窗口高度的百分比,例如20vh就是浏览器窗口高度的20%。 rem(root em):rem是通过html根元素…...
螺旋矩阵 II(LeetCode)
题目 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 解题 def generateMatrix(n):matrix [[0] * n for _ in range(n)]top, bottom 0, n - 1left, right 0, n - 1num 1while top <…...
如何快速掌握一款MCU
了解MCU特点 rom ,ramgpiotimerpower 明确哪些资源是项目开发需要的 认真理解相关资料模块 开始编程 编写特别的验证程序(项目不紧)按照自己的理解编写(老司机,时间紧张) 掌握MCU基本功能 定时器 固…...
XSS-DOM
文章目录 源码SVG标签Dom-Clobbringtostring 源码 <script>const data decodeURIComponent(location.hash.substr(1));;const root document.createElement(div);root.innerHTML data;// 这里模拟了XSS过滤的过程,方法是移除所有属性,sanitize…...
uniapp去掉页面导航条
在pages.json文件中,globalStyle中添加 ”app-plus“:{"titleNView":false }...
MySQL数据库专栏(三)数据库服务维护操作
1、界面维护,打开服务窗口找到MySQL服务,右键单击可对服务进行启动、停止、重启等操作。 选择属性,还可以设置启动类型为自动、手动、禁用。 2、指令维护 卸载服务:sc delete [服务名称] 例如:sc delete MySQL 启动服…...
【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端
【QT】基于UDP/TCP/串口的Ymodom通讯协议客户端 前言Ymodom实现QT实现开源库的二次开发-1开源库的二次开发-2 串口方式实现TCP方式实现UDP方式实现补充:文件读取补充:QT 封装成EXE 前言 Qt 运行环境 Desktop_Qt_5_11_2_MSVC2015_64bit ,基于…...
超详细!!!electron-vite-vue开发桌面应用之引入UI组件库element-plus(四)
云风网 云风笔记 云风知识库 一、安装element-plus以及图标库依赖 npm install element-plus --save npm install element-plus/icons-vue npm i -D unplugin-icons二、vite按需引入插件 npm install -D unplugin-vue-components unplugin-auto-importunplugin-vue-componen…...
基于MYC-Y6ULX-V2核心板的工业运动控制系统实践
1. 项目概述:当工业运动控制遇上嵌入式核心板在工业自动化领域,运动控制系统是驱动设备精确执行动作的“大脑”和“神经中枢”。从数控机床的精密加工,到机器人的流畅轨迹,再到包装产线的快速分拣,其核心都依赖于一个稳…...
VS2019编译OpenCASCADE 7.6.0避坑实录:从custom.bat修改到Demo测试,一次搞定
VS2019编译OpenCASCADE 7.6.0全流程避坑指南 在三维建模与CAD开发领域,OpenCASCADE作为开源几何内核引擎,其强大的BRep建模和STEP文件处理能力备受开发者青睐。然而对于初次接触OCC的Windows平台开发者而言,在Visual Studio 2019环境下完成从…...
告别‘天书’!手把手教你用vdex2dex、odex2smali等工具,把Android应用的vdex/odex/cdex转成可读的dex文件
Android逆向工程实战:从vdex/odex/cdex到可读dex的完整指南 当你兴致勃勃地打开一个APK文件准备分析时,却发现里面只有vdex、odex或cdex文件,用JADX直接打开全是乱码——这种挫败感每个逆向工程师都经历过。本文将带你一步步破解这些"天…...
CANN/asc-devkit SIMD数据搬运API
LoadUnzipIndex 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode…...
同步、异步与互斥:从通用OS到RTOS的全面解析
一、基础概念:进程与线程1.1 什么是进程?进程是操作系统进行资源分配和调度的基本单位,是一个正在运行的程序实例。1.2 什么是线程?线程是操作系统进行CPU调度的基本单位,是进程内部的一条执行路径(轻量级进…...
CG-65 剖面细管式温度传感器 小巧便携 多层温度同监测
一、产品概述:小巧便携,功能集成在农业生产、环境监测等诸多领域,土壤温度是一项至关重要的参数。一款性能优异的土壤温度监测设备,能够为相关工作提供精准的数据支持。我们的多深度土壤温度监测仪,正是这样一款专为精…...
边缘计算与机器视觉在产线质检中的实战应用与优化
1. 项目概述:当产线质检遇上边缘计算与机器视觉在制造业的车间里,质检环节一直是效率与质量的“卡脖子”点。传统的人工目检,不仅劳动强度大、易受疲劳和情绪影响,而且标准难以统一,漏检、误检时有发生。而将高清相机拍…...
【Web安全】JWT常见安全漏洞总结
文章目录前言1. JWT基础与漏洞概述2. JWT核心漏洞解析2.1 未校验签名2.1.1 漏洞原理2.1.2 利用方式2.1.3 实战脚本2.2 算法篡改漏洞2.2.1 漏洞原理2.2.2 核心说明2.2.3 攻击流程2.3 弱密钥漏洞2.3.1 漏洞原理2.3.2 利用方式2.4 垂直越权2.4.1 漏洞原理2.4.2 利用流程2.5 KID字段…...
别再被0.1+0.2≠0.3搞懵了!用Python和Java代码手把手拆解IEEE-754浮点数存储
浮点数精度之谜:用代码揭开0.10.2≠0.3的真相 当你在Python控制台输入0.1 0.2时,得到的不是预期的0.3,而是0.30000000000000004。这个看似简单的数学运算为何会出现如此"诡异"的结果?本文将带你用Python和Java代码深入…...
桌面Z箍缩实验:从等离子体原理到聚变中子探测的DIY实践
1. 项目概述:从“人造太阳”到桌面实验的能源狂想“如何通过聚变制造能源及如何实现”,这个标题背后,是无数工程师和科学家为之奋斗终身的终极能源梦想。它听起来宏大得像是国家实验室的专属课题,但今天我想从一个更接地气的、带有…...
