UDP通信
UDP是User Datagram Protocol的缩写,直译为用户数据报协议。
UDP的特点
UDP是不可靠传输协议
刚好与TCP相反,TCP可以根据网络状态的好坏以自己为单位调节分组的大小,UDP是一种面向无连接的不可靠传输层协议,而且UDP每次发送的分组数据大小都是固定的。
为什么UDP是不可靠传输?
(1)不建立连接。
(2)没有应答机制。
(3)不会根据网络的好坏调整分组数据的大小。
其实有关UDP为什么是不可靠传输协议,我们在说明TCP时就说的很清楚了,之所以不是可靠传输协议,主要还是因为UDP没有连接和应答机制,导致UDP在发送数据时,根本不清楚通信线路的连通状态,所以UDP传输数据时,无法保证数据一定能发送给对方,因此UDP是不可靠传输协议,或者说是不可靠通信。
每次传输数据时,必须指定对方的IP和端口
回顾TCP通信
TCP通信必须建立连接,TCP建立连接时,服务器和客户端的TCP协议会自动记录下对方的IP和端口,后续调用recv、send来正式通信时,应用程序不再需要指定对方的Ip和端口,因为会自动使用TCP记录对方的IP和端口。
UDP通信
对于UDP通信来说,UDP协议没有建立连接的特性,所以UDP协议没有自动记录对方IP和端口的特点,因此每次发送数据时,应用程序必须亲自指定对方的IP和端口,只有这样才能将数据发送给对方。
如果是跨网通信的话,指定的ip就是对方的公网ip。
什么时候使用UDP呢?
对于数据量很大但是允许数据丢失的数据来说,可以使用UDP通信。
比如像视频、音频等这类数据,尽管数据量很大,但是就算数据有所丢失的话,对通信质量不会有太大影响,此时就可以使用UDP来传输。
当然,我们在开发项目时,如果有现成的调用UDP的应用层协议,我们可以直接这些应用层协议,这些协议代码是可以到网上下载或者购买的,否者我们就自己亲自调用UDP来实现。
比如我们在开发与视频监控相关的网络程序时(主要是开发客户端),往往会使用RSTP或者RTP应用层协议来传输监控视频数据,RSTP和RTP底层实际上使用的就是UDP协议。
UDP的编程模型
图解说明:
学习TCP通信时我们说过,TCP协议要求必须要有一个服务器,这一点是由TCP协议本身的特性所决定的。
TCP通信服务器端调用socket函数返回的套接字文件描述符用于监听。
但是通过UDP的编程模型可以看出,UDP通信双方要做的事情一摸一样的,所以对于UDP通信的双方来说,不需要区分谁是服务器端、谁是客户端也不需要监听对方连接,因为不存在建立连接也不存在断开连接,通信双方的身份完全是对等的,所以UDP通信也被称为对等通信,或者叫“点对点”通信。
UDP通信调用socket应用程序调用socket函数返回的套接字文件描述符直接用于通信。
对于UDP通信来说,如果要接收数据那么就必须使用bind函数绑定固定的ip和端口。如果只是用于发送数据则不需要绑定。
同样的,UDP这种对等通信的特点,或者说点对点通信的特点,是由UDP协议本身的特性所决定的,与应用程序没有关系。
对于UDP来说通信双方所实现的步骤是一模一样的,没有服务器和客户端的区分。