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

网络原理 一

一、协议

网络通信中,协议是非常重要的概念.

协议进行了分层,此处就是按照这几层顺序来介绍每一层中的核心协议.

应用层,就对应着应用程序,是程序员打交道最多的一层,调用系统提供的 网络api 写出的代码都是基于应用层的.

应用层这里当然也有很多现成的协议,但更多的还是,程序员根据实际场景,自定义协议.

   ->   网络传输的数据要怎么使用,也要考虑数据是怎么样的格式,里面包含哪些内容,

协议是一种约定,虽然存在很多现有的协议,但是除此之外,程序员也可以自己来约定协议.

自定义协议约定好两方面内容:

1   ->   服务器和客户端之间要交互哪些信息

2   ->   数据的具体格式

客户端按照上述约定发送请求,服务器按照上述约定来解析请求

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

为了让程序员更方便的去约定这里的协议格式,业界也给出了几个比较好用的方案,可以拿过来直接套进来.

1.1 xml

大概的模型如下:

请求:

<request>

        <userld>1000</userld>

        <position>[经纬度]</position>

</request>

响应:

<response>

        <shops>

                <shop>

                        <id>1001</id>

                        <name>杨国福麻辣烫</name>

                        <image>图片地址</image>

                        <rank>4.8</rank>

                        <description>这是麻辣烫</description>

                </shop>

        </shops>

</response>

形如 :<name>   这叫做标签(tag),标签是成对出现的.

<name>称为 开始标签        </name>称为结束标签

开始标签和结束标签之间夹着的就是标签的值.标签可以嵌套

标签名字/标签的值/标签的嵌套关系,都是程序员自定义的.

1.2 json

请求

{

        userld:1000,

        position:[经纬度]

}

响应

{

   {

        id:1001,

        name:"杨国福麻辣烫"

   },

   {

        id:1002,

        name:"隆江猪脚饭"

   }

}

键值对结构

键和值之间使用 "  :  " 分割

键和对之间使用 "  ,  "分割

把若干个键值对使用{}括起来,此时就形成了一个json对象.

还可以把多个json对象放到一起,使用 "  ,  " 分隔开,应且使用 "  [ ]  " 整体括起来,就形成了一个json数组

1.3 protobuffer

只是开发阶段(代码)定义出这里有哪些资源,描述每个字段的含义,

程序真正运行的时候,实际传输的数据是不包含这样的描述信息的.

这样的数据是按照二进制的方式来组织的.

虽然protobuffer运行效率高,但是使用并没有比json广泛.

这样的设定,最高效的做法,并不太有利于程序员阅读.

二、传输层

2.1 端口号

端口号是一个2个字节的整数,使用端口号的时候, 1 - 1024 都属于是系统保留的自用端口.

2.2 UDP协议

无连接,不可靠传输,面向数据报,全双工

UDP数据报 = 报头 + 载荷

UDP报头中有一共有4个字段,每个字段两个字节

由于协议字节中使用两个字节表示端口号,端口号的取值范围就是0-65535   ->   最大就是64kb

2.3 校验和/检验和

校验和/检验和   ->   验证数据再传输过程中是否正确.

前提 : 数据在传输过程中可能会坏掉.

网络数据传输,本质上是光信号/电信号/电磁波,很有可能会受到干扰.

使用高电平低电平表示 0 1 

外界如果加上一个磁场,就可能把其中的低电平变成高电平

此时,出现0 -> 1  ,  1 -> 0  这叫做比特翻转

校验的作用就是用来识别当前数据是否出现了比特翻转,识别数据是否正确.

http://www.lryc.cn/news/357134.html

相关文章:

  • xcode配置快速打开终端命令行工具教程
  • AIGC降重:如何2分钟降低论文AI率和查重率?推荐使用SpeedAI科研小助手
  • Blazor入门-连接MySQL的简单例子:列出数据+简单查询
  • CEEMDAN +组合预测模型(CNN-Transfromer + XGBoost)
  • 箭头函数的意义和函数的二义性
  • 618必买的数码好物有哪些?盘点兼具设计与实用的数码好物分享
  • 【好书分享第十三期】AI数据处理实战108招:ChatGPT+Excel+VBA
  • 001 CentOS 7.9 安装及配置jdk-8u411-linux-x64.tar.gz
  • Revit二次开发-WPF ProgressBar 执行程序中显示进度条
  • React:构建Web应用的未来
  • 【Elasticsearch】Centos7安装Elasticsearch、kibana、IK分词
  • IDEA中各种Maven相关问题(文件飘红、下载依赖和启动报错)
  • Android 13 VSYNC重学习
  • std::move和左值右值
  • QT学习备份
  • 【wiki知识库】03.前后端的初步交互(展现所有的电子书)
  • AOP——学习
  • Linux静态库、共享动态库介绍、制作及使用
  • 【Paddle】稀疏计算的使用指南 稀疏ResNet的学习心得 (2) + Paddle3D应用实例稀疏 ResNet代码解读 (1.6w字超详细)
  • Linux系统维护
  • 经典文献阅读之--RenderOcc(使用2D标签训练多视图3D Occupancy模型)
  • 蓝牙设备中的UUID
  • 网络之再谈体系结构
  • 在flutter initState 方法,触发 setState导致循环执行
  • JavaScript字符串方法
  • YD/T 2698-2014 《电信网和互联网安全防护基线配置要求及检测要求 网络设备》标准介绍
  • QCC30XX如何查找本地地址码
  • 基于 DCT 的图像滤波
  • spdlog日志库源码:自定义异常类spdlog_ex
  • 3.每日LeetCode-数组类,爬楼梯(Go,Java,Python)