JAVAEE值之网络原理(1)_用户数据报协议(UDP)、概念、特点、结构、代码实例

前言

 在前两节中我们介绍了UDP数据报套接字编程,但是并没有对UDP进行详细介绍,本节中我们将会详细介绍传输层中的UDP协议。


一、什么是UDP?

 UDP工作在传输层,用于程序之间传输数据的。数据一般包含:文件类型,视频类型,jpg图片等。

1.1 基本概念:

UDP 的全称: 用户数据报协议(UDP,User Datagram Protocol),UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。如果程序员选择的是 UD, 而不是 TCP 的话,那么该应用程序相当于就是和 IP 直接打交道的。
 从应用程序传递过来的数据,会附加上多路复用/多路分解的源和目的端口号字段,以及其他字段,然后将形成的报文传递给下一层(网络层),网络层将传输层报文段封装到 IP 数据报中,然后尽力而为的交付给目标主机。最关键的一点就是,使用 UDP 协议在将数据报传递给目标主机时,发送方和接收方的传输层实体间是没有握手的。正因为如此,UDP 被称为是无连接的协议

1.2 UDP的特点

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

无连接

 知道对端的IP和端口号就直接进行传输,不需要建立连接。

不可靠

 没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;

面向数据报

 应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。比如:用UDP传输100个字节的数据:

如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节;而不能循环接收10次, 每次接收10个字节。

缓冲区

UDP只有接收缓冲区,没有发送缓冲区:

  1. UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
  2. UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃;

大小受限

 UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)

二、UDP 报文结构

 如下图所示: UDP 的报文结构,每个 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2 字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值
在这里插入图片描述

16位源端口号(Source Port) :

 这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选项,有时不会设置源端口号。没有源端口号就默认为 0 ,通常用于不需要返回消息的通信中。

16位目标端口号(Destination Port)

表示接收端端口,字段长为 16 位。

长度

 该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8,最大长度为 65535 字节。

16位校验和(Checksum)

 UDP 使用校验和来保证数据安全性,UDP 的校验和也提供了差错检测功能,差错检测用于校验报文段从源到目标主机的过程中,数据的完整性是否发生了改变。常见的检验方法:循环冗余检测(CRC)。

  • 为什么 UDP 会提供差错检测的功能?
     这其实是一种 端到端 的设计原则,这个原则说的是要让传输中各种错误发生的概率降低到一个可以接受的水平。
  • 如何基于校验和来完成数据校验呢?
  1. 发送方,把要发送的数据整理好(称为 data1),通过一定的算法,计算出校验和 checksum1
  2. 发送方把 data1 和 checksum1 一起通过网络发送出去.
  3. 接收方收到数据, 收到的数据称为 data2(数据可能和 data1 就不一样了),收到数据cHecksum1
  4. 接收方再根据 data2 重新计算校验和 (按照相同的算法),得到 checksum2
  5. 对比 checksum1 和 checksum2 是否相同,如果不同, 则认为 data2 和 data1 一定不相同.如果checksum1 和 checksum2 相同,则认为 data1 和 data2 大概率是相同的(理论上存在不同的可能性,概率比较低,工程上忽略不计)

三、通过代码理解UDP的特点

3.1 无连接

UDP协议本身不会储存对端的信息,要在发送数据的时候,才会显示指定要传输给谁?

 DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress()); // 构造这个数据报,需要指定数据内容,也指定下一个数据报要发给谁socket.send(responsePacket);

3.2 不可靠

3.3 面向数据报

 DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress()); // 构造这个数据报,需要指定数据内容,也指定下一个数据报要发给谁socket.send(responsePacket);

3.4 全双工

 通过一个socket,既可以send,也可以receive.

	socket.send(requestPacket);// 3.尝试服务器返回的响应了DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);

上一节中的参考代码(https://blog.csdn.net/2301_80653026/article/details/139443856):

UDP客户端import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.channels.DatagramChannel;/*** @author Zhang* @date 2024/5/2015:38* @Description:*/
public class UdpEchoServer {//创建一个datagramSocket对象,这是后续操作网卡的基础private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {//此写法是手动指定端口socket = new DatagramSocket(port);// 此写法是让服务器自动分配端口// socket = new DatagramSocket();}//通过这个方法来启动服务器public void start() throws IOException {System.out.println("服务器启动");while(true){// 1. 读取请求并解析/***  DatagramPacket这个队形来承载从网卡这边读取的数据,*  收到的数据需要一个内存空间来保存这个数据*  DatagramPacket 内部不能自动分配空间,需要程序员手动创建,交给DatagramPacket进行处理*/DatagramPacket requestPacket  = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);   //当服务器一旦启动,就会立即执行receive方法,入伏哦客户端请求还没到,receive就会阻塞到客户端请求到达// 当完成receive后,数据以二进制的形式存储到DatagramPacket// 要想把这里的数据显示出来,好需要把这个二进制转变成字符串String request = new String(requestPacket.getData(),0,requestPacket.getLength());// 2.根据请求计算响应(一般服务器都会经理的过程)// 由于此处是回显服务器,请求是啥样,响应就是啥样String response = process(request);// 3. 把响应写会到客户端//      写一个响应对象,DatagramPacket//      往DatagramPacket 构造刚才数据,并通过 sent 返回DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());// 构造这个数据报,需要指定数据内容,也指定下一个数据报要发给谁socket.send(responsePacket);// 4.打印一个日志,把这次数据交互的详情打印出来System.out.printf("[%s:%d] req = %s, resp = %s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}public String process(String request){return request;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);server.start();}
}
服务端import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** @author Zhang* @date 2024/5/2015:38* @Description:*/
public class UdpEchoClient {private DatagramSocket socket = null;private  String serverIP = "";private  int serverPort = 0;public  UdpEchoClient(String ip,int port) throws SocketException {// 创建这个对象,不能手动指定端口socket = new DatagramSocket();//由于UDP自身不会持有对端的信息,就需要在应用程序里,吧对端的情况给记录下来serverIP = ip;serverPort = port;}public void start() throws IOException {System.out.println("客户端启动!");Scanner scanner = new Scanner(System.in);while (true){// 1.从控制台读取数据,作为请求System.out.print("->");String request = scanner.next();// 2. 把请求内容构造成 DatagramPacket 对象,发送给服务器DatagramPacket  requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,InetAddress.getByName(serverIP), serverPort);socket.send(requestPacket);// 3.尝试服务器返回的响应了DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);// 4.把响应转换成字符串,并先显示出来String response =  new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}
}

总结

UDP特点:无连接、不可靠、面向数据报、全双工。

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

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

相关文章

算法刷题笔记 区间和(离散化二分查找难题,带超详细注释的C++实现)详细解析

文章目录 题目描述详细思路C实现代码 题目描述 假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行n次操作,每次操作将某一位置x上的数加c。接下来,进行m次询问,每个询问包含两个整数l和r&#xf…

超图制作栅格数据集专题图示例

之前写过一两篇专题图的博文,是制作的矢量数据集的专题图; 有一个栅格数据集如下,不知是干嘛的,可能是一个地形,或水系; 看一下对栅格数据集制作专题图;能制作的专题图类型少些, 先…

R 文件优化插件:Binary XML file in layout Error inflating class

场景一:构造函数缺失 问题 自定义布局(FlagmentLayout)加载自定义属性失败,导致广告显示异常,甚至是闪退~ InflateException 在 Android 中我们遇到的通常发生在自定义 View 创建中,动态加载…

设置服务器禁止和ip通信

要禁止服务器与特定 IP 地址的通信,可以使用防火墙来设置规则。在 Ubuntu 上,iptables 是一个常用的防火墙工具。以下是使用 iptables 设置禁止与特定 IP 通信的步骤: 阻止所有进出的通信 如果你想阻止服务器与特定 IP 地址的所有通信&…

探索交互设计:五大关键维度全面剖析

交互式设计是用户体验(UX)设计的重要组成部分。在本文中,我将向大家解释什么是交互设计并简要描述交互设计师通常每天都做什么。 一、什么是交互设计 交互式设计用简单的术语来理解就是用户和产品之间的交互。在大多数情况下,当…

[linux] Qwen2Tokenizer报错 transformers版本问题

上午没问题,下午pull了新代码,就有了报错。。 发现是transformers版本问题。但。。其实我都默认安的是最新版本。。 也许这就是人生吧。。 报错: File "/Pai-Megatron-Patch/megatron_patch/tokenizer/__init__.py", line 213…

大白菜PE系统进入时一直 ACPI_BIOS_ERROR

安装系统PE不支持,主板不兼容,换个WIN10的PE就解决了,跟之前部分电脑需要WIN8的PE同理 WIN10PE教程 WIN8PE教程

CLIPSeg

作者回答问题敷衍,不建议复现

谷歌Google广告开户要提供什么材料?

谷歌Google广告是企业出海,触及全球潜在客户的必备渠道,无论您是初创公司还是成熟企业,想要在激烈的市场竞争中脱颖而出,有效利用谷歌广告的力量至关重要。云衔科技,作为数字化营销解决方案与SaaS软件服务商&#xff0…

区分前端HTML标签中的href和src

在前端HTML中,href和src是用于指定外部资源文件的属性。 href属性用于指定链接的目标地址,比如用于链接到外部CSS文件或者超链接到其他页面。src属性用于指定要嵌入到HTML中的外部资源文件,比如用于引入图片、脚本或者媒体文件。 尽管它们的…

const char * 和char *const ptr的区别

const char *ptr 此代码常量化的是*ptr,即 ptr 的内容值无法修改,但是ptr的值(指针指向)可以修改 char const *ptr 等效 const char *ptr char *const ptr 此代码常量化的是ptr,即 ptr 的值(指针指向&…

【Tkinter界面】Canvas 图形绘制(02/5)

文章目录 一、说明二、几何时使用 Canvas 组件2.1 用法2.2 简单范例2.3 对象移动2.4 对象删除2.5 文字对象显示 三、画布和画布对象3.1 画布生成函数原型3.2 使用create_xxx()方法3.3 对参数**options的解释 一、说明 Canvas(画布)组件为 Tkinter 的图形…

【打工日常】docker部署一款开源的笔记管理和协作工具

一、项目介绍1.项目简述Logseq 是一个隐私优先的开源知识库。2.项目功能插件系统:允许用户根据自己的需求扩展功能,社区开发的插件可以添加新特性或改进现有功能。主题和定制:支持主题定制,用户可以根据自己的喜好更改应用程序的外观。多语言支持:包括中文、英文、土耳其语…

多类型图像OCR:基于Dify的多模态Agent实现

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模…

介绍react

什么是React React是一个用于构建用户界面的JavaScript库。 传统构建页面的方式 <script>document.getElementById(app).addEventListener(click, () > {console.log()});const div docuemnt.createElement(div)// ... </script> 早期&#xff0c;用JavaSc…

医学文献如何获取

获取医学文献的主要渠道包括以下几种&#xff1a; 1、医学数据库: 包括PubMed、MEDLINE等&#xff0c;这些是专门收录医学文献的数据库&#xff0c;涵盖广泛的医学研究内容。 2、医学期刊网站: 通过医学期刊的官方网站可以获取最新的医学研究成果&#xff0c;有些期刊提供免费…

记录一下PHP使用微信小程序支付

记录一下PHP使用微信小程序支付V3版本经历 官方文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml 请详细查看文档中小程序支付接入前准备&#xff08;https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml&#xff…

仿element-ui 实现自己组件库 <3>

目录 input 组件封装 v-model用在组件上 显示和隐藏密码 封装switch组件 实现转换的功能 设置checkbox input 组件封装 首先input组件的基本框架和样式&#xff1a; <div class"miao-input"><input class"miao-input_inner" > </div…

网络编程(四)

一、使用wireshark抓包分析协议头 &#xff08;一&#xff09;wireshark常用的过滤语句 tcp.port <想要查看的端口号> ip.src <想要查看的源IP地址> ip.dest <想要查看的目的IP地址> ip.addr <想要查看的IP地址>&#xff08;二&#xff09;抓包分…