UDP协议
UDP是无连接的,即发送数据之前不需要连接,因此减少了开销和发送数据之间的时延。
UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表
UDP是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。
也就是说UDP的报文长度是由应用进程来决定的,若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率;反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太长,这也会降低IP层的效率,所以,应用程序必须选择合适大小的报文,使UDP能一次交付一个完整的报文。
UDP没有网络拥塞控制,因此网络出现的拥塞不会使源主机的发送效率降低。
UDP支持一对一、一对多、多对一和多对多的交互通信。
UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
虽然某些实时应用需要使用没有网络拥塞的UDP,但当很多的源主机同时都向网络发送高速率的实时视频时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不适用拥塞控制功能的UDP可能会引起网络产生严重的拥塞问题。
UDP的首部格式
用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由4个字段组成,每个字段的长度都是两个字节。各字段意义如下:
源端口:源端口号在需要对方回信时选用,不需要时可用全0。
目的端口:目的端口号,这在终点交付时必须使用。
长度:UDP用户数据报的长度,其最小值是8(仅有首部)。
检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃
图解:
这里的伪首部主要是在计算检验和时,临时添加在UDP数据报前面。得到一个临时的用户数据报,伪首部的存在仅仅是为了计算检验和,既不向下传送也不向上递交。仔细看图就会发现,UDP的首部不包括伪首部。
当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交至最后的应用进程,如图:
如果接收方UDP发现收到的报文段中的目的端口不正确(即不存在对应于改端口号的应用进程),就丢弃该报文。请注意:虽然在UDP之间的通信要用到其端口号,但由于UDP的通信是无连接的,,因此不需要使用套接字。
UDP编程
UDP的编程流程
服务器端的代码:
客户端代码:
运行结果:
由运行结果我们可以看出,UDP服务器端支持同时连接多个客户端,每个客户端都有自己的端口号 ,服务器根据这个端口号判断是哪个客户端发送来的数据。
我们之前说过,UDP的传输是不可靠的,那么它不可靠在哪里呢?
我们改动一下代码,让服务器端一次只收一个字符
运行结果:
由图我们可以看出,虽然客户端每次都传一个完整的字符串,但是服务器端只收一个字符的话。后边的就直接丢失了,找不到了。
UDP数据报服务特点:发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报发送。接受端必须及时针对一个每一个UDP数据报执行写操作,否则就会丢包。并且,如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断