UDP是一种无连接的运输层协议,因为在使用UDP时,在发送报文段之前,发送方和接收方的运输层实体之间没有进行握手。所谓的握手,就是发送方和接收方通过发送一些特定的报文段来互相确认,从而为发送做准备。
如果应用程序使用的运输层协议是UDP,则应用程序几乎是直接与IP打交道的。UDP从应用进程得到数据,附加上用于多路复用/分解服务的源端口号和目的端口号及长度和检验和(即报文段首部)形成报文段,然后将报文段交给网络层。网络层将该运输层报文段封装在IP数据报中,然后尽力而为的尝试将此报文段交付给接收主机。若该报文段到达接受主机,UDP使用目的端口号将报文段中的数据交付给正确的应用进程。
UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP是不可靠的数据报协议),也不要求接收方回复接收成功确认,也不会重发数据,不提供流量控制,更不提供拥塞控制。UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。
UDP的优势
在进行udp传输时,需要明确一个是发送端,一个是接收端。
udp的发送端:
1,建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。
2,明确要发送的具体数据。
3,将数据封装成了数据包。
4,用socket服务的send方法将数据包发送出去。
5,关闭资源。
udp的接收端:
1,创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。
2,定义数据包,用于存储接收到数据。
3,通过socket服务的接收方法将收到的数据存储到数据包中。
4,通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。
5,关闭资源。
UDP特点:
1、是无连接的。减少了开销和发送数据的延迟。
2、使用尽最大努力交付,即不保证可靠交付。
3、没有拥塞控制:因此网络出现拥塞不会使源主机的发送速率降低。这对某些实时应用很重要。很多实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络阻塞的情况下丢失一些数据,但是不允许数据有太大的时延。UDP正好适合这种情况。
4、支持一对一、一对对、多对一和多对多的交互通信。
5、首部开销小,只有8个字节,比TCP的固定20个字节要短。
6、是面向报文的:
*发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。UDP对应用层交下来的报文,既不合并也不拆分,而是保留这些报文的边界。
*接收方的UDP,对IP层交上来的UDP用户数据报,在去除首部后就原封不动的交付给上传的应用进程。
*即UDP一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率;若报文太短,UDP把它交给IP层时,会使IP层的首部的相对长度太大,这也降低了IP层的效率。
如下图:
差错校验
在计算校验和时,要在UDP用户数据报之前增加12个字节的伪首部。这个伪首部不是UDP数据报的真正首部,只是为了计算校验和时临时添加在UDP数据报的前面,得到一个临时的数据报。校验和就是按照这个临时的UDP数据报来计算的,伪首部既不会向下传送也不会向上交付,仅仅只是为了计算校验和而已。UDP的校验和是把首部和数据部分一起都校验。
视频使用什么协议?为什么?
视频使用的是UDP协议,因为UDP协议没有拥塞控制,说明网络上的拥塞不会使得源主机的发送速率降低,这对实时应用是很重要的。很多实时应用(比如IP电话,实时视频会议等)要求源主机以恒定的速率发送数据,并且允许网络上发生拥塞时丢失一些数据,但是却不允许数据有太大的时延。UDP协议正好符合这种要求。
如果使用UDP协议,如何在上层保证数据传输的可靠性?
由于UDP协议是无连接的,所以具有TCP望尘莫及的速度,不会像TCP协议中占用巨大的系统开销,严重影响速度。但是UDP没有确认响应和重传机制,传输数据并不可靠,所以,如果上层应用机制可以做到确认响应和重传机制那么无疑是在速度快的前提下可靠性也得到了保证。
我们可以模拟TCP的窗口机制,在发送端和接收端都开辟一个缓冲区,使用确认机制,这样又可以使到达的数据有序,而且丢失的数据将进行重传,保证了可靠性。