在之前写过简单UDP网络程序后,今天学习了解了UDP协议
1.UDP报文格式
上面的一张图为经常在书上看到的图
下面是我将其展开,也是为了自己好读图
(开始学习使用用viso 画图)
UDP协议是传输层协议,我们在数据封装的过程中,报头也是被封装在最里层的。
数据报头中的信息也比较简单:
- 源端口号
- 目的端口号
UDP长度(报头+数据)
UDP因为是面向数据报的,对端一次发送多少,一次就接收多少,使用定长的报头来分离报头和数据
校验和
UDP协议是不可靠的,这里的校验是指将数据中比较有特点的信息经过计算得出一个比较短的字符串,在接收方也是通过相同的计算,得到的字符串是否相同,相同就接收,不相同就丢弃。
数据
一次发送多少,一次就接收多少,否则剩下的数据就再也拿不到了
2.UDP的特点
- 无连接
知道对端的IP和端口号,就可以直接进行传输,不需建立连接 - 不可靠
没有确认机制和重传机制 - 面向数据报
不能够灵活的控制读写数据的数量和次数
面向数据报
应用层交给UDP的数据,UDP原样发送,不会进行拆分和合并
UDP缓冲区
- UDP没有真正意义上的发送缓冲区,将数据交给内核,内核将数据传输给网络层,且UDP没有重传机制,不需要将其保存下来而用于重传
- UDP具有接收缓冲区,并不能保证收到数据和发送时的顺序相同,一般用于当缓冲区数据满了,再到达的数据就会被丢弃
UDP注意事项
看到UDP长度字段只有16位,能表示的最大数据长度为64k,在网络中,这是一个很小的数字,当我们需要传送的数据超过64k,这时候就需要在应用层将数据分包,分多次发送,并且在接收端手动拼接,这样影响传送效率。
基于UDP的应用层协议
- NFS: 网络文件系统协议
- TFTP: 简单文件传输协议
- DNS: 域名解析协议
- DHCP:动态主机分配协议
- BOOTP: 启动协议(用于无盘设备启动)
- 也包含用户自己实现UDP程序时的自定义协议