UDP协议,全名为用户数据包协议,它是一个简单的传输层协议。在使用UDP协议进行数据传输时,应用程序先将自己的将要传输的数据通过某种应用协议封装好,然后将这些数据写入UDP套接字中,数据在经过传输层的时候,会被封装到一个UDP数据报,该数据报继续往下传输经过网络层时又被封装到一个IP数据报,然后发送到目的地。UDP协议不保证UDP数据报会到达其目的地,不保证各个数据报的先后顺序跨网之后是否保持不变,也不保证每个数据报只到达一次。
UDP提供无连接的服务,因为UDP客户与服务器之间不必存在长期的连接关系。一个UDP客户可以创建一个套接字并向一个指定的服务器发送一个数据报,然后立即使用同一个套接字向另一个服务器发送数据报。同样的,一个UDP服务器也可以用同一个UDP套接字从多个不同的客户接收数据报,每个客户一个数据报。
UDP在发送数据报时,每个数据报中都包含长度信息。如果一个数据报能正确地到达目的地,那么该数据报的长度将随数据一道被传递给接收端进程,这与TCP数据传输不一样,TCP是一种字节流传递的,它没有任何记录边界。
在使用UDP进行数据传输的时候,常常会遇到一个重要的问题,那就是它缺乏可靠性。如果一个数据报到达了目的地,但是校验和检测发现数据报有错误,或是在传输过程中丢失掉,那么它将无法被传递给接收套接字,也不会被源端自动重传。如果想要确保一个数据报到达目的地,可以使用应用程序增加一大堆的特性,比如来自对端的确认,本端的响应接收超时与重传等。UDP之所以不提供可靠传递,主要是因为UDP本身不提供确认、序列号、RTP估算、超时和重传机制,这也是UDP与TCP比较明显的区别。如果一个UDP报在网络中被复制成两份,那么这两个数据报都将被传递给目的地。同样的如果UDP客户发送两个数据报到同一个目的地,他们可能被网络重新排序,颠倒顺序后到达目的地,这也就是使用UDP进行大型数据传输的时,通常要使用一些应用协议来打包、解包和数据传输控制等,以确保数据的有序和可靠传递。
正式由于UDP协议的无连接、包头开销小等因素,常常被应用在实时数据的传输当中,比如音视频流的传输等。