UDP协议

引:UDP作为传输层的一大协议,虽然没有TCP可靠,但是却胜在简单。

UDP认识

UDP(用户数据报协议) 是一种简单的面向数据报、无连接、传输层协议,并且保留了信息边界。UDP不提供错误校正,不保证有序,无法去重复,没有流量控制和拥塞控制,不能保证数据一定到达目的地,但是可以通过校验和提供错误侦测。UDP提供的的是不可靠传输,因此要有应用层来提供这些功能

UDP特点

  1. UDP只在IP数据报服务的基础上增加了少量的功能:利用端口号是实现分用、对整个报文的差错检测。
  2. UDP是无连接的,通信前不需要建立连接,通信结束也无需释放连接。
  3. UDP是不可靠的 它是尽力而为交付,不能确保每一个数据报都送达。
  4. UDP是面向报文的,面向报文就是指:UDP数据传输的单位是报文,且不会对数据作任何拆分和拼接 操作。在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层。在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作。
  5. 相比于TCP,UDP没有拥塞控制,UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊。弊端:网络拥塞时有些报文可能会丢失,因此UDP不可靠。优点:有些使用场景允许报文丢失,如:直播、语音通话,但对实时性要求很高,此时UDP还是很有用武之地的。
  6. UDP支持一对一、一对多、多对多、多对一通信;而TCP只支持一对一通信。
  7. UDP首部开销小,只有8字节。而TCP头部至少由20字节,相比于TCP要高效很多。

UDP数据包首部

udp

UDP数据包首部解析

  1. 16位源端口号:发送端应用程序使用的端口号,用于区分数据报来自哪个进程,多路复用一个传输层(复用:在发送端,多个应用进程公用一个传输层)。
  2. 16位目的端口号:数据送往接收端哪个应用程序,利用端口号实现多路分用(分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程)。
  3. 16位UDP长度:UDP数据报首部和UDP数据报数据部分总字节数,最小值为8字节(仅有首部),最大值为65535字节。
  4. 16位UDP检验和:UDP的校验和是可选的,TCP是必需的。UDP的校验和覆盖首部及数据部分。在下一节。
  5. 数据:要发送的数据,可以为空(0字节)。

UDP检验和

UDP校验和的内容超出了UDP数据报文本身的范围,实际上,它的值是通过计算UDP数据报及一个伪包头而得到的。校验和的计算方法与通用的一样,都是累加求和。
它的校验和的检验范围如下图:

checksum

伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的IP
地址。伪报头保证UDP数据单元到达正确的目的地址

校验方式:

  1. 《TCP/IP 详解》卷一 第一版中如下计算检验和字段的值:

    • 发送方计算UDP检验和:
      首先把检验和字段置为0,把上图中,各部分数据(包括UDP伪首部及填充字段)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),所求结果就是16bitUDP检验和字段的值。
    • 接收方计算UDP检验和:
      对收到的UDP数据报(加上了UDP首部和填充字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),若结果为全1,则UDP数据报在传输过程中没有出现差错,否则数据报有差错。
  2. 《TCP/IP 详解》卷一 第二版中如下计算检验和字段的值:
    • 发送方计算UDP检验和:
      首先把检验和字段置为0,把上图中,各部分数据(包括UDP伪首部及填充字段)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),最后结果再按位取反,所得结果就是16bitUDP检验和字段的值。
    • 接收方计算UDP检验和:
      对收到的UDP数据报(加上了UDP首部和填充字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),再按位取反,若结果为全0,则UDP数据报在传输过程中没有出现差错,否则数据报有差错。因为检验和的值从不为0xFFFF

UDP服务器三类地址绑定

本地地址 远端地址 描述
LocalIP:Lport ForeignIP:Fport 只限于一个客户
LocalIP:Lport *:* 只限于一个本地IP和端口的数据包
*:port *:* 接收发送到Lport的所有数据包
  1. 第一行中服务器限定了只从本地Local这个IP地址的Lport端口接收数据报,而且只接收来自IP为Foreign且端口为Fport发来的数据。
  2. 第二行中服务器限定了只从本地LocalIP这个IP地址的Lport端口接收数据报,但可以接收任何主机发送的数据。
  3. 第三行中服务器只限定了接收数据的端口号,因此任何一个本地接口IP都可以接收它,而且数据可以来自任何主机发送的数据。

UDP的应用

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。常见的使用UDP协议的应用如下:

  • QQ语言和视频
  • DNS(域名服务器)
  • NFS(网络文件系统)
  • TFTP(普通文件传输协议)

参考

  1. UDP协议
  2. UDP协议的应用