【计算机网络】UDP协议

448 阅读8分钟

UDP协议

UDP协议相对TCP来说是一个非常简单的协议。

UDP协议特点

UDP( User Datagram Protocol )是一个面向数据报的协议,其特点有:

无连接: UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以 UDP 是一种无连接的数据传输协议。

不可靠: UDP中的每个数据报都是一个独立的信息,包括完整的源或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的,而且在网络质量不好的环境下,UDP 协议数据包丢失可能比较严重。

高速率: 因为UDP不必进行收发数据的确认,而且资源消耗小,处理速度快,所以它的实时性更好,传输速率更高。有时候速度比数据完整性重要,在比如视频会议、电话通信等,丢失几帧画面、声音是可以接受的,不会对接收结果产生太大影响。但在需要数据安全接受的环境下,就宜采用TCP。

UDP数据格式

image.png

  • 端口号:端口号在之前的文章中有提到,它标记的是使用网络的进程(源端口号就是原机器正在使用网络的进程,目的端口号就是目的机器正在使用网络的进程)
  • 16位UDP长度:指的就是UDP数据报的长度(该长度包括UDP数据)。两个字节,即DP数据最大支持65536(2^16)的长度。
  • 16位UDP校验和:检测UDP的用户数据报在传输中是否出错
  • UDP数据:实际要发的数据。

对校验和进行说明:这是一个可选的选项,并不是所有的系统都对UDP数据包加以检验和数据(相对TCP协议的必须来说),但是RFC中标准要求,发送端应该计算检验和。对于接收方而言,如果接收成功了,就会将数据递交给应用层。如果校验失败了,即使数据已经传输到了UDP协议中,也会直接被丢弃掉,因为又可能在传输过程中失真了。

添加校验和:发送方对UDP头部除校验和位的三个16位串按比特位进行相加,如果相加结果超过16位,则进行回卷。加完的结果进行反码运算,再将反码运算的结果放到16位校验和中去。对于接收方而言,对所有的16个比特位进行相加,如果相加的和全为1,则数据是正确的,否则数据就失真。

回卷:最高位 + 低16位

校验和的过程图示

image.png

UDP协议是面向数据报的。

数据报:指的就是应用层所传输过来的一个完整的数据,UDP不会对这个完整的数据进行处理,不会进行拆分,也不会进行合并了再传输

从数据报的定义可以看出,UDP协议的数据长度,主要由应用层传输的数据长度所决定的,应用层传的数据越长,UDP数据报文就越长

这个地方需要注意,从理论上说,包含报头在内的数据报的最大长度为65535字节(64K),在用Socket编程时,根据UDP协议要求包小于64K。

image.png

UDP传输的包多大合适

MTU:是网络的最大传输单元,也就是网络传输中所能通过的最大数据包大小。

当MTU不合理时会造成如下问题: 1.本地MTU值大于网络MTU值时,本地传输的"数据包"过大导致网络会拆包后传输,不但产生额外的数据包,而且消耗了“拆包、组包”的时间。

2.本地MTU值小于网络MTU值时,本地传输的数据包可以直接传输,但是未能完全利用网络给予的数据包传输尺寸的上限值,传输能力未完全发挥。

合理的MTU值: 让本地MTU值与网络的MTU值一致,以致于不会出现数据包的大小超过网络传输的MTU值,而不得不进行拆包,然后组包,再进行转发,所谓合理的设置MTU值,就是让本地的MTU值与网络的MTU值一致,既能完整发挥传输性能,又不让数据包拆分。

应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。   

从下到上分析一下:   

1.在链路层,由以太网的物理特性决定了数据帧的长度为[ (46+18) , (1500+18) ],其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;   2.在网络层,因为IP包的首部要占用20字节,所以这时的MTU为1500-20=1480;  3.在传输层,对于UDP包的首部要占用8字节,所以这时的MTU为1480-8=1472;

对于TCP包的首部要占用20字节,所以这时的MTU为1480-20=1460;   

所以,当传输层为UDP协议时,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。   

从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。 

但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。

UDP洪水

UDP 洪水是一种拒绝服务攻击,攻击者将大量用户数据报协议(UDP) 数据包发送到目标服务器,旨在让该设备的处理和响应能力无力承担。由于UDP 洪水攻击,保护目标服务器的防火墙也可能不堪重负,导致对正常流量拒绝服务。

不同于TCP协议,UDP协议是一种无连接的协议,使用UDP协议传输报文之前,客户端和服务器之间不建立连接,如果在从客户端到服务器端的传递过程中出现报文的丢失,协议本身也不做任何检测或提示。这种报文处理方式决定了UDP协议资源消耗小、处理速度快,在被广泛应用的同时也为攻击者发动UDP Flood攻击提供了可能。

UDP洪水攻击原理

在正常情况下,服务器在特定端口上收到UDP 数据包时,将通过以下两个步骤进行响应:

  • 服务器首先检查是否有任何当前侦听指定端口请求的程序正在运行。

  • 如果该端口上没有程序正在接收数据包,则服务器将以 ICMP (ping) 数据包作为响应,以告知发送方目标不可达。

由于目标服务器利用资源来检查并响应每个接收到的UDP 数据包,当收到大量UDP 数据包时,目标资源会很快耗尽,从而导致对正常流量拒绝服务。

image.png

如何防御UDP洪水

确定攻击报文的特征后即可进行过滤,特征过滤也就是常说的指纹过滤。指纹过滤包括静态指纹过滤和动态指纹学习两种方法。

image.png

静态指纹过滤

UDP报文的数据段、源IP地址、源端口、目的IP地址、目的端口都可能隐藏着攻击报文的特征。对于已知的攻击特征,可以直接配置到设备的过滤器参数中。配置了静态指纹过滤后会对收到的报文进行特征匹配,对于匹配到攻击特征的报文进行丢弃、限流等下一步操作。

动态指纹学习

在攻击特征未知的情况下,可通过动态指纹学习进行攻击防御。对于一些攻击工具发起的UDP Flood攻击,攻击报文通常都拥有相同的特征字段,指纹学习就是对一些有规律的UDP Flood攻击报文进行统计和特征识别,当报文达到告警阈值时则开始进行指纹学习。如果相同的特征频繁出现,就会被学习成指纹,后续命中指纹的报文则被判定为攻击报文,进行丢弃、限流等后续操作。