网络原理1

article/2025/6/7 13:31:05

协议

在网络通信中,协议是非常重要的概念。协议是在网络通信过程中的约定。发送方和接收方需要提前商量好数据的格式,才能确保正确进行沟通。

应用层协议

应用层,对应着应用程序,是跟我们程序员打交道最多的一层。调用操作系统提供的网络API写出的代码,都是在应用层上的。

应用层这里有很多现成的协议,但更多的,还是需要我们程序员根据实际的业务场景自定义协议(网络传输的数据要怎么使用,也要考虑数据是什么样的格式,包含哪些内容)。

应用层的协议在开发时一般是客户端和服务器共同约定的。

自定义协议,一般要约定好两方面内容:

1、客户端和服务器要交互哪些信息

2、数据的具体格式

客户端按照上述约定发送请求,服务器按照上述约定解析请求,服务器按照上述约定构造响应,客户端按照上述约定解析响应。

举个例子:

点个外卖~

打开外卖相关的APP,显示出主页,主页里面就会显示出一些快餐店、饭店的列表。

而这些饭店都是在我们附近的(打开软件时,客户端和服务器交互了位置信息),显示的饭店列表中,也会包含一些信息——饭店的名称、图片、评分、简介……上述的这些信息,需要通过一定的格式来组织的,往往是设计客户端和设计服务器这两伙程序员坐在一起,一起把这个事情敲定下来的~~~

一个简单粗暴但五脏俱全的例子:

1、请求,约定使用行文本的格式来进行表示:

userId,postion\n(请求以\n结尾,使用,对信息进行分割)

例如:(1001,[经纬度]\n) 

2、 响应,也是使用行文本来表示,一个响应中可能会包含多个饭店,每个饭店占一行,每个饭店都要返回 id,名称,图片,评分,简介

例如:( 2001,A 饭店,[logo图片地址],4.9,高端饭店\n

               2002,B饭店,[logo图片地址],4.5,干净卫生的饭店\n

                \n)

若干行的最后,使用空行来作为所有数据的结束标志,上面这一系列内容就是同一个响应中的数据了。

补充:

客户端和服务器之间往往交互的是“结构化数据”(结构化数据:一个结构体/类,其中包含了很多个属性),而网络传输的数据其实是“字符串”、“二进制比特流”

约定协议的过程,其实就是把结构化数据转成字符串/二进制比特流的过程。

把结构化数据转成字符串/二进制bit流的操作,称为“序列化”。

把字符串/二进制比特流还原成结构化数据的操作,称为“反序列化”。

序列化/反序列化具体要组织成什么样的格式,要包含哪些信息,约定这两件事情的过程,就是自定义协议的过程。

为了让程序员更方便地去约定这里的协议格式,业界给出了几个比较好用地方案:

xml协议

大致模型如下:

<属性名>称为标签(tag),一般是成对出现的,分别为开始标签和结束标签。开始标签和结束标签中间夹着的是标签的值,标签是可以嵌套的。(标签名/标签值/标签的嵌套关系,这些都是程序员自定义的)

优点 :使得数据内容的可读性和拓展性都提升了很多,标签的名字能够对数据起到说明作用,后续再增加一个属性,新添加一个标签即可,对已有代码影响不大

缺点:冗余信息比较多,标签的描述性信息,占据的空间反而比数据本身还要多了。

json协议

大致模型如下:

采用的是键值对结构:

键与值之间用:进行分割,键与键之间用,进行分割,若干个键值对之间使用{  }分隔开,一个{  }就形成了一个json对象,还可以把多个json对象放到一起,使用,分隔开,将整体使用[  ]括起来,此时就形成了一个json数组。

优点:可读性、扩展性都更好,而且对比xml来说,占用的空间更少了。

缺点:虽然json的确比xml占用的空间更少了,节省了宽带,但很明显,这里的宽带仍然还是有浪费的部分,尤其是这种数组格式的json,这种情况下往往会传输很多相同的数据字段,很多key关键字都是重复传输的(id、name……)。

protobuffer

这种约定是更加节省宽带的方式,也是效率最高的方式。

protobuffer只是在发阶段(写代码阶段)定义出这里有的哪些资源,描述每个字段的定义。程序真正运行时,实际传输的数据是不包含这些信息的。这样的数据都是按照二进制的方式来进行组织的。

这种方式虽然程序运行的效率会很高,但不利于程序员进行阅读。

所以虽然protobuffer运行效率更高,但是使用并没有比json广泛,只有一些对于性能要求非常高的场景protobuffer。

传输层协议

传输层的协议,虽然是系统内核已经实现好的,但我们仍需要重点进行关注,我们在之前的网络编程中使用的socket  API  就是传输层提供的。

端口号

端口号,是一个两个字节的整数。标识了一个主机上的正在进行网络通信应用程序。

在TCP/IP协议中,用源IP、源端口号、目的IP、目的端口号、协议号,这样一个五元组来标识一个通信。 

端口号的范围划分:

0~1023:是一些知名端口号,HTTP,FTP,SSH等这些广为使用的服务器,他们的端口号是固定的。

1024~65535:操作系统动态分配的端口号。我们前面在网络编程中,客户端程序的端口号,就是由操作系统在这个范围内分配的。

知名端口号:

SSH服务器:22;

FTP服务器:21;

telnet服务器:23;

HTTP服务器:80;

HTTPS服务器:443;

我们在写程序使用端口号时,需要避开这些知名端口号。

UDP协议

前面我们已经提到过,UDP协议的四个特点:无连接,不可靠传输,面向数据报,全双工。

研究一个协议,我们主要研究报文格式,基于报文格式,来了解这个协议的特性。

UDP数据报 = 报头(重点)+载荷(应用层数据包)

UDP协议格式

实际上的UDP数据报是这样的: UDP的报头中,一个有4个字段,每个字段2个字节(一共8个字节)。

由于UDP中使用2个字节(16位)来识别端口号,端口号的取值范围就是0~65535,同理数据报的最大长度也是65535(64KB),一旦数据超出64KB,数据就有可能会出现截断(64KB后面的数据就没有了)。

总的数据报最大长度是64KB,载荷部分实际的最大长度应该是64KB-8KB(报头长度)

为了解决数据被截断问题,有两个方案:

方案1:在应用层,把数据报进行拆分,之前一个数据报,表示N个页面,拆分成每一个页面占用一个UDP数据报,甚至可以进一步拆分成,一个页面对应多个UDP数据报(开发和测试成本很大)。

方案2:使用TCP代替UDP,TCP没有长度限制。

那为什么不对UDP的长度进行扩展呢?技术上是很容易实现,但要改就要所有就得所有的系统一起改,如果一方改了,另一方不改,相互之间就无法进行通信了。

校验和:验证数据在传输的过程中是否正确。

数据在网络传输的过程中是可能出错的。网络数据传输的过程中是使用光信号/电信号/电磁波进行传输的,上述信号都是很容易收到干扰的。

比如,使用高低电平来表示0 1 ,此时外界如果加上一个磁场,就可能把高电平变为低电平,低电平变为高电平,此时,0->1,1->0,就出现了比特翻转。现代的传输体系,会有一系列的保护机制,来减少外界的干扰。

校验和的作用就是用来识别出当前数据是否在传输过程中出现错误。

注意:网络中的校验和,并非是简单的按照数据的长度或者数量来进行校验的,一定是数据的内容会参与到其中。

严格来说,校验和只能用来“证伪”,即只能证明数据是出错了。没办法确保这个数据100%是正确的。但是出现这种情况的概率很小,实践中可以近似地认为校验和一致,数据就一致了。

UDP中的校验和是使用比较简单的算法——CRC算法(循环冗余校验)实现的。

比如,要产生一个两个字节的校验和:

加的过程可能会有一些数据比较大,超出了short的范围,其实也没有关系,这里不用管。

UDP数据发送方,在发送数据之前,先计算一遍CRC,把计算好的CRC的值放到UDP数据报中(设这个CRC值为value1)

接下来,这个数据报会通过网络传输到达接收端,接收端收到数据之后,也会使用同样的算法,再算一遍CRC的值,得到的结果是value2。比较自己计算的value2和收到的value1的值是否一致。如果是一致的,那么数据大概率是没有问题的。如果不一致,则传输过程中一定出现了错误。

为什么value1 == value2时,要说数据大概率是没有问题呢?如果只有一个bit为位发生翻转,那么CRC是100%能够发现错误的。但是如果恰好有两个/多个bit位发生翻转,就有可能校验和恰好和之前的一样,这种情况出现的概率比较低,可以忽略不计,但如果需要有跟你广告的检查精度,就需要使用其他更为严格的校验和算法了。

这里我们重点介绍md5/sha1算法 ,这两个算法背后的数学公式大同小异,且研究起来比较困难,这里我们认识下他们的特点即可:

1、定长:无论原始数据有多长,算出来的md5的最终值始终都是一个固定长度(16位、32位、64位)。

2、分散:计算md5的过程中,原始数据,只要变化一点点,算出来的md5的值就会发生很大的变化。(这样的特性,也使得md5可以作为一个字符的hash算法)

3、不可逆:给一个源字符串,计算md5值,过程非常简单(比CRC难一点,但是整体比较简单),但是如果给一个算好的md5值,还原为原始字符串,理论上是无法完成的。

原始字符串变为md5码的过程会有很多信息量损失,无法进行还原,就像火腿肠无法还原成猪肉那样。


http://www.hkcw.cn/article/vwPMQxJJyP.shtml

相关文章

【JSON-to-Video】设置背景视频片断

欢迎来到JSON转视频系列教程。今天要教大家如何添加背景视频片断&#xff0c;在视频制作中&#xff0c;巧妙运用背景视频&#xff0c;能为作品增添独特魅力。下面就为大家详细讲解具体步骤。 JSON转视频教程&#xff0c;添加背景视频片断 设置bgVideo字段 {"bgVideo"…

工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线

一、方案背景​ 在工地、矿山、工厂等高危作业场景&#xff0c;反光衣是保障人员安全的必备装备。但传统人工巡查存在效率低、易疏漏等问题&#xff0c;难以实现实时监管。AI智能分析网关V4基于人工智能技术&#xff0c;可自动识别人员着装状态&#xff0c;精准定位未穿反光衣…

Java垃圾回收机制深度解析:从理论到实践的全方位指南

Java垃圾回收(GC)是Java虚拟机(JVM)的核心功能&#xff0c;它自动管理内存分配与回收&#xff0c;避免了C/C中常见的内存泄漏问题。本文将深入剖析Java垃圾回收的工作原理、算法实现、收集器类型及调优策略&#xff0c;助你全面掌握JVM内存管理的精髓。 一、垃圾回收基础概念 …

实验设计与分析(第6版,Montgomery著,傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题。主要涉及方差分析。 YieldDesign <-expand.grid(A gl(3, 1, labels c("-", "0","…

Vue内置组件Teleport和Suspense

一. Vue内置组件Teleport 认识Teleport( teleport&#xff1a;允许我们把组件的模板渲染到特定的元素上) 1.1. 在组件化开发中&#xff0c;我们封装一个组件A&#xff0c;在另外一个组件B中使用 组件A中template的元素&#xff0c;会被挂载到组件B中template的某个位置&#xf…

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信

研究背景&#xff1a;日常生活中&#xff0c;健康人依靠手完成对物体的操作。对于手部截肢患者&#xff0c;手部的缺失导致他们难以有效地操作物体&#xff0c;进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿&#xf…

Ansys Zemax | 手机镜头设计 - 第 4 部分:用 LS-DYNA 进行冲击性能分析

附件下载 联系工作人员获取附件 该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用 Ansys Mechanical 和 LS - DY…

windows可视化粘贴使用剪贴板

复制 ctrl c可视化粘贴 win v选择要粘贴的内容

【QT】认识QT

文章目录 1. 认识Qt2. 创建QT项目3. 认识对象树4. 其它4.1 窗口坐标系4.2 快捷键 1. 认识Qt 什么是QT Qt 是⼀个跨平台的C图形用户界⾯应用程序框架。 它为应用程序开发者提供了建立艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt为开发者提供…

OpenCV CUDA模块特征检测------角点检测的接口createMinEigenValCorner()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建一个 基于最小特征值&#xff08;Minimum Eigenvalue&#xff09;的角点响应计算对象&#xff0c;这是另一种经典的角点检测方法&…

Java高级 | (二十二)快速应用开发框架——Spring Boot

一、使用IDEA搭建SpringBoot项目 二、创建控制器类 1、先运行项目。 如果配置正常&#xff0c;ldea运行界面如下&#xff0c;表示启动正常。 2、创建控制器类 鼠标右击controller包&#xff0c;点击new->Java Class,在弹出的对话框中输入“HelloController”并按回车健&a…

Linux 安装 JDK

Linux中JDK安装 文件路径在root目录&#xff0c;请根据实际情况进行修改 1、上传并解压 tar -zxvf /root/jdk-8u333-linux-x64.tar.gz2、移动解压后的文件夹到/usr/local 目录下&#xff0c; mv /root/jdk1.8.0_333 /usr/local/此步骤可以不操作&#xff0c;但步骤3中的路径…

简简单单探讨下starter

前言 今天其实首先想跟大家探讨下&#xff1a;微服务架构&#xff0c;分业务线了&#xff0c;接入第三方服务、包啥的是否自己定义一个stater更好&#xff1f; 一、starter是什么&#xff1f; 在 Spring Boot 中&#xff0c;Starter 是一种特殊的依赖模块&#xff0c;用于快速…

字符编码全解析:ASCII、GBK、Unicode、UTF-8与ANSI

UTF - 8(全球字符能被唯一标识)、GBK、Unicode、ANSI 区别与关联 qwen模型分词器文件 1. ASCII(基础铺垫,理解编码起源) 作用:最早期为处理英文文本设计,是字符编码的基础,后演变成其他编码兼容的一部分 。范围:共 128 个字符(0 - 127),包含英文大小写字母、数字…

定时线程池失效问题引发的思考

最近在做的一个新功能&#xff0c;在结果探测的时候使用了定时线程池和普通线程池结合&#xff0c;定时线程池周期性创建子任务并往普通线程池提交任务。 问题&#xff1a; 在昨天测试老师发现&#xff0c;业务实际上已经成功了&#xff0c;但是页面还是一直显示进行中。 收到…

Win11/Win10 打不开 gpedit.msc 之 组策略编辑器安装

目前已整理两种方式&#xff0c;推荐使用第二种方式~ 方式1&#xff1a; 一般家庭版操作系统默认未安装 组策略编辑器&#xff0c; 只需要进行安装一下即可。 到文章结尾按照提示下载相关的bat文件&#xff0c; 下载后右键以管理员身份运行bat文件&#xff0c;&#xff08…

无人机甲烷检测技术革新:开启环境与能源安全监测新时代

市场需求激增&#xff0c;技术革新势在必行 随着全球气候变化加剧&#xff0c;甲烷作为第二大温室气体&#xff0c;其减排与监测成为国际社会关注焦点。据欧盟甲烷法规要求&#xff0c;2024 年起欧洲能源基础设施运营商需定期测量甲烷排放并消除泄漏。与此同时&#xff0c;极端…

谷歌地图手机版(Google maps)v11.152.0100安卓版 - 前端工具导航

谷歌地图(Google maps)是由谷歌官方推出的一款手机地图应用。软件功能强大&#xff0c;支持本地搜索查找世界各地的地址、地点和商家&#xff1b;支持在街景视图中查看世界各地的360度全景图&#xff1b;支持查找乘坐火车、公交车和地铁的路线&#xff0c;或者查找步行路线等 …

H5动态文字效果开发经验分享

这里写目录标题 一、效果介绍二、实现原理与代码解析1. 打字机效果实现2. 渐变文字动画实现 三、开发经验与技巧1. 性能优化2. 兼容性处理3. 用户体验提升 四、应用场景五、扩展思路 一、效果介绍 我们实现了两种常见且实用的文字动效&#xff1a; 打字机效果 &#xff1a;文…

春雪食品×MTC AI助手:创新驱动再升级,效率革命正当时!

当农牧食品企业遇上AI“助手”&#xff0c;会碰撞出怎样的火花&#xff1f;5月26日&#xff0c;春雪食品集团总部迎来了一场特别的签约仪式——携手MTC麦汇信息&#xff0c;共同探索AI数字化之路。春雪食品总裁郑钧、副总裁黄仕敏&#xff0c;MTC麦汇信息董事长卢富平、副总裁徐…