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

【JavaEE精炼宝库】网络原理基础——UDP详解

文章目录

  • 一、应用层
  • 二、传输层
    • 2.1 端口号:
    • 2.2 UDP 协议:
      • 2.2.1 UDP 协议端格式:
      • 2.2.2 UDP 存在的问题:
    • 2.3 UDP 特点:
    • 2.4 基于 UDP 的应用层协议:

一、应用层

我们 Java 程序员在日常开发中,最经常与应用层打交道,在应用层一般是使用 HTTP 协议与自定义协议。

如何自定义协议?
答:

  1. 确定传输信息。
  2. 确定数据格式(xml、json、yml、protobuffer)。

二、传输层

负责数据能够从发送端传输接收端。

2.1 端口号:

端口号(Port)标识了一个主机上进行通信的不同的应用程序。
在这里插入图片描述

  • 端口号范围划分:

端口号是两个字节无符号整数(0 ~ 65535)。

  1. 0 ~ 1023 知名端口号: HTTP、FTP、SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。
  2. 1024 ~ 65535 操作系统动态分配的端口号: 客户端程序的端口号,就是由操作系统从这个范围分配的。
  • 常见知名端口号(well-know port Number)了解即可:
  1. ssh 服务器,使用 22 端口。

  2. ftp 服务器,使用 21 端口。

  3. telnet 服务器,使用 23 端口。

  4. http 服务器,使用 80 端口。

  5. https 服务器,使用 443 端口。

我们自己写一个程序使用端口号时,要避开这些知名端口号。

  • 端口号的两个常见问题:
  1. 问题1:一个进程是否可以同时绑定多个端口号?
    答:可以。这个是非常可行的,而且在日常开发中经常使用到。举个栗子:一个服务器绑定两个端口,一个端口给普通用户使用,另一个端口给程序员 + 运营人员使用,以便进行日常维护,两个端口的功能可以是不一样的。

  2. 问题2:一个端口号是否可以同时被多个进程绑定?
    答:不能。好比“一山不容二虎,除非一公一母。”如果一个服务器是 TCP,一个是 UDP 此时,端口号即使在同一时刻重复了,是不影响的(一公一母),但是如果两个 TCP 或者两个 UDP,在同一时刻,使用同一个端口号,就会出现绑定失败的情况。

2.2 UDP 协议:

2.2.1 UDP 协议端格式:

下面 16 位指的是 16个bit 位。
在这里插入图片描述

  • 16 位 UDP 长度,表示整个数据报(UDP 首部 + UDP 数据)的最大长度。
  • 如果校验和出错,就会直接丢弃。
  • 各个术语在下面会做出详细介绍。

上面那张图由于排版问题,画的不是很好,下面我给出一张更加清晰的图:
在这里插入图片描述
一个 UDP 数据报由报头和载荷构成。

  • 源端口号:发送端的端口号。
  • 目的端口号:接收方的端口号。
  • UDP 长度:整个 UDP 数据报占多少个字节。
  • UDP 校验和(UDP Checksum):UDP 校验和是用于检测 UDP 数据报在传输过程中是否发生错误的一种机制。 举个栗子:如果发送方计算得到的校验和为 0x1234,接收方接收到数据后按照相同的算法计算校验和,在传输的过程中可能会出现 bit 翻转的情况,如果结果也为 0x1234,则说明数据在传输过程中没有发生错误。

UDP 中使用 CRC 算法来作为计算校验和的算法。 CRC 是一个简单粗暴的计算校验和的方式,循环冗余校验(校验和不是为了得到确切的值,只是为了判断算出来得值是否一样)。例如:设定 2 个字节得变量,把数据得每个字节取出来往这个变量上进行累加。如果结果溢出超过 2 个字节,溢出部分舍弃。

2.2.2 UDP 存在的问题:

UDP 长度描述了整个 UDP 数据报占的字节数,通过 UDP 长度,就能知道载荷一共是多少字节(全部的字节数 - 报头字节数)。

无符号 2 字节数的范围为:0 ~ 65535(1024 * 64)。也就是说一个 UDP 数据报最长就是 64 KB,不能再长了。对于现在来说有点短,随便拿手机拍个照片,10 MB左右,所以使用 UDP 开发程序会有很大的制约。最好的解决方法是将 UDP 改写成 TCP,TCP 对于应用层数据包的大小是无限制的。

既然 UDP 有上面的长度限制,那么为什么不对 UDP 进行升级呢?

答:这里的升级难点不在于技术,而是 zz 问题,升级到更高的字节数,成本很高。单个主机升级是没有意义的,需要对端一起升级(不然会出现解析错误的情况),由于 UDP 是系统内核实现的,如果全世界都是使用同一个操作系统,升级的成本还会小一点,但是市面上存在各种各样的操作系统,很难统一升级。

2.3 UDP 特点:

UDP 传输的过程类似于寄信。

其特点有:

  • 无连接: 知道对端的 IP 和端口号就直接进行传输,不需要建立连接(存储对方信息)。
  • 不可靠传输: 没有确认机制,没有重传机制。如果因为网络故障该段无法发到对方,UDP 协议层也不会给应用层返回任何错误信息。
  • 面向数据报: 不能够灵活的控制读写数据的次数和数量。

2.4 基于 UDP 的应用层协议:

  • NFS:网络文件系统。

  • TFTP:简单文件传输协议。

  • DHCP:动态主机配置协议。

  • BOOTP:启动协议(用于无盘设备启动)。

  • DNS:域名解析协议。

当然,也包括我们自己写 UDP 程序时自定义的应用层协议。

结语:
其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QT实现一个系统参数管理窗口
  • 深入理解单元测试与JUnit:从基础概念到实践操作
  • 计算机网络408考研 2014
  • 解密RCE漏洞:原理剖析、复现与代码审计实战
  • Android.mk(TODO)
  • 秋招复习笔记——八股文部分:网络IP
  • 09.XSS跨站脚本攻击(超详细!!!)
  • 充电不再难,高质量充电体系‘智’领绿色出行新时代
  • Mathtype安装教程/常见使用问题及快捷键大全
  • linux 011 注释13:缺页中断,新设计艺术团队第二版,第四章 4-39 至 4-
  • 大学生实验报告模板分享
  • java关于前端传布尔值后端接收一直为false问题
  • 公交车辆4G无线视频监控系统应用解决方案(视频监控统一接入平台)
  • 部署伪分布式 Hadoop集群
  • 【算法 03】雇佣问题
  • [译]如何构建服务器端web组件,为何要构建?
  • 【EOS】Cleos基础
  • 2017-08-04 前端日报
  • bearychat的java client
  • CentOS7简单部署NFS
  • happypack两次报错的问题
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 奇技淫巧
  • Java超时控制的实现
  • JDK 6和JDK 7中的substring()方法
  • ReactNativeweexDeviceOne对比
  • socket.io+express实现聊天室的思考(三)
  • spring security oauth2 password授权模式
  • VuePress 静态网站生成
  • 好的网址,关于.net 4.0 ,vs 2010
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 每天10道Java面试题,跟我走,offer有!
  • 漂亮刷新控件-iOS
  • 我感觉这是史上最牛的防sql注入方法类
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​linux启动进程的方式
  • ​字​节​一​面​
  • !!java web学习笔记(一到五)
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #70结构体案例1(导师,学生,成绩)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (30)数组元素和与数字和的绝对差
  • (Charles)如何抓取手机http的报文
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (转)VC++中ondraw在什么时候调用的
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .form文件_一篇文章学会文件上传
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net经典笔试题