原创

UDP协议

UDP 的概述(User Datagram Protocol,用户数据报协议)

UDP 是传输层的协议,功能即为在 IP 的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。

1.UDP 优势:

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

举个例子: DNS 如果运行在 TCP 之上而不是 UDP,那么 DNS 的速度将会慢很多。 HTTP 使用 TCP 而不是 UDP,是因为对于基于文本数据的 Web 网页来说,可靠性很重要。 同一种专用应用服务器在支持 UDP 时,一定能支持更多的活动客户机。 分组首部开销小,TCP 首部 20 字节,UDP 首部 8 字节。

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

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

UDP 是面向报文的,相对于 TCP 这样的流模式的协议,UDP 则是一种数据报的模式,UDP 面向报文的传输方式是应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则 IP 层需要分片。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。(一个 upd 的最大报文长度 2^16-1-20-8,20 是 ip 报文头,8 是 udp 报文头)

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

2.UDP 首部格式

UDP(User Data Protocol,用户数据报协议)是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP 传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制。 UDP首部格式

UDP 首部有 8 个字节,由 4 个字段构成,每个字段都是两个字节,

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

3.UDP 校验和

目的:检测 UDP 段在传输中是否发生错误(如位翻转) UDP校验和

举例说明

发送方

假设数据中有 3 个 16 比特的数 求出前两个的和 前两个的和加上第三个数,如果溢出就回卷,及和去掉最高位,然后+1 现在已经加完了所有 16 比特的数,取反码就变成了校验和,然后发送

接收方

将 4 个 16 比特的数(包含校验和)加起来,一定等于 1111 1111 1111 1111(相当于两个反码相加),这也是取反码做校验和的原因 如果不等,校验和错误,传输出现问题

UDP校验和
UDP校验和

相信你能想到,这个还是太脆弱了,仅仅只能解决数据缺失问题,而比如其中 16 比特的数互相交换位置这类错误无法检测 而且,他也只能知道发生了错误,而不知道哪里发生了错误

正文到此结束