UDP是User DataGram Protocal 的缩写。
UDP不提供复杂的控制机制,利用IP提供的面向无连接的通信服务。并且他是将应用程序发来的数据,在接收的那一刻,立刻按照原样发送到网络的一种机制。
UDP报头格式
端口号:使目的主机将应用数据交付给目的端系统中相应的进程,传输层–>应用层具体的那个进程
16位UDP长度:表示整个数据报(UDP首部加UDP数据)的最大长度
检验和:提供差错检测。用于确定当UDP报文段从源端到目的地时,其中的比特位是否发生了变化。例如发送方的UDP报文段中中所有16比特字进行反码运算,求和时遇到的任何溢出都将被回卷。得到的结果就放在UDP报文段中的校验和字段。
校验和保证数据正确传输,但不保证可靠性。
UDP的特点
无连接
知道对端的IP和端口号即可完成通信,不需要建立连接(没有三次握手等过程)不可靠
没有确认机制,没有重传机制,如果因为网络故障。数据报无法发送给对方,udp也不会给应用层返回任何有用的错误消息。很可能存在丢包。面向数据报
不能灵活的控制读写数据的次数和数量开销小,效率高
udp首部仅8字节开销,而tcp报文需要20个字节的开销,而且还有各种重传机制,导致tcp的时间和空间开销都比udp大,所以对比下来,UDP的传输效率要高于TCP。关于何时发送数据,发送什么样的数据,应用层控制的更为精细。
采用udp时,只要将应用程序的数据传递给UDP,UDP就会简单的打包一下就发给网络。关于发送什么数据,什么时候发送,完全由上层决定。自己不会添加一些拥塞机制,当网络拥塞时,控制发送数据的情况。对于一些允许丢包的应用,udp是很合适的。
面向数据报
应用层交给UDP多大长度的报文,UDP原样发送,既不会拆分。也不会合并。
例如:用UDP传输100个字节的数据
如果发送方调用一次sendto,发送100字节数据,那么接收方也要调用对应的一次recvfrom,接受100字节,而不能循环的调用10次recvfrom,每次接受10字节。
UD缓冲区
UDP没有真正的发送缓冲区,调用sengdo会直接将数据交给内核,由内核将数据传输给网络层进行后续的传输动作
UDP具有接受缓冲区。但是这个缓冲区不能保证收到的UDP报文的顺序和发送的UDP报文顺序一致,如果缓冲区满了,再到达的数据就会被冲走。
UDP使用注意事项
在UDP首部,有一个16位的最大长度,也就是UDP最多只能传输64K的数据(包含首部),当超过这个数字时,就需要在应用层手动分包,多次发送,并在接受端手动拼接。
基于UDP的应用层协议
NFS:网络文件系统
TFTP:简单文本传输协议
DCHP:动态主机配置协议
BOOTP:启动协议
DNS:域名系统。
当然,用户也可以根据自己写的UDP程序自定义应用层协议。