UDP协议的详细解析「建议收藏」

UDP协议的详细解析「建议收藏」UDP数据报一、UDP的概述二、UDP的首部格式UDP校验

大家好,又见面了,我是你们的朋友全栈君。

UDP数据报

一、UDP的概述User Datagram Protocol,用户数据报协议
UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用分用以及差错检测

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的首部格式

UDP数据报分为首部用户数据部分,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中,UDP数据报文结构如图所示:
在这里插入图片描述
UDP首部有8个字节,由4个字段构成,每个字段都是两个字节,
1.源端口: 源端口号,需要对方回信时选用,不需要时全部置0.
2.目的端口:目的端口号,在终点交付报文的时候需要用到。
3.长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部)
4.校验和:检测UDP数据报在传输中是否有错,有错则丢弃。
该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0.
当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给应用进程。
如果接收方UDP发现收到的报文中的目的端口号不正确(不存在对应端口号的应用进程0,),就丢弃该报文,并由ICMP发送“端口不可达”差错报文给对方。

UDP校验

在计算校验和的时候,需要在UDP数据报之前增加12字节的伪首部,伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。
在这里插入图片描述
UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。

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

注意:
1.校验时,若UDP数据报部分的长度不是偶数个字节,则需要填入一个全0字节,但是次字节和伪首部一样,是不发送的。
2.如果UDP校验和校验出UDP数据报是错误的,可以丢弃,也可以交付上层,但是要附上错误报告,告诉上层这是错误的数据报。
3.通过伪首部,不仅可以检查源端口号,目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址。
这种差错检验的检错能力不强,但是简单,速度快

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133816.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Laravel框架_php laravel框架

    Laravel框架_php laravel框架laravel框架一、laravel简介laravel是一套优雅简介的PHP开发框架,受欢迎程度非常之高,功能强大,工具齐全;https://www.jianshu.com/p/206592c78113二、简单介绍1、laravel是基于mvc模式的php框架,m——模型层,v——视图层,c——控制器层;以下为laravel框架的目录文件,框出来的文件目录将在后续中用到:2、什么是MV…

    2022年10月22日
  • windows实现mysql读写分离[通俗易懂]

    一、主服务器(master)配置1、修改MySQL配置文件my.ini[mysqld]log-bin=mysql-bin#开启主从复制,主库的配置log-bin-index=mysql-bin.indexserver-id=1#指定主库serverid,主库的id要比从库的id小sync_binlog=1binlog_format=mixed

  • webstorm2021.10激活码mac[最新免费获取]

    (webstorm2021.10激活码mac)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 一台计算机如何安装2个版本的python,互不影响呢[通俗易懂]

    一台计算机如何安装2个版本的python,互不影响呢[通俗易懂]python学习过程中,很多教程都是python2版本的但是python2到2020年就不在维护了,所以现在教大家如何在一台计算机上安装python2和python3互不影响,可以自如的切换。不用任何第三方软件简单省力,一次配置就可。第一步下载适合自己电脑的安装包32还是64按照自己的电脑来:python2.7.13和python3.6先安装哪一个版本无所谓。不…

  • android中彻底退出App的办法「建议收藏」

    android中彻底退出App的办法「建议收藏」所谓的“彻底退出App”的含义是包括释放所有Appnew出来的东西,比如说某些正在运行的线程、定时器之类的。需要注意的是:finish()方法是作用于Activity,因此,即使finish了app的最后一个Activity,app在运行过程中new出来的那些线程什么的仍然有可能在运行(如果没有明显的代码导致它们退出的话)。因此,要所谓”彻底退出“,个人的看法是在最后一个finish()…

  • 通用计算机指令,计算机移位指令[通俗易懂]

    通用计算机指令,计算机移位指令[通俗易懂]移位指令移位指令对操作数按某种方式左移或右移,移位位数可以由立即数直接给出,或由CL间接给出。移位指令分一般移位指令和循环移位指令。1一般移位指令(1)算术/逻辑左移指令。格式:SALDEST,OPRDSHLDEST,OPRD功能:按照操作数OPRD规定的移位位数,对目的操作数进行左移操作,最高位移入CF中。每移动一位,右边补一位0。如图312(a)所示。目的操作数可以为通用寄存器或存储…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号