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地址和目的地址。
这种差错检验的检错能力不强,但是简单,速度快

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aa1928992772/article/details/85240358

智能推荐

谈谈对服务化的理解-程序员宅基地

文章浏览阅读391次,点赞5次,收藏5次。首先:服务化是什么,为什么要服务化服务化是一种将业务、功能或流程抽象为服务的设计方法,通过服务之间的协作和调用来实现系统的整合和复用。它可以提高系统的可维护性和扩展性,主要用来构建分布式系统。然后:怎样服务化SOA和微服务都是实现了服务化的、比较典型的架构风格。SOA的出现是为了解决功能复用的问题,将一些通用的模块提取出来做成服务。但是SOA对于通用模块的设计没有设计核心原则,因此在对应需求变化等...

关于thinkphp的__construct和_initialize-程序员宅基地

文章浏览阅读128次。先说一下__construct吧,construct是php的构造函数,每次new这个类的时候会运行这个函数,子类继承父类时,如果子类中没有construct的时候,会自动调用父类的,如果有,则调用子类的,如果想调用父类的要加parent::__construct()。_initialize()是thinkphp特有的函数,注意是只有一个下划线_而已!这个函数只会在此class有继承父类的..._call to protected yzh\baseclient::__construct() from context 'user\controlle

aes加密工具类-程序员宅基地

文章浏览阅读5.1k次。import javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;public class AesUtil {_aes加密工具类

enable cef support ffmpeg_cefpython ffmpeg-程序员宅基地

文章浏览阅读1.9k次。refefences:https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding这里有源码包列表。如果automate-git.py git下载失败,只能申请海外服务器。 Env precondition:Win 7+, VS2015u3, Win10.0.14393 SDK, Ninja 1...._cefpython ffmpeg

Spring @Scheduled定时任务每次执行两次_@scheduled执行两次-程序员宅基地

文章浏览阅读4.2k次。我所遇到定时任务每次执行两次,是因为:1、在spring配置中定义了bean,例如:<bean id="dyGoodsMQListener" class="com.XX.union.open.push.goods.mq.DYGoodsMQListener"/>2、在对象中又加了注解:@Componentpublic class DYGoodsMQListener ..._@scheduled执行两次

图像缩放双线性插值算法_缩放比例越大 双线性插值越大吗-程序员宅基地

文章浏览阅读3w次。插值算法对于缩放比例较小的情况是完全可以接受的,令人信服的。一般的,缩小0.5倍以上或放大3.0倍以下,对任何图像都是可以接受的。最邻近插值(近邻取样法):  最临近插值的的思想很简单。对于通过反向变换得到的的一个浮点坐标,对其进行简单的取整,得到一个整数型坐标,这个整数型坐标对应的像素值就是目的像素的像素值,也就是说,取浮点坐标最邻近的左上角点(对于DIB是右上角,因为它的扫描行是逆序存储的_缩放比例越大 双线性插值越大吗

随便推点

空格字符和空字符的区别_ascii码中的空格和空字符的区别-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏6次。在开发中看到需求上这样一条:报文头里面,允许输入空值的地方,要使用空格填充,即byte 0x20,不能使用byte 0x00。一开始完全不明白在说什么,经过查阅之后才明白过来:上述的0x20 和0x00指的是字符的ascii码16进制0x20, 十进制32:空格字符 指键盘上长长的那个键产生的字符而16进制0x00, 十进制0 :空字符 指字符串结尾系统自动_ascii码中的空格和空字符的区别

[1126]kerberos认证相关问题_keytab contains no suitable keys for lucanet@nyoco-程序员宅基地

文章浏览阅读2.6k次。文章目录HDP WARN ipc.Client: Exception encountered while connecting to the server : org.apache.hadoop.securikinit: Keytab contains no suitable keys for [email protected] while getting initial credentials原因:可能导致问题:解决方案:测试验证:HDP WARN ipc.Client: Exception encount_keytab contains no suitable keys for [email protected] while getting init

php7 phpize,安装phpize7.3-程序员宅基地

文章浏览阅读646次。1,背景在现有的ubuntu16.04中,装了好几个版本的PHP/etc/php/5.6/ 7.0/ 7.1/ 7.2/ 7.3/whereis phpphp: /usr/bin/php7.3 /usr/bin/php7.0 /usr/bin/php /usr/lib/php /etc/php /usr/include/php/usr/share/php7.3-bcmath /usr/share/..._php7.3 phpize

Mycat高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)_服务不可用了以后,keepalived会告诉haproxy不再往上转发了吗-程序员宅基地

文章浏览阅读639次。转载请注明出处:http://blog.csdn.net/l1028386804/article/details/76397064本文是在博文《Mycat之——Mycat集群部署(基于HAProxy + Mycat)》的基础上,实现高可用负载均衡,若还没有阅读博文《Mycat之——Mycat集群部署(基于HAProxy + Mycat)》,请先阅读博文《Mycat之——Mycat集群部署(基于..._服务不可用了以后,keepalived会告诉haproxy不再往上转发了吗

Flex 跨域访问解决方案_"<cross-domain-policy> <allow-access-from domain=\-程序员宅基地

文章浏览阅读108次。想让swf 文件在一台服务器上运行并且能够访问另一台服务器上的资源,这时就会遇到跨域问题,请看下面的解决方案。 写一个名字为 crossdomain.xml 的XML文件,这个方法是允许任何Flash都可以调用,放到被调用文件的网站根目录下:view plaincopy to clipboardprint?&lt;?xml version="1.0"?&gt; &lt;!DOCTYPE..._"

Java异常执行顺序(9/5/2018)_java的异常抛出顺序-程序员宅基地

文章浏览阅读722次。public class ExceptionDemo { public static void main(String[] args) throws TestException { try { Test(); System.out.println("无论如何都不执行"); } catch (T..._java的异常抛出顺序

推荐文章

热门文章

相关标签