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

网络应用层和传输层

网络中有很多协议这些协议的不同导致了分层这一现象不同层的主要功能不一样。

应用层:应用程序。数据具体如何使用

传输层:关注起点和终点

网络层:关注路径规划

数据链路层:关注相邻节点的转发

物理层:硬件设备

应用层

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

 

相关文章:

网络应用层和传输层

网络中有很多协议这些协议的不同导致了分层这一现象&#xff0c;不同层的主要功能不一样。 应用层&#xff1a;应用程序。数据具体如何使用 传输层&#xff1a;关注起点和终点 网络层&#xff1a;关注路径规划 数据链路层&#xff1a;关注相邻节点的转发 物理层&#xff1…...

Vue3:优化-从响应式数据中获取纯数据

一、情景说明 我们知道&#xff0c;Vue3中&#xff0c;创建变量时&#xff0c;常用ref、reactive来包裹&#xff0c;这样&#xff0c;这个变量就是响应式数据 然而&#xff0c;有时候&#xff0c;我们只需要纯数据 例如&#xff0c;我们在调用后端接口的时候&#xff0c;我们只…...

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?

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

学习CSS Flexbox 玩flexboxfroggy flexboxfroggy1-24关详解

欢迎来到Flexbox Froggy&#xff0c;这是一个通过编写CSS代码来帮助Froggy和朋友的游戏! justify-content 和 align-items 是两个用于控制 CSS Flexbox 布局的属性。 justify-content&#xff1a;该属性用于控制 Flexbox 容器中子项目在主轴&#xff08;水平方向&#xff09;…...

springboot项目如何配置跨域?

在Spring Boot项目中配置跨域&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;主要是为了允许来自不同源&#xff08;不同的协议、域名或端口&#xff09;的前端应用能够访问后端API。Spring Boot提供了多种方式来配置跨域支持。 1. 使用CrossOrigin注…...

实现第一个动态链接库 游戏插件 成功在主程序中运行 dll 中定义的类

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

算法第三十九天-验证二叉树的前序序列化

验证二叉树的前序序列化 题目要求 解题思路 方法一&#xff1a;栈 栈的思路是「自底向上」的想法。下面要结合本题是「前序遍历」这个重要特点。 我们知道「前序遍历」是按照「根节点-左子树-右子树」的顺序遍历的&#xff0c;只有当根节点的所有左子树遍历完成之后&#xf…...

Rust---复合数据类型之字符串与切片(2)

目录 字符串操作删除 (Delete)连接 (Concatenate)字符串转义前情回顾: Rust—复合数据类型之字符串(1) 字符串操作 删除 (Delete) 删除方法仅适用于 String 类型,分别是: pop(),remove(),truncate(),clear(),此外还有drain() 方法。 pop 方法:pop() 方法返回一个 O…...

iOS 应用内网络请求设置代理

主要通过URLSessionConfiguration 的connectionProxyDictionary 属性 为了方便其他同学使用&#xff0c;我们可以通过界面来进行设定&#xff08;是否开启代理、服务端、端口&#xff09;&#xff0c;从而达到类似系统上的设定 具体链接参考&#xff1a;为 iOS 网络请求设置代理…...

什么是MariaDB

2024年4月6日&#xff0c;周六晚上 今晚在Debian12上安装mysql时&#xff0c;运行后却发现是MariaDB MariaDB是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支和替代品。MariaDB由MySQL的原始开发者之一Michael "Monty&qu…...

【面试八股总结】传输控制协议TCP(三)

参考资料 &#xff1a;小林Coding、阿秀、代码随想录 一、TCP拥塞控制⭐ 1. 慢启动 – Slow Start 慢启动是指TCP连接刚建立&#xff0c;一点一点地提速&#xff0c;试探一下网络的承受能力&#xff0c;以免直接扰乱了网络通道的秩序。 慢启动算法&#xff1a; 初始拥塞窗口…...

今年过去了多少天?(switch)

//今年已经过去了几天&#xff1f; #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;…...

提升团队工程交付能力,从“看见”工程活动和研发模式开始

作者&#xff1a;张裕、雅纯 理想中的研发团队应当具有以下特征&#xff1a; 总是工作在最高优先级的事项上 理想的研发团队能够识别并始终集中精力在当前最紧迫和最有价值的任务上。这需要团队具备出色的项目管理能力和决策能力&#xff0c;以便能够正确评估优先级&#xff0…...

前端学习之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表实现&#xff0c;实现有2个结构体hmap&#xff0c;bmap&#xff0c;map由若干个桶存储&#xff0c;每个桶存8个元素&#xff0c;使用链地址解决hash冲突 …...

设计模式:享元模式案例

让我们以游戏开发中的棋类游戏&#xff08;例如国际象棋&#xff09;为例来展示享元模式的代码实现。在这个例子中&#xff0c;棋子的类型是内部状态&#xff0c;而棋子的位置是外部状态。 Java 代码示例 import java.util.HashMap; import java.util.Map;// 享元接口 interf…...

pandas(day5)

一. 检测重复值 1.1 检测 data pd.read_csv("./teacher/订单数据.csv")检测行与行之前是否有重复值 data.drop_duplicates()检测 列是否有重复值出现&#xff0c; keep first 从前往后判定 &#xff0c; last是从后往前判定data.drop_duplicates(subset["产…...

如何注册midjourney账号

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

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;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终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...