首页 > 其他分享 >【TCP/IP】自定义应用层协议,常见端口号

【TCP/IP】自定义应用层协议,常见端口号

时间:2024-08-18 23:27:17浏览次数:13  
标签:自定义 IP 端口 键值 标签 服务器 应用层 端口号

互联网中,主流的是 TCP/IP 五层协议

  • 5G/4G 上网,是有自己的协议栈,要比 TCP/IP 更复杂(能够把 TCP/IP 的一部分内容给包含进去了)

应用层

可以代表我们所编写的应用程序,只要应用程序里面用到了网络通信,就可以认为这个代码就是属于应用层的代码

日常开发中最常用到的一层:

  1. 使用大佬们已经创建好的应用层协议
    • 应用层知名的协议有很多,其中的佼佼者就是 HTTP
  2. 自己定义应用层协议
    • 另外四层都是操作系统/硬件/驱动已经实现好了的,我们不可能“自定义”,只能使用人家的

协议就是约定

  • 按照自己的规则,约定通讯方式——>自定义应用层协议

自定义应用层协议

自定义应用层协议,具体要做什么事情:

明确要传递的信息

  1. 明确前后端交货过程中,要传递哪些信息

举个例子:开发一个外卖软件,打开软件后,首先需要展示一个“商家列表”
此处就需要先确定传递的信息是什么

  1. 请求:用户是谁(用户的 ID),用户所处的位置
  2. 响应:商家列表,包含多个商家,每个商家信息中,又有商家的名字、图片、距离、评分

这里的信息如何确定,都是根据当前的需求来产生的

明确组织信息的格式

  1. 明确组织这些信息的格式
    针对信息组织格式,也有很多种方式,使用哪种方方式都可以,只要确定前段和后端是同一种方式就可以了

举个例子:使用行文本的方式来组织上述数据

  1. 请求:用户id,用户位置\n
  2. 响应:商家的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 年代是知名的)
    • 我们日常开发的时候,会避开这些端口

业务端口和管理端口

什么时候会涉及到一个进程(服务器)绑定多个端口?

  • 编写服务器,肯定需要先绑定至少一个端口号,和客户端进行交互(称为“业务端口”)
  • 服务器运行过程中,希望能够对这个服务器的行为,进行一些“控制”
    • 比如让服务器重新加载某个数据/某个配置/修改服务器的某个功能
    • 也可以通过网络通信完成上述功能
    • 就可以让服务器绑定另一个端口,通过这个端口,编写一个客户端,给服务器发送一些“控制类“请求
    • 上面的“另一个端口”就是“管理端口

调试端口

当需要针对服务器运行状态进行检测和调试,需要查看服务器运行中某个关键变量的数值的时候,千万不能用调试器来进行调试,一旦使用调试器调试这个服务,就会使服务器的一些线程被阻塞住,无法给客户端正确提供服务了

  • 虽然可以通过日志进行打印,但是不方便,需要修改代码并重启服务器
  • 可以让服务器绑定另一个端口,然后实现一些相关的打印关键变量的逻辑,客户端发送对应的调试请求
  • 这里的“另一个端口”就是“调试端口

标签:自定义,IP,端口,键值,标签,服务器,应用层,端口号
From: https://blog.csdn.net/Yeeear/article/details/141301469

相关文章

  • 【TCP/IP】UDP协议数据格式和报文格式
    学习一个网络协议,主要就是学习“数据格式”/“报文格式”源端口/目的端口端口号是属于传输层的概念UDP报头使用两个自己的长度来表示端口号之所以端口号的范围是0~65535,是因为底层网络协议做出了强制要求如果使用一个10w这样的端口,就会在系统底层被“截断”UDP......
  • MCSM面板搭建我的世界Java版服务器结合内网穿透无公网IP远程联机
    文章目录前言1.安装JAVA2.MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7.配置公网访问地址8.远程联机测试9.配置固定远程联机端口地址9.1保留一个固定tcp地址9.2配置固定公网TCP地址9.3使用固定公网地址远程联机......
  • 030、Vue3+TypeScript基础,路由中History和HashHistory的区别
    01、index.ts路由代码如下://创建路由并暴露出去import{createRouter,createWebHistory}from'vue-router'importHomefrom'@/view/Home.vue'importAboutfrom'@/view/About.vue'importNewsfrom'@/view/News.vue'constrouter=cr......
  • 029、Vue3+TypeScript基础,路由组件和一般组件的存放位置,以及页面生命周期
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//引入路由importrouterfrom'./router'constapp=createApp(App);//使用路由app.use(router);//App.vue的根元素id为ap......
  • 洛谷P1020 [NOIP1999 提高组] 导弹拦截(未完)
    传送门:P1020[NOIP1999提高组]导弹拦截题目大意:一个拦截导弹的系统,每次只能拦截高度不超过上一个的导弹求出:一个系统最多能拦截的导弹数量;要拦截所有导弹最少需要的该系统的数量。思路:第一问:一眼就是最长单调不上升子序列,朴素DP求解,复杂度为O(n^2);请参考,能过掉50%......
  • 洛谷P1983 [NOIP2013 普及组] 车站分级 题解
    思路由题可知,在一趟车次的区间内,停靠的站点的等级恒大于不停靠的站点。因此,对于每一趟车次的区间,给所有停靠的站点向所有不停靠的站点两两连有向边,然后求图中最长的路径长度,就能得到答案。实现因为可能出现重边,而且\(n\le1000\),所以在处理车次连边的时候使用邻接矩阵,再改成邻......
  • 短视频 IP实战课,独创一键复制学习秘籍,转战新领域,月赚五万轻松行
    1.引言随着数字媒体的快速发展,短视频已成为内容传播和个人品牌建设的重要平台。对于寻求职业转型的专业人士而言,短视频IP运营不仅提供了灵活的工作时间,还有望带来可观的经济回报和与行业精英交流的机会。然而,这一新兴领域也存在诸多挑战,如行业门槛、专业技能缺乏等。2.短......
  • JavaScript ES6 Map
    Map对象保存键值对。任何值(对象或者原始值)都可以作为一个键或一个值。Maps和Objects的区别一个Object的键只能是字符串或者Symbols,但一个Map的键可以是任意值。Map中的键值是有序的(FIFO原则),而添加到对象中的键则不是。Map的键值对个数可以从size属性获......
  • SNRS Day 3 (Layer 2 Security & IOS IPS)
    缓解二层攻击二层攻击类型cam表溢出mac地址欺骗arp欺骗dhcp饿死交换机工作原理pc1和pc2要通信,pc1需要pc2个mac地址,开始没有mac地址,就会发送arp的请求,如果pc2的ip地址是2,它会询问2的mac地址是多少,这个包发送到交换机,首先交换机会记录下pc1的源mac地址,由于是一个arp......
  • JavaScript函数调用之多括号调用(精讲)
    目录fn()()调用形式fn1().fn2()调用形式也叫链式调用链式调用的特点常见用途(fn())()调用形式也叫立即调用函数(IIFE)关键点:用途:示例:几种多括号调用形式:fn()()()fn1().fn2()(fn())()fn()()调用形式定义:是一个JavaScript中常见的模式,通常用于函数式编程。它的......