简介
用户数据报协议UDP(User Datagram Protocol)[RFC 793]
- 无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。
- 不保证可靠交付,因此主机不需要为此复杂的连接状态表
- 面向报文的,意思是 UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,在添加首部后向下交给 IP 层。
- 没有阻塞控制,因此网络出现的拥塞不会使发送方的发送速率降低。
- 支持一对一、一对多、多对一和多对多的交互通信,也即是提供广播和多播的功能。
- 首部开销小,首部只有 8 个字节,分为四部分。
udp报文结构
源端口:源端口号,在需要对方回信时选用,不需要时可全 0.
目的端口:目的端口号,在终点交付报文时必须要使用到。
长度:UDP 用户数据报的长度,在只有首部的情况,其最小值是 8 。
检验和:检测 UDP 用户数据报在传输中是否有错,有错就丢弃。
UDP 如何进行校验和:
UDP 数据报首部中检验和的计算方法比较特殊。
在计算检验和时,要在数据报之前增加 12 个字节的伪首部,用来计算校验和。
伪首部并不是数据报真正的首部,是为了计算校验和而临时添加在数据报前面的,在真正传输的时候并不会把伪首部一并发送。
第一字段,源 IP 地址
第二字段,目的 IP 地址
第三字段,字段全 0
第四字段,IP 首部中的协议字段的值,对于 UDP,此字段值为 17
第五字段,UDP 用户数据报的长度
UDP与TCP对比
TCP与UDP的连接方式
从程序实现的角度来看
tcp中需要客户端向服务器发起连接,服务器需要接受客户端的连接以后才可以收发数据。而udp中客户端不需要向服务器发起连接,只需要知道服务器绑定的端口就可以向服务器发送数据。由此可知,tcp是面向连接的,udp是非面向连接的。
UDP面向报文 ,TCP面向字节流
UDP是面向报文。
发送方的UDP对应用程序交下来的报文在添加首部后就向下交付给IP层,对交下来的报文既不合并也不拆分。因此,应用进程必须选择合适大小的报文,若报文太长,UDP把它交付给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率;反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,也降低了IP层的效率。TCP面向字节流。
虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成是一连串的务结构的字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方TCP共有10个数据块,但接收方TCP可能只用了4个数据块就把收到的字节流交付给了上层应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。(原理参考每日一问20——TCP中tcp滑动窗口的介绍)
UDP单播,广播,多播
- 单播把数据报发送给单一主机
- 广播把数据报发送给指定网络上的所有主机
- 多播发送给指定的多个主机
广播
广播域
首先我们来了解一下广播域的概念。
广播域是网络中能接收任一台主机发出的广播帧的所有主机集合。也就是说,如果广播域内的其中一台主机发出一个广播帧,同一广播域内所有的其它主机都可以收到该广播帧。
广播域的计算
如何知道一台主机是属于哪一个广播域呢?其实计算很简单,只要用主机的IP地址与子网掩码进行与运算即可知道该主机属于哪一个广播域。例如:一台主机的IP地址为192.168.23.150,子网掩码为255.255.255.0,那么它所属的广播域就是192.168.23.150&255.255.255.0=192.168.23.0。那么其它的在广播域192.168.23.0内的所有主机就可以到该设备发送的广播包。如果把子网掩码改为255.255.0.0,那么它所属的广播域就是192.168.23.150&255.255.0.0=192.168.0.0。那么其它的在广播域192.168.0.0内的所有主机都可以收到该设备发送的广播包。
广播地址的计算
要想相同广播域内的其它主机能收到的广播帧,还需要在发送广播包的时候指定当前所属广播域内的广播地址。广播地址的计算方法为子网掩码取反再与广播域进行或运算。
例如:如果主机当前所属广播域为192.168.0.0,子网掩码为255.255.0.0,那么广播地址则为192.168.255.255。
使用UDP进行跨网段广播
要使主机A发送的广播包能够被另一网段的主机B收到,那么只需要更改主机A的子网掩码使得与主机B在同一个广播域内,再使用新的广播域的广播地址发送广播包即可。
例如:要使用192.168.23.150发送广播包让192.168.27.135收到,只需要设置192.168.23.150的子网掩码为255.255.0.0,然后再使用广播地址192.168.255.255即可。
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。
多播
多播是一组主机的标示符,它已经加入到一个多播组中。在以太网中,多播地址是一个48位的标示符,命名了一组应该在这个网络中应用接收到一个分组的站点。在IPv4中,它历史上被叫做D类地址,一种类型的IP地址,它的范围从224.0.0.0到239.255.255.255。D类地址用于组播。