引:UDP作为传输层的一大协议,虽然没有TCP可靠,但是却胜在简单。
UDP认识
UDP(用户数据报协议) 是一种简单的面向数据报、无连接、传输层协议,并且保留了信息边界。UDP不提供错误校正,不保证有序,无法去重复,没有流量控制和拥塞控制,不能保证数据一定到达目的地,但是可以通过校验和提供错误侦测。UDP提供的的是不可靠传输,因此要有应用层来提供这些功能。
UDP特点
- UDP只在IP数据报服务的基础上增加了少量的功能:利用端口号是实现分用、对整个报文的差错检测。
- UDP是无连接的,通信前不需要建立连接,通信结束也无需释放连接。
- UDP是不可靠的 它是尽力而为交付,不能确保每一个数据报都送达。
- UDP是面向报文的,面向报文就是指:UDP数据传输的单位是报文,且不会对数据作任何拆分和拼接 操作。在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层。在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作。
- 相比于TCP,UDP没有拥塞控制,UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊。弊端:网络拥塞时有些报文可能会丢失,因此UDP不可靠。优点:有些使用场景允许报文丢失,如:直播、语音通话,但对实时性要求很高,此时UDP还是很有用武之地的。
- UDP支持一对一、一对多、多对多、多对一通信;而TCP只支持一对一通信。
- UDP首部开销小,只有8字节。而TCP头部至少由20字节,相比于TCP要高效很多。
UDP数据包首部
UDP数据包首部解析
- 16位源端口号:发送端应用程序使用的端口号,用于区分数据报来自哪个进程,多路复用一个传输层(复用:在发送端,多个应用进程公用一个传输层)。
- 16位目的端口号:数据送往接收端哪个应用程序,利用端口号实现多路分用(分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程)。
- 16位UDP长度:UDP数据报首部和UDP数据报数据部分总字节数,最小值为8字节(仅有首部),最大值为65535字节。
- 16位UDP检验和:UDP的校验和是可选的,TCP是必需的。UDP的校验和覆盖首部及数据部分。在下一节。
- 数据:要发送的数据,可以为空(0字节)。
UDP检验和
UDP校验和的内容超出了UDP数据报文本身的范围,实际上,它的值是通过计算UDP数据报及一个伪包头而得到的。校验和的计算方法与通用的一样,都是累加求和。
它的校验和的检验范围如下图:
伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的IP
地址。伪报头保证UDP数据单元到达正确的目的地址。
校验方式:
《TCP/IP 详解》卷一 第一版中如下计算检验和字段的值:
- 发送方计算UDP检验和:
首先把检验和字段置为0,把上图中,各部分数据(包括UDP伪首部及填充字段)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),所求结果就是16bitUDP检验和字段的值。 - 接收方计算UDP检验和:
对收到的UDP数据报(加上了UDP首部和填充字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),若结果为全1,则UDP数据报在传输过程中没有出现差错,否则数据报有差错。
- 发送方计算UDP检验和:
- 《TCP/IP 详解》卷一 第二版中如下计算检验和字段的值:
- 发送方计算UDP检验和:
首先把检验和字段置为0,把上图中,各部分数据(包括UDP伪首部及填充字段)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),最后结果再按位取反,所得结果就是16bitUDP检验和字段的值。 - 接收方计算UDP检验和:
对收到的UDP数据报(加上了UDP首部和填充字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),再按位取反,若结果为全0,则UDP数据报在传输过程中没有出现差错,否则数据报有差错。因为检验和的值从不为0xFFFF
- 发送方计算UDP检验和:
UDP服务器三类地址绑定
本地地址 | 远端地址 | 描述 |
---|---|---|
LocalIP:Lport | ForeignIP:Fport | 只限于一个客户 |
LocalIP:Lport | *:* | 只限于一个本地IP和端口的数据包 |
*:port | *:* | 接收发送到Lport的所有数据包 |
- 第一行中服务器限定了只从本地Local这个IP地址的Lport端口接收数据报,而且只接收来自IP为Foreign且端口为Fport发来的数据。
- 第二行中服务器限定了只从本地LocalIP这个IP地址的Lport端口接收数据报,但可以接收任何主机发送的数据。
- 第三行中服务器只限定了接收数据的端口号,因此任何一个本地接口IP都可以接收它,而且数据可以来自任何主机发送的数据。
UDP的应用
当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。常见的使用UDP协议的应用如下:
- QQ语言和视频
- DNS(域名服务器)
- NFS(网络文件系统)
- TFTP(普通文件传输协议)