UDP是一种简单的面向数据报、无连接、传输层协议,只提供数据交付和差错检测。UDP不提供错误校正,不保证有序,无法去重复,没有流量控制和拥塞控制,不对传送数据包进行可靠性保证,但是可以通过校验和提供错误侦测。
UDP在IP报文中的格式如下:
UDP其实就是在IP报文中添加了端口信息(UDP输出操作刚好产生一个UDP数据报,并组装成一份IP数据),使数据到达主机后送达至相应端口的应用程序。
UDP的特点:
UDP传输的过程类似于寄信.
(1)无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
(2)不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;
(3)面向数据报: 不能够灵活的控制读写数据的次数和数量;
面向数据报
应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;
用UDP传输100个字节的数据:
如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个
字节; 而不能循环调用10次recvfrom, 每次接收10个字节;
UDP协议报文格式:
各字段的含义如下:
(1)16位源端口号:发送端应用程序使用的端口号,用于区分数据报来自哪个进程。
(2)16位目的端口号:数据送往接收端哪个应用程序。
(3)16位UDP长度:表示整个数据报(UDP首部+UDP数据)的最大长度,最小长度为8字节(仅有首部)。
(4)16位UDP检验和:UDP的校验和是可选的,如果校验和出错, 就会直接丢弃.
(5)数据:要发送的数据,可以为空(0字节)。
其中 通过源端口号和目的端口号实现了多路分解和多路复用,设置校验和字段是专门为了服务于差错检验。在传输过程中可能会出现比特位翻转,使得数据出现错误,所以差错检验是必须的。
差错检验的实现方法:
(1)发送方计算UDP检验和:
首先把检验和字段置为0,然后UDP首部加数据荷载部分,以及UDP伪首部(源地址、目的地址、UDP数据长度、协议类型(0x11),协议类型就一个字节,但需要补一个字节的0x0,构成12个字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),最后结果再按位取反,所得结果就16bitUDP检验和字段的值。
(2)接收方计算UDP检验和:
对收到的UDP数据报(加上了UDP首部和填充字节)按每16bit进行二进制反码求和(若最高位产生进位就加到最低位上去),再按位取反,若结果为全0,则UDP数据报在传输过程中没有出现差错,否则数据报有差错。
对于出错的报文段,UDP协议直接丢弃报文段。因为UDP只有差错检验的功能,无法对其进行纠错。
UDP使用注意事项
,UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
然而64K如今的互联网环境下, 是一个非常小的数字。
如果需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。
基于UDP的应用层协议:
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议