码迷,mamicode.com
首页 > 其他好文 > 详细

UDP -- 用户数据报协议

时间:2015-03-31 09:12:36      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:udp

UDP: User Datagram Protocol。 是 OSI 七层模型中的传输层的协议。 也是面向数据报的传输层协议。

UDP 的特点

UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。 并且它是将应用程序传递的数据在接收到的那一刻,立即按照原样发送到网络上的一种机制。

应用程序传递数据 ——> UDP 按照原样立即发送。

  • 不提供 数据包 的分组 和组装 (如果一次发送的数据过大怎么办?)
  • 传输过程中数据包出现丢包,也不会负责重发。
  • 接受法的数据包乱序到达的时候,也不提供排序功能。
  • 在出现网络拥堵的时候,无法进行流量控制来避免网络阻塞。

如果要实现这些细节控制,那么就应该 交由采用 UDP 的上层应用程序去处理。
UDP: 类似于用户(程序员?)说什么就做什么的机制。 (程序员让它发送什么就发送什么)。 反之, TCP 拥有各种各样的控制机制,所以它在发送数据的时候 未必 会按照程序员的编程思路来发送。(比如说,程序员想要发送一个数据包,但是可能TCP会对其进行分组,虽然这些对程序员是透明的)

由于 UDP 面向无连接的,所以 它可以随时发送数据。(不必知道对方是否存在)。 再加上UDP本身的处理既简单又高效,因此经常用于以下几个方面:

  1. 包总量较少的通信: DNS(域名系统)、SNMP(简单网络管理协议)、DHCP(动态主机配置)、RIP(路由信息协议)
  2. 视频音频等多媒体通信(即时通信领域):多媒体游戏,IP电话(VoIP)
  3. 限定于 LAN 等特定网络中的应用通信。
  4. 广播通信 (广播,多播)

百度百科上的一段有关 UDP 的描述非常好:摘下来

(1): UDP是一个面向无连接的协议,传输数据之前 客户端 和服务器 不必建立连接,当它想要传送数据的时候就 简单的抓取来自应用程序的数据,并尽可能快的把它扔到网上。
在发送端: UDP 传送数据的速度仅仅受应用程序生成数据的速度,计算机的能力和传输带宽的限制;
在接收端: UDP 把每个消息段(数据报) 放在队列中,应用程序每次从队列中读取一个消息段。

(2): 由于 传输数据不需要建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务器可以同时向多个客户机传输相同的消息(用于广播和多播)

(3): UDP的首部很短:8个字节(源地址,目的地址、包长度,校验和)。相对于 TCP的20个字节的首部来说,额外的开销比较少。

(4): 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速度,传输带宽,源端和终端主机的性能限制。
(5): UDP使用尽最大努力交付,既不保证可靠交付,因此主机不需要维持复杂的连接状态表。
(6):UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部之后就向下交付给IP层,既不拆分也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小

虽然UDP不是一个可靠的消息,但是却是分发信息的一个理想的协议。例如在屏幕上报告股票市场、在屏幕上显示航空信息等。 UDP 也用在 路由信息协议 (RIP)中修改路由表。 在这些应用场合之下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。 UDP 广泛应用在多媒体应用中(效率高)。 大多数Internet上的电话软件产品也都运行在UDP之上。


TCP 和 UDP 的对比

UDP 和 TCP 协议的主要区别在于: 二者在如何实现消息的可靠传递方面的不同。

TCP 协议中 包含了专门的传递保证机制,当数据接收方,收到发送方发送过来的信息的时候,会自动向发送方发出确认消息(这个是关键点)。 发送方只有在接收到 该确认消息之后,才继续传递其他的信息,否则将一直等待,知道收到确认消息为止。

和 TCP 不同, UDP协议不提供数据的保证机制。 如果在消息传递过程中出现数据的丢失,协议本身并不能做出任何的检测或者提示。 因此, 通常人们把 UDP 协议称为是不可靠的传输协议

另外,UDP 在接受多个数据报的时候,并不能保证数据的发送和接受顺序。
例如: 当一个位于客户端的应用程序 向服务器发送4个数据报的时候:
D1
D22
D333
D4444

UDP 有可能按照以下顺序将所接收到的数据提交到 服务端的应用:
D333
D1
D4444
D22

但是,事实上, UDP协议的这种乱序性质基本上很少出现,通常之后在网络非常拥挤的情况下才有可能发生。


UDP 数据报的格式

格式只有 4 * 2 = 8 个字节,简直简单到了极致。

-------------------------------------------------
|   源端端口号            |       目的端端口号      |
-------------------------------------------------
|   Length              |       CheckSum        |
-------------------------------------------------

可以看到 UDP的格式很简单。没啥好讲的。。。。


有关UDP一些问题

这些都是我在看书的过程中的思考,特地记载下来一一解决:
1. UDP是面向无连接的, TCP 是面向连接的,IP 是无连接的协议,那么到底什么是连接呢?

  1. UDP 的报文大小很有关系,是由应用程序来设定的。 UDP协议不会对数据包进行分组 和 合并的操作。 现在问题来了,数据包的大小应该设定为多少合适呢(MTU)? 如果设置的比较大,超过了MTU(因为路径上最小的MTU,不会很容易的得知),IP会进行切片吗? IP切片之后会发生什么现象 ? 如果IP不切片会发生什么现象? UDP报文的大小应该如何设置呢?

  2. 虽然说 UDP 可以随时发送数据,不必知道对方是否存在,但是如果对方不存在又如何接受数据呢? 所以说服务器还是必须先运行。

  3. 如何模拟出 使用 UDP 协议,数据包出现乱序的现象呢?


UDP 编程相关

UDP -- 用户数据报协议

标签:udp

原文地址:http://blog.csdn.net/xiaorenwuzyh/article/details/44758217

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!