在TCP/IP协议中,传输层协议有UDP和TCP协议,UDP(User Datagram Protocol)又称为用户数据包协议,在TCP/IP协议族中是无连接的协议。因此UDP协议在IP路由时是否能准确到达目的主机是不能保证的。既没有包序检查,也没有超时重发机制,因此如何使用UDP协议完全由用户决定。
1. UDP的应用场景
但UDP协议相比TCP协议也有众多的优点:
- UDP使用比较简单,不需要复杂的握手过程
- 由于没有负载的超时重传机制,对于某些应用场景传输速度更快,传输延迟小
- UDP支持多播协议,是远程会议等应用程序是惟一的选择。UDP一般用在对少量的数据丢失不敏感的场景,如实时语音或图像的传输,虽然有可能会有部分数据丢失,但在不影响理解的情况下,由于传输延时小,往往是比较好的选择。特别是多方视频或语音会议的使用,使UDP 得到广泛的应用,如微信视频会议就采用UDP协议进行网络通信。
2. UDP头部结构:
UDP的头部结构非常简单,总共8个字节,由16位Source Port, 16位Destination Port,16位UDP数据报长度,16位UDP校验和构成,如图1所示。

图1
-
端口号
是主机对应的一个应用端口:如 Echo的端口为 7,TFTP 为69, SMTP为 25, DNS 为53, DHCP为 67等,两台主机如果用UDP协议,双方都要指定端口号。已知端口号一般都在1024以内,目前随着应用程序的增加,已知端口号已接近5000,因此如果要开发特定的应用程序,自定义端口号一般在5000以上。
-
UDP数据长度:
此字段标记了整个数据报(UDP的首部+UDP数据)的长度
-
UDP 校验和
UDP校验和是可选字段,可以使用校验和,也可以不使用校验和。
如果不使用校验和,则校验和字段应填充0。
如果使用校验和,UDP 校验和的计算方法如下:
(1)伪头部构建:如下图,在UDP或TCP的Checksum的计算中,不仅要包含数据部分及UDP/TCP的头部,同时还要包含IP头的一部分信息,构成伪头部进行UDP/TCP checksum的计算。
(2)UDP的第9个字节设为零
(3)UDP伪头部长度等于UDP头部长度
(4)UDP的校验和先设为0
(5)按照16位方式求和(参见IP头的计算或下文的例1)
(6)有进位位,加回和中(如果再产生进位位,再加回和中),直到最终结果小于等于16’hffff
(7)取反
(8)结果填到校验和的位置

图2
例1:

图3
表1
| 项名称 | 数值 | 运算 |
| 源IP Address: | c0 a8 01 64 (192.168.1.100) | 16’hc0a8 + 16’h0164 + |
| 目的IP Address: | c0 a8 00 3c (192.168.0.60) | 16’hc0a8 + 16’h003c + |
| IP 上层协议类型 : | 11 (17) , UDP | 16’h0011 + |
| UDP长度: | 0d (13) | 16’h000d + |
| UDP 源Port: | 1f40 (8000) | 16’h1f40 + |
| UDP 目的Port: | 1f41 (8001) | 16’h1f41 + |
| UDP长度: | 0d (13) | 16’h000d + |
| UDP数据: | ef ec | 16’hefec + |
| UDP数据: | 3d d6 | 16’h3dd6 + |
| UDP数据: | c5 | 16’hc500 |
| = 32’h3b45e | ||
| 16’hb45e + 16’h3 | ||
| = 16’hb461 | ||
| ~(取反) | ||
| 校验和: | = 16‘h4b9e |
-
UDP接收端校验
接收的计算与IP头部checksum的计算类似,但是也要首先构建伪首部,然后与UDP包一起参与计算,结果为0,接收正确,否则接收错误。
-
最大传输单元MTU
MTU (Maximum transportation unit)
1)标准的以太网MTU: UDP属于传输层,下面我们由下至上一步一步来看: 以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的。 这个1500字节被称为链路层的MTU(最大传输单元)。 但这并不是指链路层的长度被限制在1500字节,其实这个MTU指的是链路层的数据区并不包括链路层的首部和尾部的18个字节。所以事实上这个1500字节就是网络层IP数据报的长度限制。因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节。这个1472字节就是我们可以使用的字节数。
2)有些网路因为缓冲区的限制,不能做到超过缓冲区字节数,因次在发送数据包时就会将大的数据包拆分成小的数据进行发送,因次才会出现IP拆包与组包的过程,也解释标志及片偏移字段进行控制。
3)一旦IP包有拆包的的过程,IP的checksum将在每个子包当中重新计算,如果网络是以太网,则以太网的MAC层的CRC32也要重新计算。
思考题:如果UDP的数据报只有4个字节,整个网络包应如何构建?