【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

news2024/9/29 19:24:42

目录

🚩进一步讲应用层

🎈自定义应用层协议

🎈用什么格式组织

👩🏻‍💻xml(远古的数据组织格式)

👩🏻‍💻json(当下最流行得一种数据组织格式)

👩🏻‍💻protobuffer(使用二进制方式来组织数据)

🚩进一步讲传输层中UDP(重点)

 🎈UDP协议

👩🏻‍💻UDP报文长度 

👩🏻‍💻校验和

👩🏻‍💻代码中了解UDP特点

👩🏻‍💻基于UDP的应用层协议


🚩进一步讲应用层

🎈自定义应用层协议

在应用层这里,很多时候,都是程序员“自定义”应用层协议的。

就是自己定义协议,约定好数据如何传输。

  • 1.根据需求,明确要传输的信息
  • 2.约定好信息按照什么格式来组织

点外卖:点开外卖软件,首先会看到商家列表,这里就涉及到程序和服务器之间进行的网络通信交互。

客户端请求:用户信息,位置信息 (此处假设就使用简单的格式来组织,使用文本的方式,三个属性,使用","来分割。

1000,100,30

服务器响应:商家列表(多个商家),每个商家,包含 名称,图片,距离,简介,评分。

此处假设使用简单格式来组织,使用文本格式,每个商家信息占一行,每个属性使用“,”来分割。

上述的过程就是自定义协议,自定义协议,具体的方式,也是非常灵活的,针对这里的情况,使用啥样的格式来组织,都ok,只要客户端和服务器这边都能够对应上即可。(上述通过行文本方式构造的协议,属于比较粗糙的方式)


🎈用什么格式组织

👩🏻‍💻xml(远古的数据组织格式)

通过标签来组织数据

<request>
    <userid>1000</userid>
    <position>100,30</position>
</request>

HTML属于xml的变种

xml是一个通用的数据格式,这里有啥标签,标签有啥含义,都是程序员自定义的

html则是一个专属的数据格式,有啥标签,标签是啥含义,都是有一个标准委员会,规定好的。<a>超链接 <img>图片 <input>输入框 <li>有序列表

xml优势:让数据的可读性变得更好了

xml劣势:标签写起来非常繁琐,传输得时候也占用更多网络宽带


👩🏻‍💻json(当下最流行得一种数据组织格式)

{
    userid:"1000",
    position:"100,30"
}

键值对结构:{}把所有的键值对给包裹起来。键值对之间,使用","分割,键和值之间,使用":"分割。键固定就是string类型,值得话可以是数字,可是是字符串,也可以是json,还可以是数组。

json优势:可读性比较好得,比xml更简洁

json劣势:同样也是会在网络传输中,消耗额外得带宽(需要把key也进行传输)


👩🏻‍💻protobuffer(使用二进制方式来组织数据)

pb的优势:占用带宽最低,传输效率最高,非常适合于对于性能要求比较高的场景。

pb的劣势:可读性不好(二进制结构,肉眼无法阅读),一定程度上影响开发的效率。


相对于计算机的执行效率来说,对于程序员,开发效率是最重要的。


🚩进一步讲传输层中UDP(重点)

  • UDP:无连接,不可靠,面向数据报,全双工
  • TCP:有连接,可靠传输,面向字节流,全双工

端口号:

  • 写一个服务器,必须手动指定一个端口号,通过端口号来区分当前主机上的不同的应用程序
  • 写一个客户端,客户端在通信的时候也会有一个端口号(代码感受不到),系统自动分配。(如果指定端口号发现和自己主机的程序的端口号一样,那么就冲突了)

端口号固定占2个字节,表示的数据范围0--65535,一般来说,0是不用的。

  • 1-1023 称为“知名端口号”

      

  • 1024-65535 普通端口号(不要冲突即可)

 🎈UDP协议

学习一个协议,其中最主要的工作,就是去理解协议报文格式。


👩🏻‍💻UDP报文长度 

 UDP报文长度,是2个字节,16位表示的数据,表示的范围是0-65535=》64kb

UDP报文长度有限制64k

我们知道搜狗的浏览器有些网页下面会显式广告俩字,由于业务的发展,广告越来越多了,广告的样式也越来越复杂了,导致商搜服务器和入口服务器之间交互的数据流,已经接近64kb,如果超过上限,数据就会出现截断,最终展示在页面上的数据肯定会出错的。

解决方法:

  • 1.把数据拆分成2个包,使用多个UDP数据报进行传输,这个方案,秒被否定(开发成本比较大),拆包,又如何组包呢。
  • 2.直接使用TCP,TCP没有包大小的限制(从这里可以说明,如果是大文件的话都是需要用到TCP,UDP是有包大小限制的)

👩🏻‍💻校验和

前提:网络传输中,由于一些外部干扰,就可能会出现数据传输出错的情况。

(光信号/电信号,磁场,电场,高能离子....某个地方本来是传输低电平,在干扰下就成了高电平了)因此我们就需要有办法,能够识别出出错的数据,校验和,就是这种的一种检查手段。

举个例子:

  • 就比如我去超市买菜,妈妈告诉我需要买 西红柿 鸡蛋 芹菜 黄瓜 四样菜,当我买完数数是5样,那么肯定是出错了,然后再数数是3样,发现买少了,继续进行校验。(这里我们用个数来表示校验机制,但是还不够,需要结合内容来计算)
  • 生活中都需要很多校验才能确保自己做的事情是否有错误。我们小时候计算一个题目需要通过校验来检查等等

校验和,其实本质上是一个字符串,体积比原始的数据更小,又是通过原始数据生成的。原始数据相同,得到的校验和就一定相同,反正,校验和相同,原始数据大概率相同。

如何基于校验和来完成数据校验呢?

  • 1.发送方,把要发送的数据整理好(称为data1),通过一定的算法,计算出checksum1
  • 2.发送方把data1和checksum1一起通过网络发送出去
  • 3.接收方收到数据,收到的数据称为data2(数据可能和data1就不一样了),收到数据checksum1
  • 4.接收方再根据data2重新计算校验和(按照相同的算法),得到checksum2
  • 5.对比checksum1和checksum2是否相同,如果不同,则认为data2和data1一定不相同, 如果checksum1和checksum2相同,则认为data1和data2大概率是相同的(理论上存在不同的可能性,概率比较低)

 校验和是怎么算的?

计算校验和,有很多算法

  • UDP中使用的是CRC算法(循环冗余算法)

把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这俩个字节的变量中,累加过程中如果溢出,也没关系。如果中间某个数据,出现传输错误,第二次计算的校验和就会和第一次不同。

CRC这个算法不是特别的靠谱,导致俩个不同的数据,得到相同的校验和概率比较大,比如如果前一个字节恰好少1,后一个字节恰好多1,但是最终得到相同的校验和。

  • md5 / sha1算法

1.定长:无论你的原始数据多长,计算得到的md5,都是固定长度。(校验和本身就不能太长,如果太长就不方便网络传输)

2.分散:给定两个原始数据,哪怕绝大部分内容都一样,只要其中一个字节不同,得到的md5值都会差异很大。md5也非常适合作为hash算法(哈希表是把一个key通过hash函数转换成数组下标,希望hash函数能够做到尽量分散,产生hash冲突的概率才会比较低)

3.不可逆:给你一定原始数据,计算md5,很容易,给你md5,还原出原始数据,计算量非常庞大,以至于超出了现有计算机的算力极限,理论上是不行的。md5也可以应用在一些密码学场景中。


👩🏻‍💻代码中了解UDP特点

1.面向数据报:

需要将数据用DatagramPacket对象存储起来

2.无连接:UDP本身是不会存储对端的信息,所以在发送的时候需要显式指定发送给谁

3.全双工:通过一个socket对象,既可以send,也可以接收

4.不可靠,代码中体现不出来


👩🏻‍💻基于UDP的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议
当然,也包括你自己写 UDP 程序时自定义的应用层协议

相比较于UDP,TCP更值得关注。期待下一篇TCP的详细解说。


 也许适当的休息和摆烂是为了更好的重新出发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1614558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

算法思想总结:栈

一、栈的经典应用&#xff1a;波兰表达式与逆波兰表达式 我们平时看到的 12*&#xff08;3-4*5&#xff09;6/7 叫做中缀表达式&#xff0c;平时我们习惯用这个计算的原因是我们可以整体地去看到这个表达式并且清楚地知道各个运算符的优先级&#xff0c;但是计算机并不一定知道…

JavaScript之模块化规范详解

文章的更新路线&#xff1a;JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题&#xff08;HTML基础知识和CSS基础知识已经更新完毕&#xff09; 正文 CommonJS、UMD、CMD和ES6是不同的模块…

详解爬虫基本知识及入门案列(爬取豆瓣电影《热辣滚烫》的短评 详细讲解代码实现)

目录 前言什么是爬虫&#xff1f; 爬虫与反爬虫基础知识 一、网页基础知识 二、网络传输协议 HTTP&#xff08;HyperText Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;请求过程的原理&#xff1f; 三、Session和Cookies Session Cookies Session与…

核桃派全志H616实现VNC远程桌面教程

VNC远程桌面 核桃派预装了VNC服务器&#xff0c;VNC适应于局域网&#xff08;通常指同一个路由器网络下&#xff09;桌面登录。使用该服务前先确保核桃派已经通过以太网或无线WiFi连接到路由器。 使用核桃派桌面系统的时候由于要配置各类信息和联网&#xff0c;可以使用HDMI显…

【C语言】每日一题,快速提升(5)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. strlen函数 2. strcpy函数 3. strcat函数 题目&#xff1a;模拟实现 strlen--strcpy--strcat--三个函数 1. strlen函数 字符串计算 #include <stdio.h…

硕士博士学位论文格式检查规范

包含标题、摘要、英文缩写、关键词、公式、表格、图片、参考文献&#xff0c;只能说太强了 学位论文检查三十六策点击蓝字 关注我们 写在前面 同学们撰写学位论文时&#xff0c;常常犯一些错误&#xff0c;既有格式错误&#xff0c;也有内容错误。本文列举36https://mp.weixin.…

【python】如何通过python来发送短信

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

SFP、SFP+、SFP28 与 QSFP28 收发器之间的差异:兼容性和性能

近年来&#xff0c;网络技术发展迅速&#xff0c;因此&#xff0c;计算专业人员面临着越来越令人困惑的术语和缩写词。 管理数据中心时必须了解的一个关键领域是收发器&#xff0c;特别是 SFP (1550nm/1310nm)、SFP (850nm) 和 QSFP28 (4x25G) 之间的差异。 这些型号在兼容性方…

【热门话题】常用经典目标检测算法概述

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 常用经典目标检测算法概述1. 滑动窗口与特征提取2. Region-based方法R-CNN系列M…

【日志】CSDN-AI助手升级日志

CSDN-AI助手升级日志 2023/04/05上线 支持点赞、收藏回访 关注回访&#xff08;对方至少有一条博客的记录&#xff09; 评论回访 私信检测到群发消息自动三连 OR 通过私信指令三连触发 bug优化 优化检测模式&#xff0c;防止出现多触发情况 为了防止操作额度不够&#xff0c…

Java面试八股之简述Servlet体系结构

简述Servlet体系结构 Servlet是Java Web开发中的核心组件&#xff0c;用于接收和响应HTTP请求&#xff0c;生成动态内容。它具有平台无关性、协议无关性和动态内容生成能力&#xff0c;遵循明确的生命周期。尽管现代Web开发中更多使用高级框架&#xff0c;但Servlet作为基础&a…

[笔试训练](二)

004 牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 使用向上取整函数ceil()&#xff0c;&#xff08;记得添加头文件#include<cmath>&#xff09; #include <iostream> #include <cmath> using namespace std;int main(…

基于SpringBoot+Vue的企业资产管理系统设计与实现

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要请联系

Ceph 分布式文件系统 搭建及使用

一、Ceph 介绍 在当今数据爆炸式增长的时代&#xff0c;企业对于可靠、可扩展的存储解决方案的需求日益迫切。Ceph 作为一种开源的、可伸缩的分布式存储解决方案&#xff0c;正逐渐成为企业级存储领域的热门选择。Ceph是一种由Radicalbit公司开发的开源分布式存储系统&#xf…

Visual Studio 2022 Professional、Enterprise安装教程

Visual Studio 2022 Professional、Enterprise安装教程 下载安装包安装 我是电脑已经有VS2019&#xff0c;现在加装一个VS2022。 下载安装包 首先下载安装包&#xff0c;进入官网进行下载&#xff0c;VS官网下载地址。 进入之后&#xff0c;会显示如下界面&#xff0c;选择Pro…

chrome插件 脚本 使用和推荐

chrome插件使用 在极简插件中可以进行下载并进行安装, 内部有安装教程在极简插件中搜索"油猴",下载一个油猴插件,并安装,可以用于下载很多的用户脚本用户脚本下载地址Greasy Fork,里面有很多实用的用户脚本供下载,并在油猴中进行管理 推荐的插件 Tampermonkey 篡改…

Linux进阶篇:centos7搭建jdk环境

Linux服务搭建篇&#xff1a;centos7搭建jdk环境 本文主要介绍的是如何是Linux环境下安装JDK的&#xff0c;关于jdk的概念就不做赘述了&#xff0c;相信大家都有所耳闻了&#xff0c;Linux环境下&#xff0c;很多时候也离不开Java的&#xff0c;下面笔者就和大家一起分享如何jd…

都2024年了,你还不知道git worktree么?

三年前 python 大佬吉多范罗苏姆(为 Python 程序设计语言的最初设计者及主要架构师)才知道 git worktree &#xff0c;我现在才知道&#xff0c;我觉得没啥丢人的。 应用场景 如果你正在 feature 的分支中开发新功能&#xff0c;线上版本紧急错误又需要你基于 master 做修复。…

DFS和回溯专题:组合总和

DFS和回溯专题&#xff1a;组合总和 题目链接: 39.组合总和 参考题解&#xff1a;代码随想录 题目描述 代码纯享版 class Solution {public List<List<Integer>> list_all new ArrayList();public List<Integer> list new ArrayList();public List<…