网络应用层和传输层
网络中有很多协议这些协议的不同导致了分层这一现象,不同层的主要功能不一样。
应用层:应用程序。数据具体如何使用
传输层:关注起点和终点
网络层:关注路径规划
数据链路层:关注相邻节点的转发
物理层:硬件设备
应用层
1.根据需求,明确要传输的信息
2.约定好信息按照什么格式来组织
(和程序员接触最为密切)应用程序。在应用层中,很多时候程序员会自定义应用层协议的(也有一些现成的应用层协议)。不要神话自定义协议,协议就是规定,其规定了数据如何进行传输。
如日常生活中的点外卖,(会涉及程序和服务器之间进行的网络通信交互)当我们点开外卖软件,我们其程序读取我们的位置信息之后,程序会会发送请求发送我们的位置信息和用户信息(一般会有格式对于请求来说,这里使用文本的方式。三个属性,使用”,“来分隔)假设程序构造出1000,100,30这样一个字符串组成的代码块,将其写入到TCP socket 或者UDP的socket中,
商家就会回复一些响应(格式和上面一样)响应有商家列表,商家的名称,图片,距离,简介,评分。如
李四麻辣烫,图片,地址,1.2KM,麻辣烫性价比之王,4.8
王五麻辣香锅,图片,地址,1.0KM,麻辣香锅中的神,5。等这样的响应类似这样的过程,就是自定义协议。无论使用什么样的格式来进行组织,只要客户端和服务器这边能够对应互相回应就好。
这种通过文本的方式构造的协议,一般不这样使用,开发中常见的几种格式。
1.xml
很早之前组织网络的格式,现在很少应用于网络通信(maven,会使用其管理项目配置),是通过标签来组织数据。并且其是一个通用的数据格式,有什么标签,标签的作用都可以自己定义。
请求:
<request>
<userld>10000</userld>
<position>100,30</position>
</request>
优势
让数据的可读性变得更好。
劣性
标签写起来非常繁琐,传输的时候也占用更多的网络带宽。
2.json(当下最流行的一种数据组织格式)
{
userld:"1000",
position:"20,23"
}
这种键值对结构{}将所有的键值对包裹起来。键值对之间使用”,“来进行分隔,键和值之间,使用”:“来进行分隔,键的格式固定为String类型,值无所谓。键得分号可以省略。
优势
可读性比较好;比xml简洁
劣势
会消耗额外得带宽(需要传输键得值),
注
虽然如此,json在网络通信中仍然非常流行,除非是一些对于性能要求比较高得场景不使用jspn之外其余很多地方都可以使用json.
3.protobuffer
于前两个相比,其(简称pb)使用二进制的方式来组织数据。可以保证带宽占用最低(将信息以二进制的形式压缩)
优势
占用带宽最低,传输效率最高,适合高性能场景
劣势
可读性差(二进制无法直接阅读),影响开发效率
应用层也有一些现成的协议。最知名的,广泛使用的HTTP协议(超文本传输协议超文本不仅是文本还有图片视频音频等)
传输层
UDP:无连接,不可靠传输,面向数据报,全双工
TCP:连接,可靠传输,面向字节流,全双工
端口号
写一个服务器,必修手动指定一个端口号,通过端口号来区分当前这个主机的不同的应用程序
写一个客户端,客户端在通信的时候也会有一个端口号(代码感知不到),系统自动分配的
端口号固定2个字节表示的范围0~65535,一般情况下0不可用。1~1023称为”知名端口号“,给比较知名的一些服务器预留的(现在大部分当时知名的服务器已经不适用了,仍然在使用的22:ssh端口号,80:http服务器端口号443:https服务器端口号,使用服务器时也可以不使用这个端口号只是建议),1024~65535普通的端口号
UDP协议
前面分成四个部分,每个部分占2个字节。报头和载荷之间,可以认为是一个“字符串拼接”,这里是二进制的数据。
源IP目的IP不在这里,在网络层的IP协议中。
目的端口号后面是UDP报文长度:范围是0-65535 是64kb,因此使用UDP时很难表示一个较大的数据报。当一个业务的数据报已经接近64kb就需要要么将数据分成多个包,然后多个UDP传输但是开发成本和测试成本比较大()拆包以及如何进行组包,要么就直接使用TCP,TCP没有包的大小限制。
注:那么能否对其进行升级将两个字节变为4个字节,不行技术上可以实现,但是如果升级需要将世界上的所有设备一起升级才可以,因为一边升级不行,数据无法处理,无法进行通信。
UDP报文长度后面是UDP的校验和:检验和是什么?在网络传输中,由于一些外部的干扰,可能会导致数据传输出错的情况。光信号/电信号 磁场,电场,高能离子的干扰下,会导致某个地方本来是传输低电平,在干扰下会变成高电平,造成比特翻转,所以就需要来验证数据是否传输错误。校验和就诞生了。
检验和本质上是一个字符串,其体积比原始数据更小,又通过原始数据生产的,原始数据相同得到的校验和一定相同,反之,校验和相同原始数据大概率相同(不同的概论很低)。
怎样基于校验和来完成数据校验?
1.发送方将要发送的数据整理好(data1),通过一定的算法,计算校验和(checksum1)
2.发送方将data1和checksum1一起通过网络发送过去
3.接受方收到数据,收到的数据称为(data2)可能与数据1不同了,收到checksum1
4接收方根据data2重写计算检验和(根据相同的算法),得到checksum2
5对比checksum1和checksum2是否相同。不同data1和data2一定不同
如果相同,data1和data2大概率相同(不相同概率很小忽略不计)
如果checksum1过来的是错误的那么检查是否和checksum2更不可能相同了
通过这样的方式,就能发现数据传输出错
校验和的计算也有很多算法,此处UDP使用的是CRC(循环冗余算法)
把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这两个字节变量中,累加过程中出现溢出没事。如果中间的某个数据,出现传输错误,第二次计算的校验和和第一次就会不一样。这种不是非常靠谱的,导致两个不同的数据,得到相同的校验和的概率比较大 。前面的字节少1后面的字节多一。
所以有更厉害的MD5算法和sha1算法这里只介绍MD5算法
MD5算法是需要一系列的公式来将其转化为md5的。
1.MD5定义:无论你的数据多长,计算得到的MD5都是固定长度。校验和本身就应该不长,要不然不方便网络传输。
2.分散:给定两个原始数据,哪怕绝大部分一样只有一个字节不同,得到的MD5值差距都会很大。因为这样的特性其也非常适用于hash算法。
3.不可逆:给原始数据计算MD5简单,反过来理论不可行,反过来计算的话计算量很庞大,超出算力极限
UDP特点在代码中感知的到
1.无连接。UDP本身不会存储对端的信息,要在发送数据的时候,显示指定要传输给谁
DatagramPacket requestPack = new DatagramPacket(request.getBytes(),request.length(),InetAddress.getByName(sereveIp),serverPort);//创建一个数据报来传输用户的内容socket.send(requestPack);//向客户端传输
2.不可靠性(代码看不出来)
3.面向数据报。通过DatagramPacket类的对象构成的数据报进行传输
DatagramPacket requestPack = new DatagramPacket(request.getBytes(),request.length(),InetAddress.getByName(sereveIp),serverPort);//创建一个数据报来传输用户的内容socket.send(requestPack);//向客户端传输
4.全双工 socket既能传送又能接收
socket.send(requestPack);//向客户端传输DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//接收客户端返回的响应
基于UDP的应用层协议
NFS:网络文件系统
TETP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议
并且包含自己定义实现的。
有一些应用层协议,基于UDP来实现的.其实并不算很多.
相比于UDP来说,TCP在更多的情况下,是具有优势的.很多时候,都是优先考虑使用TCP
相关文章:

网络应用层和传输层
网络中有很多协议这些协议的不同导致了分层这一现象,不同层的主要功能不一样。 应用层:应用程序。数据具体如何使用 传输层:关注起点和终点 网络层:关注路径规划 数据链路层:关注相邻节点的转发 物理层࿱…...
Vue3:优化-从响应式数据中获取纯数据
一、情景说明 我们知道,Vue3中,创建变量时,常用ref、reactive来包裹,这样,这个变量就是响应式数据 然而,有时候,我们只需要纯数据 例如,我们在调用后端接口的时候,我们只…...

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?
C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成? 手术麻醉系统与医院信息系统的集成是一个关键步骤,它有助于实现信息的共享和流程的协同,从而提高医疗服务的效率和质量。手麻系统与lis、his、pacs等系统的对接是医院信息化建设的重…...

学习CSS Flexbox 玩flexboxfroggy flexboxfroggy1-24关详解
欢迎来到Flexbox Froggy,这是一个通过编写CSS代码来帮助Froggy和朋友的游戏! justify-content 和 align-items 是两个用于控制 CSS Flexbox 布局的属性。 justify-content:该属性用于控制 Flexbox 容器中子项目在主轴(水平方向)…...
springboot项目如何配置跨域?
在Spring Boot项目中配置跨域(CORS,Cross-Origin Resource Sharing)主要是为了允许来自不同源(不同的协议、域名或端口)的前端应用能够访问后端API。Spring Boot提供了多种方式来配置跨域支持。 1. 使用CrossOrigin注…...

实现第一个动态链接库 游戏插件 成功在主程序中运行 dll 中定义的类
devc 5.11编译环境 dll编译环境设置参考 Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 插件 DLL代码和主程序代码如下 注意 dll 代码中的class 类名需要 和主程序 相同 其中使用了函数指针和强制类型转换 函数指针教程参考 以动态库链接库 .dll 探索结构体…...

算法第三十九天-验证二叉树的前序序列化
验证二叉树的前序序列化 题目要求 解题思路 方法一:栈 栈的思路是「自底向上」的想法。下面要结合本题是「前序遍历」这个重要特点。 我们知道「前序遍历」是按照「根节点-左子树-右子树」的顺序遍历的,只有当根节点的所有左子树遍历完成之后…...
Rust---复合数据类型之字符串与切片(2)
目录 字符串操作删除 (Delete)连接 (Concatenate)字符串转义前情回顾: Rust—复合数据类型之字符串(1) 字符串操作 删除 (Delete) 删除方法仅适用于 String 类型,分别是: pop(),remove(),truncate(),clear(),此外还有drain() 方法。 pop 方法:pop() 方法返回一个 O…...

iOS 应用内网络请求设置代理
主要通过URLSessionConfiguration 的connectionProxyDictionary 属性 为了方便其他同学使用,我们可以通过界面来进行设定(是否开启代理、服务端、端口),从而达到类似系统上的设定 具体链接参考:为 iOS 网络请求设置代理…...
什么是MariaDB
2024年4月6日,周六晚上 今晚在Debian12上安装mysql时,运行后却发现是MariaDB MariaDB是一个开源的关系型数据库管理系统(RDBMS),它是MySQL的一个分支和替代品。MariaDB由MySQL的原始开发者之一Michael "Monty&qu…...

【面试八股总结】传输控制协议TCP(三)
参考资料 :小林Coding、阿秀、代码随想录 一、TCP拥塞控制⭐ 1. 慢启动 – Slow Start 慢启动是指TCP连接刚建立,一点一点地提速,试探一下网络的承受能力,以免直接扰乱了网络通道的秩序。 慢启动算法: 初始拥塞窗口…...

今年过去了多少天?(switch)
//今年已经过去了几天? #include <stdio.h> int monthday(int year,int month){switch(month){case 1:return 31;case 2:if ((year % 4 0 && year % 100 ! 0)||year % 400 0){return 29;}else{return 28;}break;case 3:return 31;case 4:return 30;…...

提升团队工程交付能力,从“看见”工程活动和研发模式开始
作者:张裕、雅纯 理想中的研发团队应当具有以下特征: 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力,以便能够正确评估优先级࿰…...

前端学习之DOM编程案例:全选反选案例
代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>全选反选</title> </head> <body><input type"checkbox" id"all">全选<ul><li><…...
golang map
1.底层实现 2.如何解决hash冲突 3.扩容机制 4.无序 5.非线程安全 6.不可寻址 runtime/map.go 1.底层实现 底层基于hash表实现,实现有2个结构体hmap,bmap,map由若干个桶存储,每个桶存8个元素,使用链地址解决hash冲突 …...
设计模式:享元模式案例
让我们以游戏开发中的棋类游戏(例如国际象棋)为例来展示享元模式的代码实现。在这个例子中,棋子的类型是内部状态,而棋子的位置是外部状态。 Java 代码示例 import java.util.HashMap; import java.util.Map;// 享元接口 interf…...
pandas(day5)
一. 检测重复值 1.1 检测 data pd.read_csv("./teacher/订单数据.csv")检测行与行之前是否有重复值 data.drop_duplicates()检测 列是否有重复值出现, keep first 从前往后判定 , last是从后往前判定data.drop_duplicates(subset["产…...

如何注册midjourney账号
注册Midjourney账号比较简单,准备好上网工具,进入官网 Midjourney访问地址: https://www.midjourney.com/ 目前没有免费使用额度了,会员最低 10 美元/月,一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…...

探索数据结构:特殊的双向队列
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…...
16_I2C库函数
I2C库函数 1.void I2C_DeInit(I2C_TypeDef* I2Cx);2.void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);3.void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);4.void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);5.void I2C_DMACmd(I2C_Type…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...