
# 使用UDP协议有什么注意事项？
#### 什么是UDP健康检查
UDP是面向非连接的一种协议，在发送数据前不会通过进行三次握手建立连接，UDP健康检查的实现过程如下：
- 健康检查的节点根据健康检查配置，向后端发送ICMP request 消息。
  - 如果健康检查节点收到了后端服务器返回的ICMP reply消息，则认为服务正常，继续进行健康检查。
  
  - 如果健康检查节点没有收到后端服务器返回的ICMP reply消息，则认为服务异常，判定健康检查失败。
   
- 健康检查的节点收到ICMP reply消息后，会给后端服务器发送UDP探测报文。
  - 如果在【超时时间】之内，健康检查的节点服务器收到了后端服务器返回的port unreachable的ICMP消息，则认为服务异常，判定健康检查失败。
  
  - 如果在【超时时间】之内，健康检查的节点服务器没有收到后端服务器返回的ICMP错误信息，则认为服务正常，判定健康检查成功。
   
当您配置UDP健康检查时，推荐使用配置页面默认的各项数值。
#### 异常排查方法
请您按照以下两种方法排查。
- 检查健康检查超时时间是否过小。 可能的原因：后端服务器回复的reply或port unreachable类型的ICMP消息未能在超时时间内到达健康检查的节点，导致健康检查结果不准确。
  建议采取的措施：将超时时间调整为更大的值。
  由于UDP健康检查的原理不同于其他健康检查，建议健康检查超时时间不要过小，否则后端服务器可能会反复上线或下线。
  
- 后端服务器是否限制了ICMP消息产生的速率。
Linux系统下，请用以下命令检查ICMP消息速率的限制。
```
sysctl -q net.ipv4.icmp_ratelimit
```
默认值为：1000
```
sysctl -q net.ipv4.icmp_ratemask
```
默认值为：6168
请确认第一条命令返回值为默认值或0，并用以下命令放开port unreachable消息产生的速率限制。
```
sysctl -w net.ipv4.icmp_ratemask=6160
```
更详细的信息请参考Linux Programmer's Manual相关页面：
```
man 7 icmp
```
或者访问地址：https://man7.org/linux/man-pages/man7/icmp.7.html
![](https://support.huaweicloud.com/elb_faq/public_sys-resources/note_3.0-zh-cn.png)
放开port unreachable类型ICMP消息的速率限制，会让暴露在公网上的服务器在端口扫描时，不受限制次数地产生port unreachable消息。
#### 注意事项
使用UDP协议注意以下事项：
- 负载均衡健康检查是通过UDP报文和Ping报文探测来获取后端服务器的状态信息。针对此种情况，用户需要确保后端服务器开启ICMP协议，确认方法如下： 用户登录后端服务器，以root权限执行以下命令：
  **cat /proc/sys/net/ipv4/icmp_echo_ignore_all**
  若返回值为1，表示ICMP协议关闭；若为0，则表示开启。
  
- 当前UDP协议服务健康检查可能存在服务真实状态与健康检查不一致的问题： 如果后端服务器是Linux服务器，在大并发场景下，由于Linux的防ICMP攻击保护机制，会限制服务器发送ICMP的速度。此时，即便服务器已经出现异常，但由于无法向前端返回"port XX unreachable"报错信息，会导致负载均衡由于没收到 ICMP 应答进而判定健康检查成功，最终导致服务真实状态与健康检查不一致。
  
 
