做为一个程序员,提到 UDP 我们自然而然想到 TCP。这两个协议好像是一对孪生兄弟一样。常常一起出现在我们眼前。
了解 UDP 之前需要了解一下。UDP 到底是什么东西。
UDP:
一种简单的传输层协议。
官方解释:
用户数据报协议(英语:User Datagram Protocol,缩写为UDP),又称使用者资料包协定,是一个简单的面向数据报的传输层 协议,正式规范为RFC 768。( 维基百科 )
UDP 的特性
与 TCP 相比主要有以下特征:
- UDP 继承 IP 的特性,不保证不丢失,不保证按顺序到达。TCP 就是提供可靠的数据,无差错、不丢失、不重复、按循序到达。
- UDP 是面向无连接的,那什么是面向连接的呢?所谓面向连接:就是建立连接,是为了在客户端和服务端维护连接,而建立的一定的数据结构来维护双方交互的砖头,用这样的数据结构来保证所谓的面向连接的特性。
- UDP 是数据格式基于数据报,一个一个的发,一个一个的收。TCP 是面向字节流,发送的是一个流数据。
- UDP 是不处理堵塞,应用需要发,就会发送。TCP 还=拥有堵塞控制,TCP 会根据网络环境调整发包的频率。
- UDP 支持多播和广播。(在 C 类 IP 地址中,主机号为 255 的就是表示,广播地址。网络中所有的主机都能接收。192.168.1.255 - 广播地址)
端口:
一般是指 TCP/IP 协议中的端口,端口号的范围从0到65535( 两个字节 ),比如用于浏览网页服务的80端口,用于FTP服务的21端口等等( 百度百科 )
不管是 UDP 还是 TCP ,都需要端口,这个端口就是用来区分应用程序,不然怎么知道这个数据是用哪个应用发送的,需要哪个应用接收,我们偶尔也会出现端口被占用的问题,那么很显然你的应用正常的使用就会有问题。
UDP 的包头
源端口号: 这个字段占了 UDP 包头的前面的 16 bits( 两个字节 ). 一般是包含发送数据包的应用程序使用的端口。偶尔我们想实现单向传输的时候,就可以在源端口填 0,这样接收端就不知道,发送端的端口地址。
目的端口: 16 bits表示接收端的应用程序的端口地址。
UDP 长度:这 16 bits ( 两个字节 )表示的是 UDP 数据报的长度,单位为字节,其中包括了 UDP 报头和 UDP 的数据区。因为 UDP 包头的总长度是 8 个字节,所以 UDP 数据报的最小长度就是 8 个字节。
UDP 校验和:检验数据在传输的过程中是否有损坏。校验和是通过对二进制数据进行特殊的计算而得到的结果。源计算机生成校验和,目的计算进行相关的校验。
UDP 的应用场景:
1、网络相对稳定的内网或者其他对数据丢包要求不是特别高的应用。
2、不需要建立一对一的连接、可以进行广播通信的应用。
3、应用要求处理数据块,时延要求低,但是对网络堵塞和数据排序没有要求。
具体的应用场景举例 :DHCP —— 动态 IP 分配协议( 改天一起学习一下 )。
UDP 实用举例:
1、早起的直播协议是 RTMP 这是基于 TCP 的。但是其实我们在看直播的时候,偶尔网络不好,卡顿一下,我们并不需要一定要从卡顿的地方看,或者是一直卡在那里,直播的意义本来就是要求内容的实时性,所以现在很多的直播软件自己基于 UDP 实现视频传输协议。
2、物联网终端资源少,只是一个很小的嵌入式系统,维护 TCP 这样包含连接的状态的机制代价太大了而且物联网对数据实时性要求比较高。所以 UDP 在物联网中应用的 比较广泛。比如:Google 子公司推出的物联网通信协议 Thread.