网络应用层和传输层
网络中有很多协议这些协议的不同导致了分层这一现象,不同层的主要功能不一样。
应用层:应用程序。数据具体如何使用
传输层:关注起点和终点
网络层:关注路径规划
数据链路层:关注相邻节点的转发
物理层:硬件设备
应用层
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…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
