java udp 协议_网络协议 - UDP 协议详解

¶ 网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛,所以也有必要对UDP协议进行详解。@pdai

¶ UDP概述

UDP(User Datagram Protocol)即用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。

¶ UDP特点

UDP提供不可靠服务,具有TCP所没有的优势: UDP无连接,时间上不存在建立连接需要的时延。空间上,TCP需要在端系统中维护连接状态,需要一定的开销。此连接装入包括接收和发送缓存,拥塞控制参数和序号与确认号的参数。UCP不维护连接状态,也不跟踪这些参数,开销小。空间和时间上都具有优势。

举个例子: DNS如果运行在TCP之上而不是UDP,那么DNS的速度将会慢很多。

HTTP使用TCP而不是UDP,是因为对于基于文本数据的Web网页来说,可靠性很重要。

同一种专用应用服务器在支持UDP时,一定能支持更多的活动客户机。

分组首部开销小,TCP首部20字节,UDP首部8字节。

UDP没有拥塞控制,应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率。某些实时应用要求以稳定的速度发送,能容 忍一些数据的丢失,但是不能允许有较大的时延(比如实时视频,直播等)

UDP提供尽最大努力的交付,不保证可靠交付。所有维护传输可靠性的工作需要用户在应用层来完成。没有TCP的确认机制、重传机制。如果因为网络原因没有传送到对端,UDP也不会给应用层返回错误信息

UDP是面向报文的,对应用层交下来的报文,添加首部后直接乡下交付为IP层,既不合并,也不拆分,保留这些报文的边界。对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程,报文不可分割,是UDP数据报处理的最小单位。

正是因为这样,UDP显得不够灵活,不能控制读写数据的次数和数量。比如我们要发送100个字节的报文,我们调用一次sendto函数就会发送100字节,对端也需要用recvfrom函数一次性接收100字节,不能使用循环每次获取10个字节,获取十次这样的做法。

UDP常用一次性传输比较少量数据的网络应用,如DNS,SNMP等,因为对于这些应用,若是采用TCP,为连接的创建,维护和拆除带来不小的开销。UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)数据的可靠传输对他们而言并不重要,TCP的拥塞控制会使他们有较大的延迟,也是不可容忍的

UDP 支持一对一、一对多、多对一和多对多的交互通信。

还要注意的是: IP 数据报要经过互连网中许多路由器的存储转发;UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。

UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。

3422cca8670faa1941bfd18cf03a9277.png

¶ UDP的首部格式

在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。

823f75281e9efc60d29f64002a749b5a.png 源端口: 占16位、源端口号。在需要对方回信时选用。不需要时可用全0。

目的端口: 占16位、目的端口号。这在终点交付报文时必须使用。

长度: 占16位、UDP用户数据报的长度,其最小值是8(仅有首部)。

检验和: 占16位、检测UDP用户数据报在传输中是否有错。有错就丢弃。

请注意,虽然在 UDP 之间的通信要用到其端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字。

¶ UDP校验 UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。

发送方,首先是把全零放入校验和字段并且添加伪首部,然后把UDP数据报看成是由许多16位的子串连接起来,若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(此字节不发送),接下来就按照二进制反码计算出这些16位字的和。将此和的二进制反码写入校验和字段。在接收方,把收到得UDP数据报加上伪首部(如果不为偶数个字节,还需要补上全零字节)后,按二进制反码计算出这些16位字的和。当无差错时其结果全为1,。否则就表明有差错出现,接收方应该丢弃这个UDP数据报。

下图是计算UDP校验和的例子:

088fe41a7b6e49d460d8ba46c1a0d752.png

注意: 校验时,若UDP数据报部分的长度不是偶数个字节,则需要填入一个全0字节,但是次字节和伪首部一样,是不发送的。

如果UDP校验和校验出UDP数据报是错误的,可以丢弃,也可以交付上层,但是要附上错误报告,告诉上层这是错误的数据报。

通过伪首部,不仅可以检查源端口号,目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址。

这种差错检验的检错能力不强,但是简单,速度快。

¶ 參考文章 https://blog.csdn.net/dog250/article/details/6896949

https://blog.csdn.net/qq_42196196/article/details/83956689

https://cloud.tencent.com/developer/article/1004554

https://blog.csdn.net/aa1928992772/article/details/85240358

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

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

相关文章

java 8 foreach_Java 8 forEach Stream()与旧版forEach循环

我正在尝试使用Spring的示例代码.部分代码如下所示;private List points;long timeTakeninMilis System.currentTimeMillis();public List getPoints() {return points;}public void setPoints(List points) {this.points points;}public void drawJava8() {point…

java list 超出范围_java-列索引超出范围:2,列数1

我有这个表:学生CREATE TABLE IF NOT EXISTS Klas_student(Student varchar(7) REFERENCES studenten (Studentenummer) ON DELETE CASCADE NOT NULL,Klas text NOT NULL REFERENCES Klas (Naam_id) ON DELETE CASCADE NOT NULL);在此表格中,我想添加值,我使用prepa…

java 写入指定路径文件_java对指定目录下文件读写操作介绍 | 学步园

最近因为项目的国际化的需要,需要对整个项目的100来个插件做国际化,这是一件痛苦的事情,因为纯体力劳动。为了省点工作量,想着能不能写个程序批处理了,减少点工作量,于是就有了下面的代码。1.读取指定的(.j…

点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能

最近在开发浏览器碰到这么一个需求:点击地址栏的时候,需要全选并调出键盘,再次点击就取消全选显示光标。点击屏幕除地址栏其他位置时,键盘隐藏,隐藏光标。大部分浏览器都是这样的逻辑,这样可以提高用户体验…

java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

RSA的应用RSA是一种非对称加密算法。现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥测试代码public static void main(String args[]){try {RS…

java线程卡住排查_基于 Java 线程栈 排查问题

除日志外,还有没有别的方式跟踪线上服务问题呢?或者,跟踪并排除日志里无法发现的问题?方法当然是有的,就是通过现场快照定位并发现问题。我们所说的现场,主要指这两方面:Java 线程栈。线程栈是J…

java实验二答案天津商业大学_天津商业大学信息安全实验一

天津商业大学信息安全实验一 1《信息安全技术》实 验 报 告 书实验名称: 实验一Internet应用风险专 业: 电子商务班 级: 1203班姓 名: 代常发学 号: 20124934指导老师: 丁雷信息工程学院2015 年 5 月2目 录…

java前端的日期插件_几个前端时间插件总结

几个前端时间插件总结总结一下几款时间插件,分别是- [ ] jeDate 手册http://www.jemui.com/jedate/- [ ] bootstrap-datetimepicker 下载地址- [ ] My97DatePicker 下载地址- [ ] jQuery UI 插件Datepicker下载地址并没有哪款完全超越另外一款,主要还是看…

t3s java_关于JAVA的this关键字

网上对this的描述很朦胧,有的说this表示的是当前对象自己,有的说this是当前对象的引用。可是自己写了如下的测试代码,产生了几个问题:1 public class T3AboutThis {23 public static void main(String[] args) {4 new…

Java插件自动保存浏览器书签_多浏览器书签同步插件EverSync

有时上网时会遇到浏览器不能正常显示的问题。(比如我的火狐浏览器无法正确显示微信公众号管理后台,在chrome上可以正常显示),所以我的电脑里安装了chrome和firefox两个浏览器。但是时间长了,会出现两个浏览器上书签不同步的问题。原来自己的解…

java连接并操作redis_java 使用 jedis 连接 redis 并进行简单操作

packagetest;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importorg.junit.Test;importredis.RedisUtil;importredis.clients.jedis.Jedis;public classRedisTest {private RedisUtil redisUtil newRedisUtil();//字符串操作…

java将异常输出到日志_【ThinkingInJava】25、将异常输出记录到日志

/*** 书本:《Thinking In Java》* 功能:将异常输出记录到日志中。* 文件:LoggingExceptions.java* 时间:2015年4月8日21:11:51* 作者:cutter_point*/package Lesson12_error_handling_with_exceptions;import java.io.PrintWriter;import java.io.StringWriter;import java.uti…

2013年蓝桥杯软件大赛预赛java本科b组答案_2013年蓝桥杯软件大赛预赛C本科B组试题...

第四届“蓝桥杯”全国软件专业人才设计与创业大赛选拔赛结果题目标题: 高斯日记大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道…

java script的trim_Javascript中实现trim()函数的两种方法

在JavaScript中我们需要用到trim的地方很多,但是JavaScript又没有独立的trim函数或者方法可以使用,所以我们需要自己写个trim函数来实现我们的目的。方案一:以原型方式调用,即obj.trim()形式,此方式简单且使用方面广泛…

hive mysql集群安装_HIVE完全分布式集群安装过程(元数据库: MySQL)

[rootnode01 mysql]# mysql -u hive -pEnter password:mysql> create database hive;Query OK, 1 row affected (0.00 sec)mysql> use hive;Database changedmysql> show tables;Empty set (0.00 sec)3)解压缩hive安装包tar -xzvf hive-0.9.0.tar.gz[hadoopnode01 ~]$…

php海外研发,国外主流PHP框架比较

【IT168技术分析评论】最近简单的使用了目前在国内用的比较多的几个主流国外PHP框架(不包括国内框架),大致对这些框架有个直观上的感受,简单分享一下,对于哪些做框架选型的时候,权当一个参考。主要参考的框架包括:Code…

php 正则提取日期,PHP正则匹配日期和时间(时间戳转换)的实例代码

先来一个比较简单实用的代码日期YYYY-MM-DD$str "";$isMatched preg_match("/^d{4}(-|/|.)d{1,2}1d{1,2}$/", $str, $matches);var_dump($isMatched, $matches);php需要一定的时间格式才能转换成时间戳(表示从格林威治时间1970年01月01日00时00分00秒起至…

php7生命周期,PHP 的生命周期与模块的sapi 原理

PS : SAPI:php所提供与其他程序的接口。先说说sapi 这是应用层与核心层的桥梁,用翻译的方式来做个比较恰当的比喻吧。这是一个中国人 名字叫Code这是叫做php-cli的英语翻译,擅长体育翻译这是个叫做php-cgi的翻译,擅长画…

php分解质因数,用PHP如何实现将一个整数分解为质因数的积?

先对数字进行因式分解算法再过滤结果集中,不符合的结果集。class Helper{public function chechPrime($num){for ($i floor(sqrt($num)); $i > 1; --$i) {if ($num % $i 0) {return false;}}return true;}public function getFactorNumber(array &$result,…

php oracle 中文字段,怎么解决php oracle乱码问题

php oracle乱码是由于没有正确的配置字符集信息导致的,其解决办法就是通过PLSQL运行“select * from V$NLS_PARAMETERS;”获取oracle的字符集,并重新设置正确的字符集即可。PHP Oracle 中文乱码问题通常缺省配置连接Oracle在处理中文时都会遇到乱码问题&…