本篇博文从以下几点来实现并演示一个使用UDP协议进行通信的示例。
1.什么是UDP
2.UDP在网络中是怎样实现通信的
3.UDP的特点及常见的应用场景
4.代码示例
首先来看⋯⋯
什么是UDP
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。一句话概括的讲UDP就是一种通信协议。
UDP在网络中是怎样实现通信的
UDP既然是一种通信协议,那么它出现的最终目的就是为了传递信息。用它传输的信息是经过处理了的,叫做数据报。那么什么又是数据报呢?数据报是通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。UDP协议根据报头的地址信息将整个报文路由到目的地主机的程序上。举个例子来说明,如小明同学给小红同学寄一个包裹。首先,小明要找到一个快递点,接着,小明把一些信息填写在快递单上,这些信息包含小红的地址,手机号,以及小明的手机号等。再接着,快递员把快递单贴在包裹上并发送。包裹在传输过程中可能会经过多个网点,每到一个网点,网点都会以快递单上的信息为依据,将包裹向目的地投放。最后一个网点会派送快递员将包裹送给小红。如果整个过程没有出错,小红最终会顺利收到包裹。咱们可以这样理解,小明和小红是两台主机,包裹就是数据报,通过快递这种方式邮寄包裹就是使用UDP在通信,包裹在物流网上被各个网点转发就相当于数据报在计算机网络上被路由器转发。这样是不是就容易理解多了?那这里问个问题,假如小明邮寄的不是个包裹,而是一个挖掘机,而现有物流假设又不能运送整个挖掘机这么大的物件,那该怎么办?办法简单,把挖掘机拆了,运送零件。可是运到小红那儿,小红不会组装挖掘机怎么办?那再解决,把零件编号,运送到目的地按照编号组装即可。其实像这样的问题,在信息传递时候一样存在,假如有很长的信息由A主机发送到B主机,就把信息拆分一个个的数据报,然后编号发送,到达目的地再重新拼装成一条完整的信息。数据报作为数据单元来传送,由于不同的网络状况(如网络延迟,网络阻塞),会存在编号①的数据报先发送却后到达目的地,编号②的数据报后发送却先到达目的地。同时,在传送过程中也有可能发生意外(如丢失了,损坏了),这样会造成A主机认为发送了消息,而B主机却没接到消息的现象,那整条消息就要被重发。这里呢,咱们只是介绍UDP的基本原理,实际当中还有很多细节以及各种各样问题的处理方案,不做一一介绍。
UDP的特点及常见的应用场景
根据UDP的通信原理,咱们尝试总结一下UDP通信协议的特点,通常呢,总结它的特点要对比它的兄弟协议TCP协议来总结。
UDP协议具有如下特点:
1.UDP是面向无连接的,不可靠的(相对于TCP不可靠)
2.UDP首部开销较小,8字节(TCP为20字节、IP为20字节)
3.UDP占用的资源少,速度快
4.UDP支持一对一,一对多,多对一的交互通信
既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。在日常生活中,对于速度要求较高,而不需要数据特别完整的场景,如流媒体视频,音频,广泛使用了UDP协议。还有生活中的如QQ消息,微信消息,手机短信等的传送也是UDP原理的应用。
代码示例
在Java中,也对UDP协议有很好的支持,类DatagramSocket为创建UDP连接的套接字,类DatagramPacket为数据报包。
发送步骤:
使用 DatagramSocket(int port) 建立socket(套间字)服务。
将数据打包到DatagramPacket中去
通过socket服务发送 (send()方法)
关闭资源
代码如下:
接收步骤:
使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定 监视接受端口。
定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的方法提取传送的内容
通过DatagramSocket 的receive方法将接受到的数据存入上面定义的包中
使用DatagramPacket的方法,提取数据。
关闭资源。
代码如下:
最后,先运行接收端程序,再运行发送端程序,结果自己去检验⋯⋯